Definição
● A Programação Linear Inteira (PLI) é um caso
particular da Programação Linear (PL)
● As variáveis devem assumir valores inteiros (ou
pelo menos uma parte delas)
Aplicações
● As aplicações decorrem quando variáveis com
valores reais não possuem um significado razoável
● Ex: Se x representa o número de funcionários a
serem contratados o valor 4.16 não representa um valor praticável. Decisões do tipo sim ou
Características
● Espaço de busca discreto
● Em muitos casos práticos o conjunto de
soluções é finito
● Difícil tratamento: NP-Difícil ou NP-Completo
Exemplo
● Seja um conjunto de 50 cidades
● Um indivíduo precisa passar por todas elas
vendendo produtos e depois retornar a cidade origem
● O objetivo é encontrar a rota que minimiza a
distância percorrida
● Este é o Problema do Caixeiro Viajante ou
Enumeração
● Enumerar todas as soluções e encontrar a
melhor é possível, mas inviável na maioria dos casos
● Alguns problemas não possuem um poliedro
bem formado, com um lado ilimitado, logo o número de soluções é infinito
● Em alguns casos exitem soluções demais para
Enumeração - TSP
● Existem (n-1)!/2 soluções ● 49! =
6082818640342675608722521633212953768875528313 79210240000000000 ~ 6X1062
● Os computadores modernos realizam 4x109 instruções por segundo aproximadamente
● Supondo que uma solução tivesse sua qualidade avaliada em uma única instrução (o que não é verdade)
● São necessários aproximadamente 2X1045 anos para analisar todas as soluções
Simplex
● O Algoritmo Simplex pode ser usado como
aproximação
● Ignora-se as restrições de integralidade e
resolve-se o problema como se ele fosse contínuo
Exemplo
● Uma determinada empresa produz dois
produtos, chamados p1 e p2, e quer determinar a quantidade de produtos a serem feitos de
forma a maximizar o seu lucro
● O produto p1 dá uma unidade de lucro; o
Exemplo
● Ambos os produtos requerem os mesmos dois
tipos de matéria-prima
● O produto p1 consume uma unidade de cada
matéria-prima; já o produto p2 consome 20 unidades da primeira matéria-prima e uma unidade da segunda matéria-prima
Exemplo
● A produção está limitada ao estoque de cada
matéria-prima que é de 50 unidades da primeira e 20 unidades da segunda
Formulação Matemática
● Seja x
i a variável que determina a quantidade a
ser produzida do produto i
● A quantidade produzida deve ser um número
inteiro
● A quantidade produzida não pode ser inferior a
Formulação Matemática
max x1+19x2 s. a. x1+20x2≤50 x1+ x2≤20 x1, x2∈ℤ x1, x2≥0Exemplo
max x1+19x2 s. a. x1+20x2≤50 x1+ x2≤20 x1, x2∈ℤ x1, x2≥0 Lucro Matéria-prima 1 Matéria-prima 2 integralidade Não negatividadeExemplo
max x1+19x2 s. a. x1+20x2≤50 x1+ x2≤20 x1, x2≥0Removendo a restrição de integralidade temos uma solução linear
x1=18,42 x2=1,58
fo(X)= 48,42 O que fazer?
Exemplo
Analisando as soluções Inteiras próximas a solução ótima temos
X1=18 x2=1 → fo(x) = 37
X1=19 x2=1 é a solução ótima? X1=18 x2=2 → inviável
X1=19 x2=1 → fo(x) = 38 X1=19 x2=2 → inviável
Exemplo
● A solução ótima deste problema é x1=10, x2=2
● A função objetivo neste caso é 48, longe do 38
da solução anterior
● A solução pode ser obtida através do algoritmo
Branch-and-Bound Inicialização
● Seja o conjunto L o conjunto de problemas a ser
resolvido. Seja z o valor da melhor solução inteira encontrado no processo de solução
● No início L é um conjunto vazio e z indeterminado ● Retira-se as restrições de integralidade do
problema original
Branch-and-Bound
X1=? X2=? Z=?
Branch-and-Bound
● Retira-se um problema de L, referenciado por p
Branch-and-Bound
● Retira-se um problema de L, referenciado por p
● Caso a solução de p seja inteira atualiza-se o
valor de z caso necessário
Branch-and-Bound
● Retira-se um problema de L, referenciado por p
● Caso a solução de p seja inteira atualiza-se o
valor de z caso necessário
● Caso a solução de p seja inviável p é
Branch-and-Bound
Branch-and-Bound
● Caso a solução seja contínua e pior que z p
deve ser descartado
Branch-and-Bound
● Caso a solução seja contínua e pior que z p
deve ser descartado
● Caso a solução seja contínua e melhor que z,
deve-se escolher uma variável qualquer do problema, com valor contínuo, e realizar a operação de ramificação
Branch-and-Bound
● Seja s a solução de p. Escolhe-se uma variável
qualquer referenciada por y. Seja sy o valor da variável y em s.
● Na ramificação são criados dois novos
problemas: p’ e p’’
● Em p’ é inserida a restrição y >= teto(s
y)
● Em P’’ é inserida a restrição y <= piso(s
Branch-and-Bound
● No exemplo, podemos tomar a variável
x1=18,42
● Em p’ acrescenta-se a restrição x1>=19
Branch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=? X2=? fo(X)=? x1>=19 X1=? X2=? fo(X)=? x1<=18 Z=?Branch-and-Bound
● O algoritmo realiza as operações de
ramificação e descarte enquanto houver problemas no conjunto L
● Melhor caso: a cada passo um problema é
descartado
● Pior caso: a cada passo um problema é
Branch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 Z=?
Branch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 Z=?Branch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 Z=38 Solução InteiraBranch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 X1=? X2=? fo(X)=? x1<=18 Z=38 Descartado Em análise Solução InteiraBranch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 X1=? X2=? fo(X)=? x1<=18 Z=38Branch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 X1=18 X2=1,6 fo(X)=48,4 x1<=18 Z=38 Descartado Em análiseBranch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 X1=18 X2=1,6 fo(X)=48,4 x1<=18 X1=? X2=? fo(X)=? x2>=2 X1=? X2=? fo(X)=? x2<=1 Z=38Branch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 X1=18 X2=1,6 fo(X)=48,4 x1<=18 X1=10 X2=2 fo(X)=48 x2>=2 X1=? X2=? fo(X)=? x2<=1 Z=38 Descartado Em análise Solução InteiraBranch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 X1=18 X2=1,6 fo(X)=48,4 x1<=18 X1=10 X2=2 fo(X)=48 x2>=2 X1=? X2=? fo(X)=? x2<=1 Z=48Branch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 X1=18 X2=1,6 fo(X)=48,4 x1<=18 X1=10 X2=2 fo(X)=48 x2>=2 X1=18 X2=1 fo(X)=37 x2<=1 Z=48 Descartado Em análiseBranch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 X1=18 X2=1,6 fo(X)=48,4 x1<=18 X1=10 X2=2 fo(X)=48 x2>=2 X1=18 X2=1 fo(X)=37 x2<=1 Z=48Branch-and-Bound
X1=18,42 X2=1,58 fo(X)=48,42 X1=19 X2=1 fo(X)=38 x1>=19 X1=18 X2=1,6 fo(X)=48,4 x1<=18 X1=10 X2=2 fo(X)=48 x2>=2 X1=18 X2=1 fo(X)=37 x2<=1 Z=48 Descartado Em análiseBranch-and-Bound
● Seja L um Conjunto de subproblemas
● Seja fo(s) a função objetivo de uma solução s
● Seja s* a melhor solução inteira encontrada ao
longo da busca
Branch-and-Bound
Algoritmo branchAndBound( PPL p ) Início
Seja s a solução de p Se (s for inteira) Então Retorne s
Branch-and-Bound
L = {}, z = null, s*=null
Seja x uma das variáveis fracionarias de s PPL p1=p, p2=p Adicione em p1 a restrição Adicione em p2 a restrição Inserir p1 em L Inserir p2 em L x≤ piso( x) x≥teto( x)
Branch-and-Bound
Enquanto (L não estiver vazia) Faça Remova um elemento r de L
Seja sr a solução de r
Se (Inviável(sr) | z != null & fo(sr) pior que z) Então Descarte r
Branch-and-Bound
Se (sr for inteira ) então
Se(z==null | fo(sr) melhor que z ) Então z=fo(sr)
s* = sr Fim Se
Branch-and-Bound
PPL paux1=r, paux2=r
Seja x’ uma variável fracionária de sr Adicione em paux1 a restrição
Adicione em paux2 a restrição Inserir paux1 em L
Inserir paux2 em L
Fim Se // solução de r é fracionária Fim Enquanto
x '≤ piso( x ' )
Branch-and-Bound
retorne s*
Fim Se //solução Fracionária Fim