Softwares de Otimização Introdução Pacotes de otimização são ferramentas para modelagem e resolução de problema de Programação Linear, Programação Linear Inteira, Programação Não Linear ... Os pacotes adotam linguagens especificação dos problemas. de modelagem para Fornecem ao programador interfaces para linguagens de programação (C, C++, Java, Python, etc. ). Possibilitam a geração de relatórios para avaliação dos resultados. Introdução Dados Solver Modelo Solução Exemplos de Solvers: IBM CPLEX ● Mais conhecido, rápido, robusto, interfaces amigáveis; ● Suporte a: C, C++, C#, Java e Python; ● Licença: Software proprietário; ● Academic Initiative: Temos acesso. Gorubi ● Suporte a: C, C++, Java, .NET e Python; ● Linguagem de modelagem: AIMMS, AMPL, GAMS, e MPL. ● Licença: Software proprietário Exemplos de Solvers: GNU Linear Programming Kit (GLPK) ● Suporte a: C, C++, Java ● Linguagem de modelagem: GAMS e GMPL (Subconjunto de AMPL). ● Licença: Software Livre. Outros: XPRESS, Mosek, CERES, etc. Solvers: benchmark Figura. 1. Resultados extraídos de: http://plato.asu.edu/ftp/milpf.html Apresentaremos: Linguagem de modelagem: AMPL(GMPL) linguagens de programação: C/C++ Solvers: GLPK e Cplex Arquivo de dados Arquivo com modelo Solução e Relatórios AMPL(GMPL) Instância Solução Solver AMPL(GMPL) Modelos AMPL envolvem variáveis, restrições, objetivos, parâmetros e conjuntos. É uma linguagem case sensitive: faz distinção entre maiúscula e minuscula. ● Expressões terminam com ponto e vírgula. Ex.: minimize obj: sum{j in Foods} cost[j]*quantity[j]; ● Strings são delimitadas por aspas simples ou duplas. Ex.: ‘This is a string’, "This is another string" ● Comentários são definidos por: # ou /* e */ Ex.: # isso é um comentário /* isso é outro comentário. */ GMPL e GLPK ● Conjuntos: Ex: set V = {1, 2, 3, 4, 5}; set A = {‘v1’, ‘v2’, ‘v3’, ‘v4’, ‘v5’}; set Foods; ● Parâmetros: qualquer valor para uma instância de determinado problema. Ex.: param c {i in V, j in V: i!= j } >= 0; param cost{Foods} >= 0; ● Declaração de variáveis: Ex.: var x >= 0 <= 20; var x {i in V, j in V: i != j} binary; var quantity{Foods} >= 0; GMPL e GLPK Declaração das restrições Ex.: subject to { <desigualdade 1>; <desigualdade 2>; } ou suject to cardinality: sum {e in E} x[e] = n-1; subject to blue_limit: 0 <= PaintB <= 1000; ou s.t. minnutr{i in Nutrients}: sum{j in Foods} amount[i,j]*quantity[j] >= minimum[i]; GMPL e GLPK Declaração da função objetivo maximize (minimize) <nome>: <função> Ex.: maximize obj: sum{j in V} cost[j]*x[j]; or minimize obj: sum{j in V} cost[j]*x[j]; Exemplo: Problema da Dieta Uma maçã contém: 5 unidades do nutriente A - 5 unidades do nutriente B 10 unidades do nutriente C - Custa R$ 2,00 Um pão contém: 2 unidades do nutriente A - 10 unidades do nutriente B 1 unidade do nutriente C - Custa R$ 1,00. Um doce contém: 3 unidades do nutriente A - Custa R$0,20. Preciso ingerir: 30 unidades do nutriente A 50 unidades do nutriente B 30 unidades do nutriente C Quantas unidades de maçã, pão ou doce eu compro para satisfazer a dieta com o menor custo? Exemplo: Problema da Dieta (dados) set Foods := apples, breads, candies; set Nutrients := nutrient _a, nutrient_b, nutrient_c; param cost := apples 2 breads 1 candies 0.2; param amount: apples breads candies := nutrient_a 5 2 3 nutrient_b 5 10 0 nutrient_c 10 1 0; param minimum := nutrient_a 30 nutrient_b 50 nutrient_c 30; end; Arquivo: ‘dieta.data’ Exemplo: Problema da Dieta (modelo) # Declare sets set Foods; set Nutrients; # Declare variables var quantity{Foods} >= 0; Executar. glpsol --model dieta.mod \ --data dieta.data \ --output dieta.sol # Declare parameters param cost{Foods} >= 0; param amount{Nutrients, Foods} >= 0; param minimum{Nutrients} >= 0; # Objective function minimize obj: sum{j in Foods} cost[j]*quantity[j]; # Declare constraints s.t. minnutr{i in Nutrients}: sum{j in Foods} amount[i,j]*quantity[j] >= minimum[i]; end; Arquivo: ‘dieta.mod’ Glpk e C/C++ Maximize obj: x1 + 2 x2 + 3 x3 + x4 Subject To c1: - x1 + x2 + x3 + 10 x4 <= 20 c2: x1 - 3 x2 + x3 <= 30 c3: x2 - 3.5 x4 = 0 Bounds 0 <= x1 <= 40 2 <= x4 <= 3 General x2, x3 End Glpk e C/C++