DAS-9011
1 / 62
AMPL: A Mathematical Programming Language
Eduardo Camponogara
Departamento de Automação e Sistemas
Universidade Federal de Santa Catarina
DAS-9011: Métodos de Otimização
DAS-9011
Sumário
Introdução
Modelo LP Geral
Conjuntos
Variáveis e Parâmetros Bi-Dimensionais
Programação Inteira
Programação Não-Linear
Modelo AMPL do Problema de Fluxo em Redes
2 / 62
DAS-9011
Introdução
Sumário
Introdução
Modelo LP Geral
Conjuntos
Variáveis e Parâmetros Bi-Dimensionais
Programação Inteira
Programação Não-Linear
Modelo AMPL do Problema de Fluxo em Redes
3 / 62
DAS-9011
4 / 62
Introdução
Introdução
◮
AMPL é uma linguagem de alto nı́vel para especificação de
problemas de programação matemática.
◮
AMPL permite que o modelo seja especificado separadamente
dos dados
◮
É muito semelhante a forma que expressamos problemas
◮
O usuário fica livre da manipulação de dados
DAS-9011
Introdução
AMPL
5 / 62
DAS-9011
6 / 62
Introdução
AMPL
◮
AMPL precisa de um modelo em programação matemática,
que especifica variáveis, objetivo e restrições
◮
Também precisa de uma instância de dados
◮
Um modelo e um ou mais arquivos de dados são alimentados
ao software
◮
AMPL funciona como um compilador
DAS-9011
7 / 62
Introdução
Exemplo
◮
Uma companhia produz tinta em duas cores, azul e verde.
◮
Um litro de tinta azul custa R$ 10,00
◮
Um litro de tinta verde custa R$ 15,00
◮
A companhia possui uma fábrica e produz apenas uma cor de
cada vez
◮
Tinta azul é mais fácil de ser produzida. São produzidos 40
litros em uma hora
◮
Tinta verde é mais complicada. São produzidos 30 litros por
hora
DAS-9011
8 / 62
Introdução
Exemplo
◮
De acordo com estatı́sticas de mercado, a empresa pode
vender 860 litros de tinta verde e 1000 litros de tinta azul
◮
Em uma semana, a fábrica pode operar por 40 horas
◮
Tinta não pode ser armazenada
◮
Quantos litros de tinta, de cada cor, devem ser produzidos de
forma a maximizar o faturamento?
DAS-9011
9 / 62
Introdução
Formulação
max 10 azul + 15 verde
S.a :
(1/40)azul + (1/30)verde ≤ 40
0 ≤ azul ≤ 1000
0 ≤ verde ≤ 860
DAS-9011
Introdução
Modelo AMPL
## Exemplo 1
var azul; # litros azul
var verde; # litros verde
maximize lucro: 10*azul + 15*verde;
subject to tempo: (1/40)*azul + (1/30)*verde <= 40;
subject to limite azul: 0 <= azul <= 1000;
subject to limite verde: 0 <= verde <= 860;
10 / 62
DAS-9011
11 / 62
Introdução
Resolvendo no NEOS
◮
Arquivo com modelo “tinta.mod”
◮
Arquivo de comandos “tinta.cmd”
solve;
display lucro;
display azul, verde;
DAS-9011
Modelo LP Geral
Sumário
Introdução
Modelo LP Geral
Conjuntos
Variáveis e Parâmetros Bi-Dimensionais
Programação Inteira
Programação Não-Linear
Modelo AMPL do Problema de Fluxo em Redes
12 / 62
DAS-9011
13 / 62
Modelo LP Geral
Modelo LP Geral
◮
Foi relativamente fácil especificar o modelo anterior no
formato AMPL
◮
Contudo, se os problemas se tornam mais complexos, ou são
modificados frequentemente, as tarefas se tornam mais
complexas
◮
Por esta razão, tipicamente preferimos uma especificação
algébrica genérica para modelos de programação linear
DAS-9011
14 / 62
Modelo LP Geral
Modelo LP Geral
Dados:
◮
n = número de tintas
◮
t = tempo total disponı́vel
◮
pi = lucro por litro de tinta de cor i, i = 1, . . . , n
◮
ri = litros por hora da tinta de cor i, i = 1, . . . , n
◮
mi = demanda máxima da tinta de cor i, i = 1, . . . , n
◮
xi = litros produzidos de tinta de cor i, i = 1, . . . , n
DAS-9011
Modelo LP Geral
Modelo LP Geral
Variáveis:
xi = litros a serem produzidos de tinta de cor i, i = 1, . . . , n
15 / 62
DAS-9011
16 / 62
Modelo LP Geral
Modelo LP Geral
Objetivo:
max
n
X
i=1
p i xi
DAS-9011
17 / 62
Modelo LP Geral
Modelo LP Geral
Restrições:
n
X
(1/ri )xi ≤ t
i=1
0 ≤ xi ≤ mi , i = 1, . . . , n
DAS-9011
18 / 62
Modelo LP Geral
Modelo LP Geral
Modelo básico
◮
n = 2 e t = 40
◮
p1 = 10 e p2 = 15
◮
r1 = 40 e r2 = 30
◮
m1 = 1000 e m2 = 860
DAS-9011
Modelo LP Geral
Modelo AMPL
## Modelo – exemplo 2
param n;
param t;
param p{i in 1..n};
param r{i in 1..n};
param m{i in 1..n};
var tinta{i in 1..n};
maximize lucro: sum{i in 1..n} p[i]*tinta[i];
subject to tempo: sum{i in 1..n} (1/r[i])*tinta[i] <= t;
subject to capacidade{i in 1..n}: 0 <= tinta[i] <= m[i];
19 / 62
DAS-9011
Modelo LP Geral
Dados AMPL
## Exemplo 2 - Dados
param n := 2;
param t := 40;
param p := 1 10
2 15;
param r := 1 40
2 30;
param m := 1 1000
2 860;
20 / 62
DAS-9011
21 / 62
Modelo LP Geral
Dados AMPL – Outra Maneira
## Exemplo 2 – Outra forma de especificar dados
param n := 2;
param t := 40;
param:
p r m :=
1 10 40 1000
2 15 30 860;
DAS-9011
Conjuntos
Sumário
Introdução
Modelo LP Geral
Conjuntos
Variáveis e Parâmetros Bi-Dimensionais
Programação Inteira
Programação Não-Linear
Modelo AMPL do Problema de Fluxo em Redes
22 / 62
DAS-9011
23 / 62
Conjuntos
Conjuntos
◮
Nas seções acima, tivemos que lembrar que o ı́ndice 1 indicava
azul e 2 indicava verde
◮
Alternativamente, podemos utilizar nomes para referenciar as
tintas
DAS-9011
Conjuntos
Conjuntos
## Exemplo 2 – Modelo com conjuntos
set P;
param t;
param p{i in P};
param r{i in P};
param m{i in P};
var tinta{i in P};
maximize lucro: sum{i in P} p[i]*tinta[i];
subject to tempo: sum{i in P} (1/r[i])*tinta[i] <= t;
subject to capacidade{i in P}: 0 <= tinta[i] <= m[i];
24 / 62
DAS-9011
25 / 62
Conjuntos
Conjuntos
Comparando com a versão do modelo original, verificamos que eles
são similares. Contudo, há algumas diferenças:
◮
Em vez de definir o número de elementos n, simplismente
definimos o conjunto
◮
Em vez de indexar os parâmetros com ı́ndices 1 . . . n, usamos
os nomes dos membros do conjunto
DAS-9011
Conjuntos
Arquivo de Dados
## Exemplo 2 - Dados definidos por conjuntos
set P := azul verde;
param t := 40;
param p := azul 10
verde 15;
param r := azul 40
verde 30;
param m := azul 1000
verde 860;
26 / 62
DAS-9011
27 / 62
Conjuntos
Arquivo de Dados – Outra Forma
## Exemplo 2 - Outra forma de escrever os dados
set P := azul verde;
param t := 40;
param:
p r m :=
azul 10 40 1000
verde 15 30 860;
DAS-9011
Variáveis e Parâmetros Bi-Dimensionais
Sumário
Introdução
Modelo LP Geral
Conjuntos
Variáveis e Parâmetros Bi-Dimensionais
Programação Inteira
Programação Não-Linear
Modelo AMPL do Problema de Fluxo em Redes
28 / 62
DAS-9011
29 / 62
Variáveis e Parâmetros Bi-Dimensionais
Variáveis e Parâmetros Bi-Dimensionais
◮
Um modelo em programação matemática pode ter variáveis e
parâmetros bi-dimensionais
◮
Podemos escrever tais parâmetros em uma tabela
◮
AMPL permite que dados sejam especificados em tabelas
DAS-9011
30 / 62
Variáveis e Parâmetros Bi-Dimensionais
Variáveis e Parâmetros Bi-Dimensionais
Exemplo
◮
A fábrica de tintas agora tem três depósitos com tinta azul
◮
A cada semana, tinta deve ser distribuı́da a quatro clientes
◮
Para cada depósito e cliente, o custo de transporte de um litro
de tinta é diferente
◮
Os custos de transporte são dados na tabela a seguir
DAS-9011
31 / 62
Variáveis e Parâmetros Bi-Dimensionais
Tabela com Custos de Transporte
Depósito 1
Depósito 2
Depósito 3
Cliente 1
1
3
2
Cliente 2
2
5
2
Cliente 3
1
1
2
Cliente 4
3
4
2
DAS-9011
32 / 62
Variáveis e Parâmetros Bi-Dimensionais
Estoque de Tinta Azul
Depósito 1
Depósito 2
Depósito 3
Estoque
250
800
760
DAS-9011
33 / 62
Variáveis e Parâmetros Bi-Dimensionais
Demanda de Tinta Azul dos Clientes
Cliente
Cliente
Cliente
Cliente
1
2
3
4
Demanda
300
320
800
390
DAS-9011
Variáveis e Parâmetros Bi-Dimensionais
Modelo AMPL
## Exemplo 3 – Modelo
param depositos; # número de depósitos
param clientes; # número de consumidores
# Custo de transporte do depósito i
# para cliente j
param custo{i in 1..depositos, j in 1..clientes};
param estoque{i in 1..depositos}; # estoque depósito i
param demanda{j in 1..clientes}; # demanda cliente j
var qt{i in 1..depositos, j in 1..clientes};
34 / 62
DAS-9011
Variáveis e Parâmetros Bi-Dimensionais
Modelo AMPL
minimize Custo:
sum{i in 1..depositos, j in 1..clientes} custo[i,j]*qt[i,j];
subject to Estoque {i in 1..depositos}:
sum{j in 1..clientes} qt[i,j] = estoque[i];
subject to Demanda {j in 1..clientes}:
sum{i in 1..depositos} qt[i,j] = demanda[j];
subject to Positivo {i in 1..depositos, j in 1..clientes}:
qt[i,j]>=0;
35 / 62
DAS-9011
36 / 62
Variáveis e Parâmetros Bi-Dimensionais
Dados AMPL
## Exemplo 3 - Dados
param depositos := 3;
param clientes := 4;
param custo:
1
2
3
param estoque :=
1 250
2 800
3 760;
1
1
3
2
2
2
5
2
3
1
1
2
4 :=
8
4
2;
DAS-9011
37 / 62
Variáveis e Parâmetros Bi-Dimensionais
Observações
◮
Cuidado deve ser tomado ao se especificar dados
◮
Observe o ponto-e-vı́rgula após cada nome
◮
Note que o primeiro ı́ndice (depósito) está na linha, enquanto
o segundo ı́ndice (cliente) está na coluna
DAS-9011
Variáveis e Parâmetros Bi-Dimensionais
Modelo AMPL – Usando Conjuntos
## Exemplo 3 – Modelo com conjuntos
set Depositos;
set Clientes;
# Custo de transporte do depósito i
# para cliente j
param custo{i in Depositos, j in Clientes};
param estoque{i in Depositos}; # estoque depósito i
param demanda{i in Clientes}; # demanda cliente j
var qt{i in Depositos, j in Clientes} >= 0;
38 / 62
DAS-9011
Variáveis e Parâmetros Bi-Dimensionais
Modelo AMPL – Usando Conjuntos
minimize Custo:
sum{i in Depositos, j in Clientes} custo[i,j]*qt[i,j];
subject to Estoque {i in Depositos}:
sum{j in Clientes} qt[i,j] = estoque[i];
subject to Demanda {j in Clientes}:
sum{i in Depositos} qt[i,j] = demanda[j];
39 / 62
DAS-9011
40 / 62
Variáveis e Parâmetros Bi-Dimensionais
Dados AMPL – Usando Conjuntos
## Exemplo 3 - Dados com conjuntos
set Depositos := Rio Fpolis Brasilia;
set Clientes := Petrobras Embraer UFSC USP;
param custo:
Petrobras
Rio
1
Fpolis
3
Brasilia 2
Embraer
2
5
2
UFSC
1
1
2
USP :=
3
4
2;
DAS-9011
41 / 62
Variáveis e Parâmetros Bi-Dimensionais
Dados AMPL – Usando Conjuntos
## Exemplo 3 - Dados com conjuntos
param estoque := Rio
250
Fpolis 800
Brasilia 760;
param demanda := Petrobras
Embraer
UFSC
USP
300
320
800
390;
DAS-9011
Programação Inteira
Sumário
Introdução
Modelo LP Geral
Conjuntos
Variáveis e Parâmetros Bi-Dimensionais
Programação Inteira
Programação Não-Linear
Modelo AMPL do Problema de Fluxo em Redes
42 / 62
DAS-9011
43 / 62
Programação Inteira
Programação Inteira
◮
Um modelo de programação matemática frequentemente
exige que algumas (ou todas) as variáveis sejam inteiras
◮
AMPL permite a especificação de variáveis inteiras
◮
Como ilustração, suponha que a empresa de tintas deseja
expandir a capacidade de armazenamento
◮
Contudo, esta expansão traz custos. Além dos custos de
transporte, a empresa terá um custo fixo para instalação de
um novo depósito.
DAS-9011
Programação Inteira
Localização de Instalações
As capacidades dos possı́veis depósitos são:
Depósito 1 550
Depósito 2 1100
Depósito 3 1060
Os custos de instalação destes depósitos são:
Depósito 1 500
Depósito 2 500
Depósito 3 500
44 / 62
DAS-9011
Programação Inteira
Modelo AMPLs
## Exemplo 4 – Instalação de depósitos
set Depositos;
set Clientes;
# Custo de transporte do depósito i
# para cliente j
param custo{i in Depositos, j in Clientes};
param estoque{i in Depositos}; # estoque depósito i
param custo fixo{i in Depositos}; # custo intalação depósito i
param demanda{j in Clientes}; # demanda cliente j
var qt{i in Depositos, j in Clientes} >= 0;
var abrir{i in Depositos} binary; # abrir[i]=1 se instala depósito i
# abrir[i]=0 se não instala depósito i
45 / 62
DAS-9011
Programação Inteira
Modelo AMPL – Usando Conjuntos
minimize Custo:
sum{i in Depositos, j in Clientes} custo[i,j]*qt[i,j] +
sum{i in Depositos} custo fixo[i]*abrir[i];
subject to Estoque {i in Depositos}:
sum{j in Clientes} qt[i,j] <= estoque[i]*abrir[i];
subject to Demanda {j in Clientes}:
sum{i in Depositos} qt[i,j] = demanda[j];
46 / 62
DAS-9011
47 / 62
Programação Inteira
Dados AMPL – Usando Conjuntos
## Exemplo 4 - Dados
set Depositos := Rio Fpolis Brasilia;
set Clientes := Petrobras Embraer UFSC USP;
param custo:
Petrobras
Rio
1
Fpolis
3
Brasilia 2
Embraer
2
5
2
UFSC
1
1
2
USP :=
3
4
2;
DAS-9011
48 / 62
Programação Inteira
Dados AMPL – Usando Conjuntos
## Exemplo 4 - Dados
param estoque := Rio
550
Fpolis 1100
Brasilia 1060;
param demanda := Petrobras
Embraer
UFSC
USP
300
320
800
390;
param custo fixo := Rio
500
Fpolis 500
Brasilia 500;
DAS-9011
Programação Não-Linear
Sumário
Introdução
Modelo LP Geral
Conjuntos
Variáveis e Parâmetros Bi-Dimensionais
Programação Inteira
Programação Não-Linear
Modelo AMPL do Problema de Fluxo em Redes
49 / 62
DAS-9011
50 / 62
Programação Não-Linear
Modelos Não-Lineares
◮
Muitos modelos de programação matemática incluem funções
não-lineares, na forma de restrições e objetivos.
◮
AMPL também pode fazer a interface com solvers de
programação não-linear, tais como Minos e Conopt.
◮
Como ilustração considere o modelo de otimização de
portofolio.
◮
Suponha que existe um conjunto A de investimentos.
◮
Conhecemos o retorno esperado R de cada um destes
investimentos para um perı́odo de T anos.
DAS-9011
51 / 62
Programação Não-Linear
Modelos Não-Lineares
◮
A partir destes dados, podemos calcular a matriz de
covariância dos investimentos.
◮
Desejamos maximizar o retorno esperado sujeito a uma taxa
de risco máxima.
◮
Desejamos minimizar o risco sujeito a um retorno mı́nimo
DAS-9011
Programação Não-Linear
Modelos Não-Lineares
## Exemplo 5 - Otimização Portofolio
set A; # investimentos
set T := 1984..1994; # anos
param s max default 0.00305;
# i.e., 5.522 por cento de desvio padrão no retorno
param R {T,A};
param media {j in A} := ( sum{i in T} R[i,j] )/card(T);
param Rt {i in T, j in A} := R[i,j] - media[j];
var share{A} >=0;
52 / 62
DAS-9011
53 / 62
Programação Não-Linear
Modelos Não-Lineares
## Exemplo 5 - Otimização Portofolio
minimize retorno: - sum{j in A} media[j]*share[j];
subject to limite risco:
sum{i in T} (sum{j in A} Rt[i,j]*share[j])2 / card(T) <= s max;
subject to total investimento:
sum{j in A} share[j] = 1;
DAS-9011
54 / 62
Programação Não-Linear
Modelos Não-Lineares
Observações
◮
A variável share indica a fração dos recursos utilizados em
cada investimento.
◮
A taxa de retorno esperada é:
X
mediaj sharej
j∈A
◮
O risco esperado é dado por:
P
X j∈A (Rtj ∗ sharej )2
i∈T
◮
card(T )
O problema de otimização de portofolio tem objetivo linear e
restrições quadráticas.
DAS-9011
55 / 62
Programação Não-Linear
Modelos Não-Lineares
## Exemplo 5 - Dados
set A := BR MES US LONG BONDS SP 500 BOVESPA;
param R:
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
BR MES
1.103
1.080
1.063
1.061
1.071
1.087
1.080
1.057
1.036
1.031
1.045
US LONG BONDS SP 500
1.159
1.061
1.366
1.316
1.309
1.186
0.925
1.052
1.086
1.165
1.212
1.316
1.054
0.968
1.193
1.304
1.079
1.076
1.217
1.100
0.889
1.012
BOVESPA :=
1.030
1.326
1.161
1.023
1.179
1.292
0.938
1.342
1.090
1.113
0.999;
DAS-9011
56 / 62
Programação Não-Linear
Modelos Não-Lineares
◮
Modelos não-lineares apresentam várias dificuldades e
sutilezas:
◮
◮
◮
◮
Violação das regiões nas quais as funções estão definidas
(valores vão para o ∞)
Múltiplos ótimos locais
Pontos estacionários
Vamos estudar otimização não-linear mais à frente
DAS-9011
57 / 62
Programação Não-Linear
Modelos Não-Lineares
◮
Muitas vezes, buscando encontrar melhores soluções somos
obrigados a otimizar a partir de diferentes pontos iniciais
◮
Isto pode ser especificado com a declaração opcional “:=”
◮
Escrevemos
x[A] >=0; := 0.25;
para inicializar o vetor com o valor 0.25
◮
O solver irá utilizar estes valores como ponto de partida
DAS-9011
Modelo AMPL do Problema de Fluxo em Redes
Sumário
Introdução
Modelo LP Geral
Conjuntos
Variáveis e Parâmetros Bi-Dimensionais
Programação Inteira
Programação Não-Linear
Modelo AMPL do Problema de Fluxo em Redes
58 / 62
DAS-9011
59 / 62
Modelo AMPL do Problema de Fluxo em Redes
Modelo AMPL
# Modelo AMPL para fluxo em redes custo mı́nimo
set NOS; # nós da rede
set ARCOS within {NOS, NOS}; # arcos da rede
param
param
param
param
b {NOS} default 0; # suprimento/consumo do nó i
c {ARCOS} default 0; # custo do arco (i,j)
l {ARCOS} default 0; # limite inferior do arco (i,j)
u {ARCOS} default Infinity; # limite superior do arco arc(i,j)
var x {ARCOS}; # fluxo no arco (i,j)
DAS-9011
Modelo AMPL do Problema de Fluxo em Redes
Modelo AMPL
# Modelo AMPL para fluxo em redes custo mı́nimo
minimize Custo: sum{(i,j) in ARCOS} c[i,j] * x[i,j];
# Flow Out(i) - Flow In(i) = b(i)
subject to equilibrio massa {i in NOS}:
sum{j in NOS: (i,j) in ARCOS} x[i,j]
- sum{j in NOS: (j,i) in ARCOS} x[j,i] = b[i];
subject to capacidade {(i,j) in ARCOS}:
l[i,j] <= x[i,j] <= u[i,j];
60 / 62
DAS-9011
61 / 62
Modelo AMPL do Problema de Fluxo em Redes
Dados AMPL
set NOS := 1 2 3 4;
set ARCOS := (1,2) (1,3) (2,3) (2,4) (3,4);
param b := 1
2
3
4
#
param:
1
1
2
2
3
5
-2
0
-3;
cost lower
c l
2
3 2
3
2 0
3
1 0
4
4 1
4
4 0
upper bound
u :=
5
2
2
3
3;
DAS-9011
62 / 62
Modelo AMPL do Problema de Fluxo em Redes
AMPL
◮
Fim!
◮
Obrigado pela participação
Download

AMPL: A Mathematical Programming Language