Sunteți pe pagina 1din 19

Programação Inteira

Fernando Nogueira Programação Inteira 1


A Programação Inteira pode ser entendida como uma caso específico da
Programação Linear, onde as variáveis devem ser inteiras (ou ao menos, parte
destas variáveis).
A rigor, o nome mais correto para a Programação Inteira é Programação Linear
Inteira.
Quando todas as variáveis devam possuir valores inteiros, o modelo é
denominado de um problema de Programação Inteira Pura, caso contrário, é
denominado de um problema de Programação Inteira Mista.
n
Modelo Formal
Max (ou Min ) ∑c x
j=1
j j

sujeito a
n

∑a x
j=1
ij j ≤ bi para i = 1,2,..., m

xj ∈Ζ para j = 1,2,..., p (≤ n )
xj ≥ 0 para j = p + 1,..., n
Fernando Nogueira Programação Inteira 2
Exemplos de Aplicações:
1) Utilização de Equipamentos ⇒ xj representa a quantidade de equipamentos. Por
exemplo, xj = 2.33 navios petroleiros pode não ter significado prático.
2) Tamanhos de Lotes ⇒ Em algumas situações de planejamento de produção, faz-
se necessário que xj = 0 ou xj > Lj, onde xj representa a quantidade de produtos
produzidos e Lj uma quantidade mínima de produtos xj para compor um lote.
Esta situação é um exemplo de restrição “ou-ou” (ou faz um mínimo ou não faz
nada).
3) Decisões “Sim-ou-Não” ⇒ xj = 1 ou xj = 0 representando decisões sim ou não
(também uma situação de “ou-ou”). Por exemplo, xj = 1 representa construir
uma nova fábrica.
4) Otimização Combinatória ⇒ lida com problemas de decisão de seqüências,
programas e itinerários. Exemplos clássicos são:
-Problema do Caixeiro Viajante ⇒ Para n cidades, existem (n-1)! diferentes
percursos (ex: n = 50, 6x1062 percursos diferentes).
-Problema de Programação de Máquinas ⇒ Para n itens a serem fabricados em
cada uma de k máquinas existem (n!)k seqüências possíveis (ex: n = k = 10,
4x1065 seqüências diferentes).
Fernando Nogueira Programação Inteira 3
Problemas de Programação Inteira (conjunto solução discreto) são geralmente
muito mais difíceis de serem resolvidos quando comparados aos Problemas de
Programação Linear ordinários (conjunto solução contínuo).
Max 21x1 + 11x 2
sujeito a
⎧7 x1 + 4 x 2 ≤ 13

⎩x1 , x 2 ≥ 0 ∈ Ζ
A solução ótima é x1 = 0 e x2 = 3 (o que pode ser verificado por enumeração
exaustiva).
Uma maneira de resolver este exemplo seria, por exemplo, desconsiderar a
restrição das variáveis serem inteiras e resolver utilizando o algoritmo Simplex
normalmente. A solução ótima neste caso é x1 = 13/7 e x2 = 0.
A solução arredondada é x1 = 2 e x2 = 0, que é inviável.
A solução arredondada “para baixo” é x1 = 1 e x2 = 0, que é viável, porém longe
de ser a ótima.
A regra de arredondar a solução não funciona muito bem, e portanto, não é um
procedimento robusto para solucionar problemas de Programação Inteira.
Fernando Nogueira Programação Inteira 4
Uma dificuldade ainda mais séria é que não existe maneira fácil de verificar se
uma solução viável é ótima. Este fato representa uma importante diferença entre a
Programação Linear e a Programação Inteira.
Como exemplo, suponha que se queira testar se a solução x1 = 1 e x2 = 1 é ótima.
Assim, examinando se a solução representa um ótimo local, no sentido que a
função-objetivo não melhora em qualquer ponto inteiro vizinho viável x1 = 1+a e
x2 = 1+b, onde a,b = -1,0,1. Os pontos vizinhos neste caso são: (x1,x2) = (0,0),
(0,1), (0,2), (1,0).

A solução (1,1) é a melhor entre todas de sua vizinhança, porém não é a ótima.
Com isso, um ponto pode ser ótimo localmente entre pontos vizinhos e ainda não
ser ótimo global, apesar do modelo ser linear.

Fernando Nogueira Programação Inteira 5


Algoritmo Branch-Bound (Ramifica-e-Limita)
A abordagem mais amplamente adotada para resolver problemas de Programação
Inteira utiliza um método de busca em árvore, também referido como um Algoritmo
de Retrocesso (Backtracking).
O método pode ser aplicado em Problemas de Programação Inteira Pura ou Mista.
Admitindo que o problema de Programação Inteira seja modelo por:
n
(1) Max ∑ c j x j A idéia principal do algoritmo
j=1

sujeito a Branch-Bound é oriunda de que um


n valor inteiro T qualquer contido no
(2) ∑ a ij x j ≤ b i para i = 1,2,..., m
intervalo L j ≤ T ≤ U j − 1 e xj uma solução
j=1

(3) xj ∈Ι para j = 1,2,..., p (≤ n ) ótima também satisfará:


(4) xj ≥ 0 para j = p + 1,..., n (6) x j ≥ T +1
Supondo que para cada variável inteira ou
seja possível fornecer limites inferiores (7 ) xj ≤ T
Lj e superiores Uj que seguramente
incluam os valores ótimos.
(5) Lj ≤ xj ≤ Uj para j = 1,2,..., p (≤ n )
Fernando Nogueira Programação Inteira 6
Como exemplo desta dicotomia, suponha que a restrição de inteiros (3) seja retirada
e que uma solução ótima de Programação Linear para (1), (2), (4) e (5) indique que
x1=1.67. Então formule e resolva mais 2 programas lineares com (1), (2) e (4),
porém com (5), para j=1 modificado em um problema para:
floor (x1 ) + 1 ≤ x1 ≤ U1 ⇒ 2 ≤ x1 ≤ U1
e o outro para:
L1 ≤ x1 ≤ floor(x1 ) ⇒ L1 ≤ x1 ≤ 1
onde floor(.) é uma função que arredonda “para baixo”.
Suponha, além disto, que cada um destes 2 problemas tenha uma solução ótima que
satisfaça às restrições de inteiros (3). Então, a solução que tenha o maior valor para a
função-objetivo é de fato ótima para o problema original de Programação Inteira.
Comumente, um destes problemas (ou ambos) não tem solução ótima que satisfaça
(3) e, portanto, cálculos adicionais são necessários. O algoritmo abaixo especifica
uma maneira sistemática para obter uma solução ótima.

Fernando Nogueira Programação Inteira 7


O Método
Em qualquer iteração t, existe um limite inferior Zt para o valor da função-objetivo.
Além disto, existe também um Lista-Mestra de problemas de Programação Linear a
serem resolvidos com diferença entre eles apenas nos limites para as variáveis xj (5).
Na iteração 1, existe um único problema consistindo em (1), (2), (4) e (5). O
procedimento na iteração t é:
Passo 1. Termine as computações se a Lista-Mestra estiver vazia, senão tire um
problema de P.L. da Lista-Mestra.
Passo 2. Resolva o problema escolhido. Se este não tiver nenhuma solução viável ou
se o valor ótimo Z for menor ou igual a Zt, então faça Zt+1 = Zt e retorne ao passo 1.
Passo 3. Se a solução ótima obtida para o problema de P.L. satisfizer às restrições de
inteiros, então registre-a, faça Zt+1 ser o valor ótimo correspondente da função-
objetivo Z e retorne ao Passo 1, senão, prossiga ao Passo 4.
Passo 4. Escolha qualquer variável xj, com j = 1, 2,...,p que não tenha um valor
inteiro na solução ótima obtida para o problema escolhido de P.L. Faça bj denotar
este valor e [bj] significar o maior inteiro menor ou igual a bj (arredondar para baixo).
Acrescente 2 problemas de P.L. à Lista-Mestra idênticos ao problema escolhido no
Passo 1, exceto que em um o limite inferior Lj para xj é [bj] + 1 e no outro o limite
superior Uj para xj é [bj]. Faça Zt+1 = Zt e retorne ao Passo 1.
Fernando Nogueira Programação Inteira 8
No fim do algoritmo, se houver registrado uma solução viável com Zt, esta é ótima,
caso contrário não existe nenhuma solução viável.
É bastante comum encontrar uma solução com valores inteiros antes da última
iteração, porém só é possível afirmar que esta é ótima após a iteração final.
O processo no Passo 1 é chamado de ramificação porque ele envolve a seleção de
um problema de P.L. para consideração posterior.
O processo no Passo 2 é conhecido como afrouxamento porque o problema de
Programação Inteira é resolvido como um problema de P.L. ordinário (ignorando a
restrição de inteiros).
O processo no Passo 4 é conhecido como separação, onde um problema “genitor”
de P.L. com Z maior que Zt dá origem a 2 descendentes.
Exemplo(8) Max 3x1 + 3x 2 + 13x 3
sujeito a
⎧ − 3x 1 + 6 x 2 + 7 x 3 ≤ 8

(9) ⎨6 x1 − 3x 2 + 7 x 3 ≤ 8
⎪x , x , x ≥ 0 e ∈ Ι
⎩ 1 2 3
Admitindo limites para cada variável como
(10) 0 ≤ x j ≤ 5, j = 1,2,3.
Fernando Nogueira Programação Inteira 9
Uma vez que todo xj = 0 é uma solução viável para este problema, pode-se adotar o
limite inferior Z1 = 0 para a iteração 1. A Lista-Mestra contém somente o problema
de P.L. (8), (9) e (10), que é designado problema 1. Retire-o no Passo 1 e no Passo
2 ache a solução ótima.
(11) Z = 16 x1 = x2 = 2.67 x3 = 0 (Problema 1)
Uma vez que a solução não apresenta valor inteiro, prossiga do Passo 3 ao Passo 4
e escolha x1. Então [b1] = floor(2.67) = 2, coloque na Lista-Mestra:
Problema 2: restrições (9) e
(12) 3 ≤ x1 ≤ 5 0 ≤ x2 ≤ 5 0 ≤ x3 ≤ 5
Problema 3: restrições (9) e
0 ≤ x1 ≤ 2 0 ≤ x2 ≤ 5 0 ≤ x3 ≤ 5
Retornando ao Passo 1 com Z2 = Z1 = 0, remova o problema 2. O Passo 2
estabelece que o problema 2 não tem solução viável. Então faça Z3 = Z2 = 0 e
retorne ao Passo 1. Retire o problema 3 e obtenha, no Passo 2, a solução ótima:
(13) Z = 15.71 x1 = x2 = 2 x3 = 0.28 (Problema 3), o qual por sua vez,
também não tem valor inteiro. Portanto, vá do Passo 3 ao Passo 4, onde é escolhido
x3. Uma vez que [b3] = floor(0.28) = 0, coloque na Lista-Mestra:
Fernando Nogueira Programação Inteira 10
Uma vez que a solução não apresenta valor inteiro, prossiga do Passo 3 ao Passo 4 e
escolha x1. Então [b1] = floor(2.67) = 2, coloque na Lista-Mestra:
Problema 2: restrições (9) e
(12) 3 ≤ x1 ≤ 5 0 ≤ x2 ≤ 5 0 ≤ x3 ≤ 5

Problema 3: restrições (9) e


0 ≤ x1 ≤ 2 0 ≤ x2 ≤ 5 0 ≤ x3 ≤ 5

Retornando ao Passo 1 com Z2 = Z1 = 0, remova o problema 2. O Passo 2 estabelece


que o problema 2 não tem solução viável. Então faça Z3 = Z2 = 0 e retorne ao Passo 1.
Retire o problema 3 e obtenha, no Passo 2, a solução ótima:
(13) Z = 15.71 x1 = x2 = 2 x3 = 0.28 (Problema 3), o qual por sua vez,
também não tem valor inteiro. Portanto, vá do Passo 3 ao Passo 4, onde é escolhido
x3. Uma vez que [b3] = floor(0.28) = 0, coloque na Lista-Mestra:
Problema 4: restrições (9) e
(14) 0 ≤ x1 ≤ 2 0 ≤ x2 ≤ 5 1 ≤ x3 ≤ 5

Problema 5: restrições (9) e


0 ≤ x1 ≤ 2 0 ≤ x2 ≤ 5 0 ≤ x3 ≤ 0

Fernando Nogueira Programação Inteira 11


Observe que os problemas 4 e 5 diferem do problema 3 somente nos limites para x3.
Retornando ao Passo 1 com Z4 = 0, remova o problema 4. A solução ótima é:
(15) Z = 15 x1 = x2 = 0.33 x3 = 1 (Problema 4), o qual por sua vez, também
não tem valor inteiro. Portanto, vá do Passo 3 ao Passo 4. Suponha que você escolha
x2 (poderia ter escolhido x1 também). Uma vez que [b2] = floor(0.33) = 0, coloque
na Lista-Mestra:
Problema 6: restrições (9) e
(16) 0 ≤ x1 ≤ 2 1 ≤ x2 ≤ 5 1 ≤ x3 ≤ 5

Problema 7: restrições (9) e


0 ≤ x1 ≤ 2 0 ≤ x2 ≤ 0 1 ≤ x3 ≤ 5
Observe que os problemas 6 e 7 diferem do problema 4 somente nos limites para x2.
Retornando ao Passo 1 com Z5 = 0, remova o problema 6 de modo que os
problemas 5 e 7 permaneçam na Lista-Mestra. O Passo 2 indicou que o problema 6
não tem solução viável. Então retorne ao Passo 1 com Z6 = 0. Remova então o
problema 7, cuja solução ótima é:
(17) Z = 14.86 x1 = x2 = 0 x3 = 1.14 (Problema 7). Como x3 não é inteiro,
então [b3] = floor(1.14) = 1, coloque na Lista-Mestra:

Fernando Nogueira Programação Inteira 12


Observe que os problemas 6 e 7 diferem do problema 4 somente nos limites para
x2. Retornando ao Passo 1 com Z5 = 0, remova o problema 6 de modo que os
problemas 5 e 7 permaneçam na Lista-Mestra. O Passo 2 indicou que o
problema 6 não tem solução viável. Então retorne ao Passo 1 com Z6 = 0.
Remova então o problema 7, cuja solução ótima é:
(17) Z = 14.86 x1 = x2 = 0 x3 = 1.14 (Problema 7). Como x3 não é inteiro,
então [b3] = floor(1.14) = 1, coloque na Lista-Mestra:
Problema 8: restrições (9) e
(18) 0 ≤ x1 ≤ 2 0 ≤ x2 ≤ 0 2 ≤ x3 ≤ 5

Problema 9: restrições (9) e


0 ≤ x1 ≤ 2 0 ≤ x2 ≤ 0 1 ≤ x3 ≤ 1

Observe que os problemas 8 e 9 diferem do problema 7 somente nos limites para


x3. Retornando ao Passo 1 com Z7 = 0, remova o problema 8. O Passo 2 indicou
que o problema 8 não tem solução viável. Então retorne ao Passo 1 com Z8 = 0.
Remova então o problema 9, cuja solução ótima é:
(19) Z = 13.5 x1 = 0.16 x2 = 0 x3 = 1 (Problema 9). Como x1 não é
inteiro, então [b1] = floor(0.16) = 0, coloque na Lista-Mestra:

Fernando Nogueira Programação Inteira 13


Problema 10: restrições (9) e
(20) 1 ≤ x1 ≤ 2 0 ≤ x2 ≤ 0 1 ≤ x3 ≤ 1
Problema 11: restrições (9) e
0 ≤ x1 ≤ 0 0 ≤ x2 ≤ 0 1 ≤ x3 ≤ 1

Observe que os problemas 10 e 11 diferem do problema 9 somente nos limites para


x1. Retornando ao Passo 1 com Z9 = 0, remova o problema 10. O Passo 2 indicou
que o problema 10 não tem solução viável. Então retorne ao Passo 1 com Z10 = 0.
Remova então o problema 11, cuja solução ótima é (repare que os valores de xj não
podem mais variar):
(21) Z = 13 x1 = 0 x2 = 0 x3 = 1 (Problema 11).
Portanto, no Passo 3 registra-se (21), uma vez que a solução acima é viável e
inteira e Z11 = 13.
Retornando ao Passo 1, observa-se que somente o problema 5 permanece na Lista-
Mestra, portanto, ainda não é possível afirma que (21) é a solução ótima.

Fernando Nogueira Programação Inteira 14


A solução ótima do problema 5 é:
(22) Z = 13 x1 = 2 x2 = 2.33 x3 = 0 (Problema 5).
Uma vez que Z = Z11, retorna-se ao Passo 1 e termina-se os cálculos, pois a Lista-
Mestra está vazia. A solução ótima então é (21).

O histórico das iterações pode ser exposto por meio de um diagrama em árvore. Cada
nó na árvore representa um problema na Lista-Mestra. Note que, para o problema 5, o
ramo está terminado, embora a solução ótima não tenha valor inteiro. A razão é que,
quando atinge-se o problema 5 em t = 11 e Z = 13, já existe uma solução inteira com Z
= 13 obtida no problema 11. Portanto, ramificar o problema 5 irá impor restrições mais
fortes, ocasionando então valores menores de Z para os problemas descendentes do
problema 5, o que justifica então, o fim da busca na árvore.

Fernando Nogueira Programação Inteira 15


Fernando Nogueira Programação Inteira 16
A tabela abaixo, resume as operações de busca na árvore.

Fernando Nogueira Programação Inteira 17


Problema do Caixeiro Viajante - The Traveling Salesperson Problem
O problema do Caixeiro Viajante consiste em encontrar o caminho mais curto no qual
ele visite cada cidade apenas uma vez e retorne a sua cidade de origem.
Em termos técnicos, as cidades são os nós de uma rede e as estradas que ligam as
cidades são os arcos da rede.
Este problema pode ser resolvido como um problema de Programação Linear Inteira.
Nesta metodologia o número de restrições é n2-n+2.

Fernando Nogueira Programação Inteira 18


n n
min Z = ∑∑ c ij x ij c ij = ∞ para i = j
i =1 j=1
cij é a distância (custo) entre os nós i e j;
sujeito a
n
xij é o fluxo entre os nós i e j;
∑x
j=1
ij =1 i = 1,2,..., n Z é a distância (custo) total; e
n é o número de cidades.
n

∑x
i =1
ij =1 j = 1,2,..., n

u i − u j + nx ij ≤ n − 1, i = 2,3,..., n; j = 2,3,..., n; i≠ j
x ij = {0,1} (i = 1,..., n; j = 1,..., n )
Fernando Nogueira Programação Inteira 19

S-ar putea să vă placă și