Softwares de Otimização

Propaganda
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++
Download