Programação Linear Inteira
GNU Linear Programming Kit
Eduardo Camargo de Siqueira Pesquisa Operacional
CONTEÚDO
1 Introdução
2 Formato LP
GLPK
GNU Linear Programming Kit.
Resolvedor de problemas lineares, incluindo problemas de pro-gramação inteira.
Código aberto, disponível gratuitamente. Farta documentação.
INSTALAÇÃO DO GLPK
Windows:
- http://gusek.sourceforge.net/gusek.html. Linux (debian/ubuntu e derivadas):
AJUDA DO GLPK
Pacote disponível em: http://www.gnu.org/software/glpk/.
Manuais em PDF (diretório doc). Exemplos (diretório examples).
FORMATOS CONHECIDOS
Formatos conhecidos para entrada de programas lineares: MPS - Mathematical Programming System:
Padrão da indústria.
Pouco intuitivo, confuso e com limitações.
LP - CPLEX LP le format:
Padrão criado para uso com o resolvedor CPLEX. Mais fácil e prático do que o formato MPS. Aceito nos principais resolvedores modernos. Arquivos podem ser convertidos para MPS.
FORMATO LP
COMPONENTES Função-objetivo. Restrições. Informações de variáveis. Limites.Variáveis inteiras genéricas. Variáveis binárias.
PROBLEMA DA DIETA
Suponha que uma certa dieta esteja restrita a leite desnatado, carne magra de boi, carne de peixe e uma salada. Sabendo-se que os requi-sitos nutricionais são expressos em termos de vitaminas e controlados por suas quantidades mínimas. O objetivo é determinar a quantidade de cada alimento que deverão ser ingeridos diariamente, de modo que os requisitos nutricionais sejam satisfeitos a custo mínimo.
Vitamina Leite (litro) Carne (kg) Peixe (kg) Salada (100g) Requisito mínimo
A 2 mg 2 mg 10 mg 20 mg 11 mg
C 50 mg 20 mg 10 mg 30 mg 70 mg
D 80 mg 70 mg 10 mg 80 mg 250 mg
PROBLEMA DA DIETA
Variáveis de decisão:
xi = quantidade do alimento do tipo i, sendo i = 1 (leite), i = 2 (carne), i = 3 (peixe) e i = 3 (salada).
Função objetivo:
PROBLEMA DA DIETA
Restrições: Demanda de vitamina A: 2x1+2x2+10x3+20x4≥11 Demanda de vitamina C: 50x1+20x2+10x3+30x4≥70 Demanda de vitamina D: 80x1+70x2+10x3+80x4≥250 Restrições de Não-negatividade: x1;x2;x3≥0PROBLEMA DA DIETA - FORMATO LP
dieta.lp M i n i m i z e Obj : 2 x1 + 4 x2 + 1 . 5 x3 + x4 S u b j e c t t o VitaminaA : 2 x1 + 2 x2 + 10 x3 + 20 x4 >= 1 VitaminaC : 50 x1 + 20 x2 + 10 x3 + 30 x4 >= 70 VitaminaD : 80 x1 + 70 x2 + 10 x3 + 80 x4 >= 250 End RESOLVENDOMODELOS DE PROGRAMAÇÃO LINEAR INTEIRA
CAPITÃO CAVERNA S.A.
A Capitão Caverna S.A., localizada em Pedra Lascada, aluga 3 tipos de barcos para passeios marítimos: jangadas, supercanoas e arcas com cabine. A companhia fornece juntamente com o barco um ca-pitão para navegá-lo e uma tripulação que varia de acordo com a embarcação: uma para jangadas, duas para supercanoas e três para arcas. A companhia tem 4 jangadas, 8 supercanoas e 3 arcas e em seu corpo de funcionários: 10 capitães e 18 tripulantes. O aluguel é por diárias e a Capitão Caverna lucra $50 por jangada, $70 por supercanoa e $100 por arca. Faça um modelo de programação ma-temática que determine o esquema de aluguel que maximiza o lucro.
CAPITÃO CAVERNA S.A.
Variáveis de decisão:
xi = número de embarcações do tipo i a serem alugadas, sendo i = 1 (jangada), i = 2 (supercanoa) e i = 3 (arca com cabine). Função objetivo:
CAPITÃO CAVERNA S.A.
Restrições: Número de capitães: x1+x2+x3≤10 (Há somente 10 capitães) Número de tripulantes: x1+2x2+3x3≤18 (Há somente 18 tripulantes) Quantidade de jangadas:x1≤4 (O número de jangadas está limitado a 4)
Quantidade de supercanoas: x2≤8 (Há apenas 8 supercanoas)
Quantidade de arcas com cabine:
x3≤3 (Há apenas 3 arcas com cabine disponíveis)
Integralidade e não-negatividade: x1;x2;x3∈ Z+
CAPITÃO CAVERNA S.A.
Max f (x) = 50x1+70x2+100x3 sujeito a x1 + x2 + x3 ≤10 x1 + 2x2 + 3x3 ≤18 x1 ≤4 x2 ≤8 x3 ≤3 x1 ; x2 ; x3 ∈ Z+CAPITÃO CAVERNA S.A. - FORMATO LP
caverna.lp Maximize Obj : 50 x1 + 70 x2 + 100 x3 S u b j e c t t o C a p i t a e s : x1 + x2 + x3 <= 10 T r i p u l a n t e s : x1 + 2 x2 + 3 x3 <= 18 Jangada : x1 <= 4 Supercanoa : x2 <= 8 A r c a s : x3 <= 3 G e n e r a l x1 x2 x3 End RESOLVENDOCAPITÃO CAVERNA S.A. - SOLUÇÃO
sol.txt Problem : Rows : 5 Columns : 3 (3 i n t e g e r , 0 b i n a r y ) Non−z e r o s : 9 S t a t u s : INTEGER OPTIMAL O b j e c t i v e : Obj = 680 (MAXimum)No . Row name A c t i v i t y Lower bound Upper bound −−−−−− −−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−− 1 C a p i t a e s 10 10 2 T r i p u l a n t e s 18 18 3 Jangada 4 4 4 Supercanoa 4 8 5 A r c a s 2 3
No . Column name A c t i v i t y Lower bound Upper bound −−−−−− −−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−−
1 x1 ∗ 4 0
CAPITÃO CAVERNA S.A. - FORMATO LP
caverna.lp Maximize Obj : 50 x1 + 70 x2 + 100 x3 S u b j e c t t o C a p i t a e s : x1 + x2 + x3 <= 10 T r i p u l a n t e s : x1 + 2 x2 + 3 x3 <= 18 Bounds 0 <= x1 <= 4 0 <= x2 <= 8 0 <= x3 <= 3 G e n e r a l x1 x2 x3 EndCAPITÃO CAVERNA S.A. - SOLUÇÃO
sol.txt Problem : Rows : 2 Columns : 3 (3 i n t e g e r , 0 b i n a r y ) Non−z e r o s : 6 S t a t u s : INTEGER OPTIMAL O b j e c t i v e : Obj = 680 (MAXimum)No . Row name A c t i v i t y Lower bound Upper bound −−−−−− −−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−−
1 C a p i t a e s 10 10
2 T r i p u l a n t e s 18 18
No . Column name A c t i v i t y Lower bound Upper bound −−−−−− −−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−−
1 x1 ∗ 4 0 4
2 x2 ∗ 4 0 8
CAPITÃO CAVERNA S.A. - ALTERAÇÕES
Agora a companhia passa a ter 5 jangadas, 6 supercanoas e 5 arcas e em seu corpo de funcionários: 5 capitães e 10 tripulantes. Ainda mais, se o lucro do aluguel fosse $45 por jangada, $80 por supercanoa e $90 por arca.
O que mudaria no modelo?
CAPITÃO CAVERNA S.A. - ALTERAÇÕES
Max f (x) = 45x1+80x2+90x3 sujeito a x1 + x2 + x3 ≤5 x1 + 2x2 + 3x3 ≤10 x1 ≤5 x2 ≤6 x3 ≤5 x1 ; x2 ; x3 ∈ Z+CAPITÃO CAVERNA S.A. - MODELO GENÉRICO
Para fazer um modelo genérico desse PPLI, façamos as seguintes convenções:emb : Conjunto dos diferentes tipos de embarcação = {Jan-gada, Supercanoa, Arca}.
li : Lucro proporcionado pelo aluguel da embarcação do tipo i. capi : Número de capitães necessários para comandar a embar-cação do tipo i.
tripi : Número de tripulantes necessários para trabalhar na em-barcação do tipo i.
dispi : Número disponível de embarcações do tipo i. ntrips : Número de tripulantes disponíveis.
CAPITÃO CAVERNA S.A. - MODELO GENÉRICO
O modelo genérico relativo ao problema em questão pode ser assim formulado: Max f (x) = X i∈emb lixi sujeito a X i∈embcapixi ≤ncapitaes (Número de capitães) X
i∈emb
FORMATO MathProg
Formato de mais alto nível, incluindo abstrações:
Comandos Conjuntos Parâmetros
Facilita a geração de problemas grandes e complexos. Permite a separação entre o modelo e os dados.
CAPITÃO CAVERNA S.A. - MODELO GENÉRICO
O modelo genérico relativo ao problema em questão pode ser assim formulado: Max f (x) = X i∈emb lixi sujeito a X i∈embcapixi ≤ncapitaes (Número de capitães) X
i∈emb
CAPITÃO CAVERNA S.A. - FORMATO MathProg
caverna.mod
s e t E ; /∗ Conjunto de Embarcações ∗/
param l {E } ; /∗ Lucro po r Embarcação ∗/
param cap {E } ; /∗ C a p i t ã e s p or Embarcação ∗/
param t r i p {E } ; /∗ T r i p u l a n t e s p or Embarcação ∗/ param d i s p {E } ; /∗ D i s p o n i b i l i d a d e p o r Embarcação ∗/ param n t r i p s ; /∗ T o t a l de t r i p u l a n t e s ∗/ param n c a p s ; /∗ T o t a l de c a p i t ã e s ∗/ v a r x { e i n E} >= 0 i n t e g e r; /∗ I n t e g r a l i d a d e e não−n e g a t i v i d a d e ∗/ s.t. c a p i t a e s : sum{ e i n E} cap [ e ] ∗ x [ e ] <= n c ap s ; /∗ R e s t r i ç ã o de C a p i t ã e s ∗/ s.t. t r i p u l a n t e s : sum{ e i n E} t r i p [ e ] ∗ x [ e ] <= n t r i p s ; /∗ R e s t r i ç ã o de T r i p u l a n t e s ∗/ s.t. emba rca co e s { e i n E } : x [ e ] <= d i s p [ e ] ; /∗ R e s t r i ç ã o de Embarcações ∗/
maximize l u c r o : sum{ e i n E} l [ e ] ∗ x [ e ] ; /∗ Lucro do a l u g u e l ∗/
CAPITÃO CAVERNA S.A. - FORMATO MathProg
caverna.dat (1/2) d a t a; /∗ Lucro po r Embarcação ∗/ param : E : l := Jangadas 50 S u p e r c a n o a s 70 A r c a s 100 ; /∗ C a p i t ã e s p o r Embarcação ∗/ param : cap := Jangadas 1 S u p e r c a n o a s 1 A r c a s 1 ; /∗ T r i p u l a n t e s p or Embarcação ∗/ param : t r i p := Jangadas 1 S u p e r c a n o a s 2CAPITÃO CAVERNA S.A. - FORMATO MathProg
caverna.dat (2/2) /∗ D i s p o n i b i l i d a d e p o r Embarcação ∗/ param : d i s p := Jangadas 4 S u p e r c a n o a s 8 A r c a s 3 ; param n t r i p s := 1 8 ; /∗ T o t a l de t r i p u l a n t e s ∗/ param n c a p s := 1 0 ; /∗ T o t a l de c a p i t ã e s ∗/ end; RESOLVENDOCAPITÃO CAVERNA S.A. - SOLUÇÃO
cavernaSol.txt Problem : c a v e r n a Rows : 6 Columns : 3 (3 i n t e g e r , 0 b i n a r y ) Non−z e r o s : 12 S t a t u s : INTEGER OPTIMAL O b j e c t i v e : l u c r o = 680 (MAXimum)No . Row name A c t i v i t y Lower bound Upper bound −−−−−− −−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−− −−−−−−−−−−−−−
1 c a p i t a e s 10 10
2 t r i p u l a n t e s 18 18
3 emba rcac oe s [ Jangadas ]
4 4 4 emba r cac oe s [ S u p e r c a n o a s ] 4 8 5 emba r cac oe s [ A r c a s ] 2 3 6 l u c r o 680
Comando set
s e t I ; /∗ d e c l a r a c o n j u n t o que s e r á informado d e p o i s ∗/ s e t I := 1 . . 1 0 ; /∗ d e c l a r a um c o n j u n t o preenchendo com num . de 1 a 10 ∗/ s e t A := T r ig o Q u e i j o Figado Salmao E s p i n a f r e ; /∗ d e c l a r a e i n f o r m a e l e m e n t o s de um c o n j u n t o ∗/ s e t Cid ade s ; s e t C a p i t a i s w i t h i n i d a d e s ; /∗ c o n j u n t o c a p i t a i s f i c a r e s t r i t o a s e r um s u b c o n j u n t o de c i d a d e s ∗/Comando param
param n ;/∗ parâmetro que s e r á informado d e p o i s ∗/
param c , > 0 ;
/∗ parâmetro que s e r á informado d e p o i s e deve s e r p o s i t i v o ∗/
param n , i n t e g e r, > 0 ;
/∗ parâmetro que s e r á informado d e p o i s e deve s e r p o s i t i v o e i n t e i r o ∗/
param c {A} ;
/∗ parâmetro que deve s e r informado para cada elemento do c o n j u n t o A ∗/
param : c :=
Comando var
v a r x >= 0 ; /∗ uma v a r i á v e l p o s i t i v a ∗/
v a r x{ I , J} , i n t e g e r , >= 0 ;
/∗ c r i a uma v a r i á v e l x para cada par ( i , j ) de I e J , v a r i á v e l i d e n t i f i c a d a por x [ i , j ] ∗/
v a r z { i i n I , j i n J} >= i+j ;
/∗ c r i a uma v a r i á v e l z para cada par ( i , j ) de I e J , v a r i a v e l i d e n t i f i c a d a por z [ i , j ] ,
Comando Adição de Restrições
s.t. r : x + y + z , >= 0 , <= 1 ; /∗ r e s t r i ç ã o com nome r , r e s t r i n g i n d o o s o m a t ó r i o de x + y + z para o i n t e r v a l o [ 0 , 1 ] ∗/ s.t. c a p a c i d a d e : sum{ i i n I } p [ i ] ∗ x [ i ] <= c ; /∗ uma r e s t r i ç ã o gerada s o b r e o s o m a t ó r i o da v a r i á v e l x [ i ] m u l t i p l i c a n d o uma c o n s t a n t e p [ i ] ∗/ s.t. e s t o q u e F i n a l {p i n P} : e s t o q u e [ 1 2 , p ] + compras [ 1 2 , p ] ∗ vendas [ 1 2 , p ] >= 5 0 0 ;FIM
Dúvidas?