AULA 8
GLPK – GNU Linear Programming Kit
Autor: Anibal Tavares de Azevedo
PESQUISA OPERACIONAL
GLPK – GNU Linear Programming Kit
É um pacote de rotinas escritas em linguagem
ANSI C
e organizadas na forma de uma
biblioteca com funções que podem resolver
problemas de:
● Programação Linear de grande porte
e
● Problemas de Programação Inteira mista
.
O pacote GLPK incluiu os seguintes métodos
principais:
● Métodos primal e dual Simplex
,
● Método de Pontos Interiores Primal-Dual
,
Além
disso,
o
GLPK
suporta a
GNU MathProg
Modeling Language
que
é um subconjunto da
linguagem
AMPL
.
AMPL –
A Mathematical Programming Language
A
AMPL
é um acrônimo para
“A Mathematical
Programming Language”
é um
linguagem algébrica
de
modelagem
para
descrever
e
resolver
problemas de modelagem matemática. O AMPL
suporta dezenas de solvers: CPLEX, MINOS, Gurobi,
IPOPT, SNPOT e KNITRO. É utilizado por agências do
governo e instituições acadêmicas. Sua principal
vantagem é que sua sintaxe é
similar à notação
usada em problemas de otimização
.
NEOS –
Network-Enable Optimization System Server
O NEOS (Network-Enable Optimization System)
Server é um
serviço gratuito
baseado em
internet para a
resolução de problemas de
otimização
. Os solvers disponíveis representam
o que há de estado da arte em softwares de
otimização. O NEOS fornece um tratamento
simples
para uma
grande variedade de
problemas de otimização e várias interfaces para
os solvers
.
GLPK Lab for Windows
1
GLPK Lab for Windows
1
2
3
4
GLPK Lab for Windows
5
???
7
EXERCÍCIO
1:
Em
uma
fábrica
deve
ser
decidido
a
quantidade de produção x
1e x
2de dois produtos P1 e P2. O
lucro com o produto P1 é de R$ 5,00 por unidade e do
produto P2 é de R$ 2,00 por unidade. Existe uma máquina
para processar apenas o produto P1 cuja capacidade máxima
é de 3 unidades de tempo e para o produto P2, 4 unidades.
Nestas duas máquinas gasta-se 1 unidade de tempo para
processar 1 produto. Existe uma máquina capaz de processar
tanto o produto P1 como o produto P2 cuja capacidade
máxima de tempo é de 9 unidades de tempo. Assumindo que
nesta máquina o tempo para processar o produto P2 é o
dobro do gasto para processar o produto P1 e P1 gasta-se 1
unidade de tempo, pede-se:
(A) Formular o problema de otimização.
p
1
p
2
x
1
x
2
Máquina 1
3 unidades
de tempo
Máquina 2
4 unidades
de tempo
x
1
x
2
Máquina 3
9 unidades
de tempo
x
2x
1Tempo
1x
Tempo
2x
Tempo
1x
Tempo
1x
Formulação Matemática
Max Z=5x
1
+ 2x
2
S.a.: x
1
≤ 3
x
2
≤ 4
x
1
+ 2x
2
≤ 9
x
1
, x
2
≥ 0
Função Objetivo
Restrições
Variáveis
de
Decisão
Max Z=5x
1
+ 2x
2
S.a.: x
1
≤ 3
x
2
≤ 4
x
1
+ 2x
2
≤ 9
x
1
, x
2
≥ 0
Lucro por unidade
de cada produto
Restrições:
••••Tempo maq.1
••••
Tempo maq.2
••••Tempo maq.3
••••
não neg.
Quantidades
dos produtos
p
1
e p
2
4
x
2
3
(1,4)
(3,3)
Solução ótima
z =5x
1
+ 2x
2
=5*3+2*3
=21
GLPK Lab for Windows
/* Problema da Manufatura */ /* Variáveis de Decisão */ var x1 >=0; /* Quant. Prod. 1 */ var x2 >=0; /* Quant. Prod. 2 */
/* Função Objetivo */ maximize z: 5*x1 + 2*x2;
/* Restrições */ s.t. Maq1 : x1 <= 3; s.t. Maq2 : x2 <= 4; s.t. Maq3 : x1 + 2*x2 <= 9;
solve; printf '\n';
printf '---\n'; printf 'Prod1(x1) Prod2(x2) \n'; printf ' %5d %5d \n', x1, x2; printf '---\n'; printf ' Total(z): %10g\n', z; printf '\n‘;
end;
7
GLPK Lab for Windows
/* Problema da Manufatura */ /* Variáveis de Decisão */ var x1 >=0; /* Quant. Prod. 1 */ var x2 >=0; /* Quant. Prod. 2 */
/* Função Objetivo */ maximize z: 5*x1 + 2*x2;
/* Restrições */ s.t. Maq1 : x1 <= 3; s.t. Maq2 : x2 <= 4; s.t. Maq3 : x1 + 2*x2 <= 9;
solve; printf '\n';
printf '---\n'; printf 'Prod1(x1) Prod2(x2) \n'; printf ' %5d %5d \n', x1, x2; printf '---\n'; printf ' Total(z): %10g\n', z; printf '\n‘;
end;
7
Max z = 5x
1+ 2x
2S.a.: x
1≤ 3
x
2≤ 4
x
1+ 2x
2≤ 3
x
1, x
2≥ 0
1
2
3
4
/* Problema da Manufatura */ /* Variáveis de Decisão */ var x1 >=0; /* Quant. Prod. 1 */ var x2 >=0; /* Quant. Prod. 2 */
/* Função Objetivo */ maximize z: 5*x1 + 2*x2;
/* Restrições */ s.t. Maq1 : x1 <= 3; s.t. Maq2 : x2 <= 4; s.t. Maq3 : x1 + 2*x2 <= 9;
solve; printf '\n';
printf '---\n'; printf 'Prod1(x1) Prod2(x2) \n'; printf ' %5d %5d \n', x1, x2; printf '---\n'; printf ' Total(z): %10g\n', z; printf '\n‘;
end;
7
Imprime e Pula linha
Imprime contéudo de x1
%d – variável inteira.
%10g – variável real (dez dígitos).
GLPK Lab for Windows
EXERCÍCIO 1: OBTER A FORMULAÇÃO DOS MODELOS
MATEMÁTICOS,
DADOS
A
SEGUIR,
POR
MEIO
DO
GLPK.
Carteira de Investimentos
Max
+
+
+
+
+
100
20
,
0
100
13
,
0
100
09
,
0
100
12
,
0
100
095
,
0
100
087
,
0
P
1P
2P
3P
4P
5P
6S.a.:
P
1
+ P
2
+ P
3
+ P
4
+ P
5
+ P
6
= 100
P
1
≤
25;P
2
≤
25;P
3
≤
25;P
4
≤
25;P
5
≤
25;P
6
≤
25
P
3
+ P
5
+ P
6
≤
50
P
1
+ P
2
+ P
5
≥
50
P
1
, P
2
, P
3
, P
4
, P
5
, P
6
≥
0
MODELO COMPLETO
Min
N
1
+ N
2
+ N
3
+ N
4
+ N
5
+ N
6
+ N
7
S.a.:
N
1
+ N
4
+ N
5
+ N
6
+ N
7
≥
11
N
1
+ N
2
+ N
5
+ N
6
+ N
7
≥
18
N
1
+ N
2
+ N
3
+ N
6
+ N
7
≥
12
N
1
+ N
2
+ N
3
+ N
4
+ N
7
≥
15
N
1
+ N
2
+ N
3
+ N
4
+ N
5
≥
19
N
2
+ N
3
+ N
4
+ N
5
+ N
6
≥
14
N
3
+ N
4
+ N
5
+ N
6
+ N
7
≥
16
N
1
, N
2
, N
3
, N
4
, N
5
, N
6
, N
7
≥
0
MODELO COMPLETO
1
2
3
Achando a solução
ótima do problema
GLPK Lab for Windows
1
2
3
4
GLPK Lab for Windows
1
2
3
Gerando o relatório
do modelo
GLPK Lab for Windows
/* Problema da Manufatura */
set I; /* indice do conjunto de maquinas */
set J; /* indice do conjunto de produtos */
param b{i in I}, >= 0; /* disp. maq. */
param f; /* conversão R$-US$ */
param d{j in J}; /* coef. f.o. */
param A{i in I, j in J}, >= 0; /* Matriz maq i prod j */
param c{j in J} := f * d[j] * 1000; /* custos em R$-1 prod=US$1000 */
var x{j in J} >= 0; /* Variáveis de Decisão */
maximize z: sum{j in J} c[j] * x[j]; /* Função Objetivo */ s.t. Maq{i in I}: sum{j in J} A[i,j]*x[j] <= b[i]; /* Restrições */
solve;
7
/* RELATORIO */
printf '\n';
printf '---\n';
printf 'Prod1(x1) Prod2(x2) \n';
printf{j in J} " %5s = %5g \n ", j, x[j];
printf '---\n';
printf 'Total (z): %10g\n', sum{j in J} c[j] * x[j];
printf '\n'; /* SEÇÃO DE DADOS */ data;
set I:= Maq1 Maq2 Maq3;
set J:= Prod1 Prod2;
/*: Prod1 Prod2 :=*/
param A : Prod1 Prod2 := Maq1 1 0 Maq2 0 1 Maq3 1 2;
7
PARTE 2 - FORMULAÇÃO
GLPK Lab for Windows
/*Matriz de utilização das maquinas por produto */
param b := Maq1 3 Maq2 4 Maq3 9;
/*Vetor de lucro dos produtos */
param d := Prod1 5 Prod2 2;
/* Fator de conversão R$ - US$ */
param f := 2.04;
end;
GLPK Lab for Windows
/* Problema da Manufatura */
set I; /* indice do conjunto de maquinas */
set J; /* indice do conjunto de produtos */
param b{i in I}, >= 0; /* disp. maq. */
param f; /* conversão R$-US$ */
param d{j in J}; /* coef. f.o. */
param A{i in I, j in J}, >= 0; /* Matriz maq i prod j */
param c{j in J} := f * d[j] * 1000; /* custos em R$-1 prod=US$1000 */
var x{j in J} >= 0; /* Variáveis de Decisão */
maximize z: sum{j in J} c[j] * x[j]; /* Função Objetivo */ s.t. Maq{i in I}: sum{j in J} A[i,j]*x[j] <= b[i]; /* Restrições */
solve;
7
PARTE 1 - FORMULAÇÃO
FORMULAÇÃO + GERAL
Índices das variáveis
GLPK Lab for Windows
/* Problema da Manufatura */
set I; /* indice do conjunto de maquinas */
set J; /* indice do conjunto de produtos */
param b{i in I}, >= 0; /* disp. maq. */
param f; /* conversão R$-US$ */
param d{j in J}; /* coef. f.o. */
param A{i in I, j in J}, >= 0; /* Matriz maq i prod j */
param c{j in J} := f * d[j] * 1000; /* custos em R$-1 prod=US$1000 */
var x{j in J} >= 0; /* Variáveis de Decisão */
maximize z: sum{j in J} c[j] * x[j]; /* Função Objetivo */ s.t. Maq{i in I}: sum{j in J} A[i,j]*x[j] <= b[i]; /* Restrições */
solve;
7
PARTE 1 - FORMULAÇÃO
FORMULAÇÃO + GERAL
/* Problema da Manufatura */
set I; /* indice do conjunto de maquinas */
set J; /* indice do conjunto de produtos */
param b{i in I}, >= 0; /* disp. maq. */
param f; /* conversão R$-US$ */
param d{j in J}; /* coef. f.o. */
param A{i in I, j in J}, >= 0; /* Matriz maq i prod j */
param c{j in J} := f * d[j] * 1000; /* custos em R$-1 prod=US$1000 */
var x{j in J} >= 0; /* Variáveis de Decisão */
maximize z: sum{j in J} c[j] * x[j]; /* Função Objetivo */ s.t. Maq{i in I}: sum{j in J} A[i,j]*x[j] <= b[i]; /* Restrições */
solve;
7
PARTE 1 - FORMULAÇÃO
FORMULAÇÃO + GERAL
Variável de decisão
GLPK Lab for Windows
/* Problema da Manufatura */
set I; /* indice do conjunto de maquinas */
set J; /* indice do conjunto de produtos */
param b{i in I}, >= 0; /* disp. maq. */
param f; /* conversão R$-US$ */
param d{j in J}; /* coef. f.o. */
param A{i in I, j in J}, >= 0; /* Matriz maq i prod j */
param c{j in J} := f * d[j] * 1000; /* custos em R$-1 prod=US$1000 */
var x{j in J} >= 0; /* Variáveis de Decisão */
maximize z: sum{j in J} c[j] * x[j]; /* Função Objetivo */ s.t. Maq{i in I}: sum{j in J} A[i,j]*x[j] <= b[i]; /* Restrições */
7
FORMULAÇÃO + GERAL
GLPK Lab for Windows
/* Problema da Manufatura */
set I; /* indice do conjunto de maquinas */
set J; /* indice do conjunto de produtos */
param b{i in I}, >= 0; /* disp. maq. */
param f; /* conversão R$-US$ */
param d{j in J}; /* coef. f.o. */
param A{i in I, j in J}, >= 0; /* Matriz maq i prod j */
param c{j in J} := f * d[j] * 1000; /* custos em R$-1 prod=US$1000 */
var x{j in J} >= 0; /* Variáveis de Decisão */
maximize z: sum{j in J} c[j] * x[j]; /* Função Objetivo */ s.t. Maq{i in I}: sum{j in J} A[i,j]*x[j] <= b[i]; /* Restrições */
solve;
7
PARTE 1 - FORMULAÇÃO
FORMULAÇÃO + GERAL
Comando para
resolver o problema
GLPK Lab for Windows
/* RELATORIO */
printf '\n';
printf '---\n';
printf 'Prod1(x1) Prod2(x2) \n';
printf{j in J} " %5s = %5g \n ", j, x[j];
printf '---\n';
printf 'Total (z): %10g\n', sum{j in J} c[j] * x[j];
printf '\n'; /* SEÇÃO DE DADOS */ data;
set I:= Maq1 Maq2 Maq3;
set J:= Prod1 Prod2;
/*: Prod1 Prod2 :=*/
param A : Prod1 Prod2 := Maq1 1 0 Maq2 0 1 Maq3 1 2;
7
PARTE 2 - FORMULAÇÃO
Contéudo
vetor x[j]
/* RELATORIO */
printf '\n';
printf '---\n';
printf 'Prod1(x1) Prod2(x2) \n';
printf{j in J} " %5s = %5g \n ", j, x[j];
printf '---\n';
printf 'Total (z): %10g\n', sum{j in J} c[j] * x[j];
printf '\n'; /* SEÇÃO DE DADOS */ data;
set I:= Maq1 Maq2 Maq3;
set J:= Prod1 Prod2;
/*: Prod1 Prod2 :=*/
param A : Prod1 Prod2 := Maq1 1 0 Maq2 0 1 Maq3 1 2;
7
PARTE 2 - FORMULAÇÃO
Valores para a matriz A
de disponibilidade de
recursos
Definição dos valores dos
índices I (3) e J (2).
GLPK Lab for Windows
/*Matriz de utilização das maquinas por produto */
param b := Maq1 3 Maq2 4 Maq3 9;
/*Vetor de lucro dos produtos */
param d := Prod1 5 Prod2 2;
/* Fator de conversão R$ - US$ */
param f := 2.04;
end;
7
Demais valores:
Uma firma produz dois tipos de tintas: seca rápido
(SR) e superseca (SS).Ambas são produzidas a partir
de uma base de silicato de e de óleo de linhaça
vindas de duas soluções ou isoladamente:
Cada litro de SR requer,
no mínimo
, 25% de
silicato e 50% de óleo de linhaça e cada litro de SS
requer,
no mínimo
, 20% de silicato e,
no máximo
,
50% de óleo de linhaça. Formular o PPL e achar
quantos litros comprar de cada solução para
produzir 100 litros de SR e 250 litros de SS.
Problema de Mistura
Solução
Preço/litro
Silicato
Linhaça
A
R$ 0,50
60%
40%
B
R$ 0,75
30%
70%
Silicato
R$ 1,00
100%
0%
Linhaça
R$ 1,50
0%
100%
Solução A
Solução B
Linhaça
Silicato
Linhaça
Silicato
60%
40%
30%
70%
Solução A
Solução B
Linhaça
Silicato
Tinta SR
x
ar
x
br
x
lr
x
sr
Quantidade de
Solução A
para
produção da
Tinta SR
Quantidade de
Silicato
para
produção da
Tinta SR
Variáveis de Decisão:
Solução A
Solução B
Linhaça
Silicato
Tinta SR
Problema de Mistura
Tinta SS
Problema de Mistura
Solução A
Solução B
Linhaça
Silicato
x
as
x
bs
x
ls
x
ss
x
as
+ x
bs
+ x
ls
+ x
ss
= 250
Problema de Mistura
Solução
Preço/litro
Silicato
Linhaça
A
R$ 0,50
60%
40%
B
R$ 0,75
30%
70%
Silicato
R$ 1,00
100%
0%
Linhaça
R$ 1,50
0%
100%
Tinta SR
0,25(x
ar
+x
br
+x
lr
+x
sr
)
Solução A
Solução B
Silicato
Linhaça
0,6x
ar
0,3x
br
1,0x
sr
0,0x
lr
≥
Solução
Preço/litro
Silicato
Linhaça
A
R$ 0,50
60%
40%
B
R$ 0,75
30%
70%
Silicato
R$ 1,00
100%
0%
Linhaça
R$ 1,50
0%
100%
Tinta SR
0,50(x
ar
+x
br
+x
lr
+x
sr
)
Solução A
Solução B
Silicato
Linhaça
0,4x
ar
0,7x
br
0,0x
sr
1,0x
lr
≥
0,4x
ar
+ 0,7x
br
+ 1,0x
lr
≥
0,5(x
ar
+x
br
+x
lr
+x
sr
)
Problema de Mistura
Solução
Preço/litro
Silicato
Linhaça
A
R$ 0,50
60%
40%
B
R$ 0,75
30%
70%
Silicato
R$ 1,00
100%
0%
Linhaça
R$ 1,50
0%
100%
0,2(x
as
+x
bs
+x
ls
+x
ss
)
Solução A
Solução B
Silicato
Linhaça
0,6x
as
0,3x
bs
1,0x
ss
0,0x
ls
≥
Problema de Mistura
Solução
Preço/litro
Silicato
Linhaça
A
R$ 0,50
60%
40%
B
R$ 0,75
30%
70%
Silicato
R$ 1,00
100%
0%
Linhaça
R$ 1,50
0%
100%
0,50(x
as
+x
bs
+x
ls
+x
ss
)
Solução A
Solução B
Silicato
Linhaça
0,4x
as
0,7x
bs
0,0x
ss
1,0x
ls
≤
Tinta SS
0,4x
as
+ 0,7x
bs
+ 1,0x
ls
≤
0,5(x
as
+x
bs
+x
ls
+x
ss
)
Uma firma produz dois tipos de tintas: seca rápido
(SR) e superseca (SS).Ambas são produzidas a partir
de uma base de silicato de e de óleo de linhaça
vindas de duas soluções ou isoladamente:
Problema de Mistura
Solução
Preço/litro
Silicato
Linhaça
A
R$ 0,50
60%
40%
B
R$ 0,75
30%
70%
Silicato
R$ 1,00
100%
0%
Linhaça
R$ 1,50
0%
100%
Min
0,5(x
ar
+ x
as
) + 0,75(x
br
+ x
bs
) +
Min
0,5(x
ar
+ x
as
) + 0,75(x
br
+ x
bs
) +
1,0(x
sr
+ x
ss
) + 1,5(x
lr
+ x
ls
)
S.a.:
x
ar
+ x
br
+ x
lr
+ x
sr
= 100
x
as
+ x
bs
+ x
ls
+ x
ss
= 250
0,6x
ar
+ 0,3x
br
+ 1,0x
sr
≥
0,25(x
ar
+x
br
+x
lr
+x
sr
)
0,4x
ar
+ 0,7x
br
+ 1,0x
lr
≥
0,5 (x
ar
+x
br
+x
lr
+x
sr
)
0,6x
as
+ 0,3x
bs
+ 1,0x
ss
≥
0,2 (x
as
+x
bs
+x
ls
+x
ss
)
0,4x
as
+ 0,7x
bs
+ 1,0x
ls
≤
0,5 (x
as
+x
bs
+x
ls
+x
ss
)
x
ar
, x
br
, x
lr
, x
sr
, x
as
, x
bs
, x
ls
, x
ss
≥
0
MODELO COMPLETO
Min
0,5(x
ar
+ x
as
) + 0,75(x
br
+ x
bs
) +
1,0(x
sr
+ x
ss
) + 1,5(x
lr
+ x
ls
)
S.a.:
x
ar
+ x
br
+ x
lr
+ x
sr
= 100
x
as
+ x
bs
+ x
ls
+ x
ss
= 250
0,35x
ar
+ 0,05x
br
+ 0,75x
sr
- 0,25x
lr
≥
0
-0,1x
ar
+ 0,2x
br
-
0,5x
sr
+ 0,5x
lr
≥
0
0,4x
as
+ 0,1x
bs
+ 0,8x
ss
-
0,2x
ls
≥
0
-0,1x
as
+ 0,2x
bs
-
0,5x
ss
+ 0,5x
ls
≤
0
MODELO COMPLETO SIMPLIFICADO
Min
0,5(x
ar
+ x
as
) + 0,75(x
br
+ x
bs
) +
1,0(x
sr
+ x
ss
) + 1,5(x
lr
+ x
ls
)
S.a.:
x
ar
+ x
br
+ x
lr
+ x
sr
= 100
x
as
+ x
bs
+ x
ls
+ x
ss
= 250
0,35x
ar
+ 0,05x
br
+ 0,75x
sr
- 0,25x
lr
≥
0
-0,1x
ar
+ 0,2x
br
-
0,5x
sr
+ 0,5x
lr
≥
0
0,4x
as
+ 0,1x
bs
+ 0,8x
ss
-
0,2x
ls
≥
0
0,1x
as
-
0,2x
bs
+
0,5x
ss
-
0,5x
ls
≥
0
x
ar
, x
br
, x
lr
, x
sr
, x
as
, x
bs
, x
ls
, x
ss
≥
0
MODELO COMPLETO SIMPLIFICADO
Problema de Mistura
GLPK Lab for Windows
#MODELO DO PROBLEMA DAS TINTAS
set N1; /* volume das tintas */
set N2; /* composição das fontes */
set F; /* fontes */
param b1{N1}; /* req. vol. tintas*/
param b2{N2}; /* req. composição */
param c{F}; /* custos fontes */
param a1{F,N1};
param a2{F,N2}; /* rend. fontes por tinta */
var x{f in F} >= 0; /* custo fontes */ /* Balanço do volume de tintas (litros) */
s.t. nb1{n1 in N1}: sum{f in F} a1[f,n1] * x[f] = b1[n1]; nb2{n2 in N2}: sum{f in F} a2[f,n2] * x[f] >= b2[n2]; /* custo total fontes (reais) */
minimize cost: sum{f inF} c[f]*x[f];
solve;
PARTE 1 - FORMULAÇÃO
/* RELATORIO */
printf '\n';
printf '---\n';
printf 'Prod(x) \n';
printf{f in F} " %5s = %5g \n ", f, x[f];
printf '---\n';
printf 'Total (z): %10g\n', sum{f in F} c[f] * x[f];
printf '\n';
/* SECAO DE DADOS */
data;
set F := AR BR LR SR AS BS LS SS;
param : N1 : b1 :=
TintaSR 100 /* litros de SR */ TintaSS 250 /* litros de SS */ ;
param : N2 : b2 :=
SilicatoSR 0 /* silicato de SR */ LinhacaSR 0 /* linhanca de SR */ SilicatoSS 0 /* silicato de SS */
LinhacaSS 0 /* linhanca de SS */ ;
PARTE 2 - FORMULAÇÃO
GLPK Lab for Windows
param c := AR 0.5 BR 0.75 LR 1.5 SR 1.0 AS 0.5 BS 0.75 LS 1.5 SS 1.0;
param a1 default 0
GLPK Lab for Windows
param a2 default 0
: SilicatoSR LinhacaSR SilicatoSS LinhacaSS := # (litros) (litros) (litros) (litros) AR 0.35 -0.1 . . BR 0.05 0.2 . . LR -0.25 -0.5 . . SR 0.75 0.5 . . AS . . 0.4 0.1 BS . . 0.1 -0.2 LS . . 0.8 0.5 SS . . -0.2 -0.5;
end;