Este é um exemplo do Pyomo, para um modelo concreto.
Porém, uma vantagem bastante grande é que os dados podem vir em listas e dicionários do Python, e as regras da função objetivo e restrições podem ser escritas como funções do Python.
Como os projetos normalmente serão de tamanho médio, eu acho este o método mais interessante, por manipular via Python o arquivo inteiro.
Projetos muito mais pesados teriam que ser resolvidos com solvers mais poderosos, como o CPLEX, e aí a coisa muda de nível – é melhor usar AIMMS ou algo mais robusto, até para fins de debug.
A ideia deste exercício é resolver o problema da cobertura de conjuntos, utilizando o Pyomo (http://www.pyomo.org/) e o OpenSolver (www.opensolver.org).
O Set cover é o problema de cobertura de conjuntos.
Tenho uma quantidade de elementos, digamos 50.
E tenho uma quantidade de conjuntos, digamos 15.
Cada conjunto tem um preço (abaixo está como peso), e cada conjunto contém os elementos.
Algumas aplicações: imagine que há várias doenças, e uma série de vacinas. Cada vacina cobre um conjunto diferente de doenças, e cada vacina tem um custo. Minimizar o custo total, cobrindo todas as doenças.
Open Solver:
Variável de decisão binária: utilizo ou não o conjunto.
Função objetivo: se utilizo o conjunto, é o preço deste.
Restrição: devo cobrir todos os elementos.
Resultado: FO de 223 e as escolhas pintadas em rosa.
Para cada elemento, ele deve pertencer a um conjunto, ou seja, a soma do produto da matriz de alocação e a variável de decisão devem ser maior do que 1.
def constrAlocacao(model, e):
return sum(model.AtivaSet[s]*Malocacao[e][s] for s in model.S) >= 1