2  RESULTADOS

2.1 Instalação dos Pacotes

O pacote mip requer o Python 3.5 ou mais recente. Como o Python-MIP está incluído no Python Package Index , uma vez que você tenha uma instalação do Python, instalá-lo é tão fácil quanto digitar no prompt de comando:

2.1.1 Instalação via Python


#---------- Prompt de Comando ----------#
#pip install mip
#pip install mip --user
#---------------------------------------#

2.1.2 Instalação via R

#library(reticulate)
#py_install("mip")

2.2 Implementação do Problema da Mochila em Python

O pacote Mixed-Integer Linear Programming (MIP) é uma coleção de ferramentas Python para modelagem e solução de programas Lineares Inteiros Mistos (MIPs). A sintaxe MIP foi inspirada no pacote Pulp. Assim como o CyLP, ele também fornece acesso a recursos avançados do solver, como geração de corte, restrições preguiçosas, MIPstarts e pools de soluções. Portar modelos Pulp e Gurobi deve ser bem fácil.

2.2.1 Declarar as Constantes


#from mip import *

#RANDOM_SEED   = 1
#NUM_PRODUTOS  = 10
#NUM_MOCHILAS  = 2

2.2.2 Variáveis para Armazenar os Dados


#produtos = {}
#mochilas = {}
#gerar_produtos(produtos)
#gerar_mochilas(mochilas)

2.2.3 Imprimir Itens


#imprimir_produtos(produtos)
#imprimir_mochilas(mochilas)

2.2.4 Maximização Númérica


#modelo = Model(sense=MAXIMIZE)

2.2.5 Variáveis Decisão


#carga = {} # qual produto será colcoado em cada mochila

#for m in mochilas:
#    for p in produtos:
#        carga[(m, p)] = modelo.add_var(var_type=BINARY)  

2.2.6 Restrição


# a) O mesmo produto não pode ser colocado nas duas mochilas

#for p in produtos:        
#    modelo += xsum(carga[(m, p)] for m in mochilas) <= 1


# b) Soma dos pesos dos produtos alocados em uma mochila não devem ser maior do que a carga máxima suportada pela mochila


#for m in mochilas:    
#    modelo += xsum(carga[(m, p)] * produtos[p]['peso'] for p in produtos) <= mochilas[m]['carga_maxima']

2.2.7 Função Objetivo


#modelo.objective = maximize(
#    xsum(carga[(m, p)] * produtos[p]['valor']
#         for m in mochilas 
#             for p in produtos
#         if (m, p) in carga
#    )
#)

#modelo.optimize()

# Resultado

#print("\n=====")
#print("Valor Total em Todas as Mochilas {}".format(modelo.objective_values))
#print("=====")
#for m in mochilas:
#    print("\nCarga da Mochila {} com capacidade de {}g".format(m, mochilas[m]['carga_maxima']))
#    valor_total = 0
#    carga_total = 0
#    for p in produtos:
#        if (carga[(m, p)].x == 1):
#            valor_total += produtos[p]['valor']
#            carga_total += produtos[p]['peso']
#            print("{} \tR$ {},00 \t{}g".format(p, produtos[p]['valor'], produtos[p]['peso']))
    
#    print("-\nValor Total: R$ {},00 \nCarga Total: {}g\nCapacidade Ociosa: {}g".format(valor_total, carga_total, (mochilas[m]['carga_maxima']-carga_total)))

# GERAR PRODUTOS: (Peso e Valor Aleatório)
#def gerar_produtos(prod):
#    random.seed(RANDOM_SEED)
#    for i in range(NUM_PRODUTOS):
#        cod = 'p_{}'.format(i)
#        valor = random.choice(range(1,10))   # Valor em R$
#        peso = random.choice(range(100,999)) # Valor em gramas
#        prod[cod] = {
#            'valor': valor,
#            'peso': peso
#        }

# PRODUTOS
#def imprimir_produtos(prod):
#    print("PRODUTOS")
#    print("Cód \tValor \t\tPeso")
#    for p in prod:
#        print("{}\tR$ {},00 \t{}g".format(p, prod[p]['valor'], prod[p]['peso']))
        

# GERAR MOCHILAS: Pesos Aleatórios
#def gerar_mochilas(moc):
#    random.seed(RANDOM_SEED)
#    for i in range(NUM_MOCHILAS):
#        cod = 'm_{}'.format(i)
#        carga_maxima = random.choice(range(500,2000))   # Carga máxima em gramas
#        moc[cod] = {
#            'carga_maxima': carga_maxima
#        }
        

# MOCHILAS
#def imprimir_mochilas(moc):
#    print("\nMOCHILAS")
#    print("Cód \tCarga Máxima")
#    for m in moc:
#        print("{} \t{}g".format(m, moc[m]['carga_maxima']))