Vous êtes sur la page 1sur 11

Capı́tulo 4

Programação
Inteira/Mista

4.1 Restrições de Integralidade


Restrições de integralidade surgem quando a natureza do problema impõe
que todas as suas variáveis de decisão assumam apenas valores inteiros (integrais).
Problemas com esta caracterı́stica são chamados de problemas de Programação
Inteira. Problemas nos quais as variáveis de decisão só podem assumir os valores
inteiros 0 e 1 são denominados de problemas de Programação 0-1. Quando ape-
nas parte das variáveis está restrita a valores inteiros, diz-se que o problema é de
Programação Inteira/Mista.
Os métodos tradicionais de Programação Linear, em especial o método Sim-
plex, não levam diretamente em conta restrições de integralidade, o que não quer
dizer que não possam produzir soluções ótimas inteiras. No Capı́tulo 3 as soluções
encontradas por métodos Simplex especializados para problemas de transporte e de
atribuição são naturalmente inteiras, porque os dados de entrada destes problemas
são inteiros e os métodos empregados exploram as estruturas especiais destes pro-
blemas para executar apenas operações de adição, subtração e multiplicação, não
podendo assim gerar resultados não-inteiros.
Existem, entretanto, problemas importantes de planejamento que requerem
soluções ótimas inteiras, mas que não apresentam propriedades que permitam obtê-
las por meio de programação linear. Em geral os métodos da programação linear
precisam ser adaptados para que forneçam respostas compatı́veis com restrições de
integralidade. Embora a presença de variáveis inteiras em problemas de planeja-
mento já tenha sido abordada em capı́tulos anteriores, é neste que se inicia um
estudo mais detalhado de modelos e métodos de Programação Inteira/Mista.

4.2 Exemplo Ilustrativo


Algumas propriedades básicas de problemas lineares-inteiros são discutidas
por meio do exemplo ilustrativo a seguir.
Exemplo 4.1 Um moveleiro fabrica dois tipos de painéis de madeira. Dispõe de

105
106 Capı́tulo 4. Programação Inteira/Mista

seis unidades de madeira e 28 horas de trabalho. O painel 1 consome duas unidades


de madeira e sete horas de trabalho; o painel 2, uma unidade de madeira e oito horas
de trabalho. Os lucros unitários dos painéis são de $120 e $80, respectivamente. O
moveleiro gostaria de maximizar seu lucro com a produção de painéis.

A descrição acima admite a seguinte formulação por programação linear-


inteira:

maximizar z = 120x1 + 80x2

(PLI) sujeito a 2x1 + x2 ≤ 6,
7x1 + 8x2 ≤ 28,
com x1 e x2 variáveis inteiras não-negativas. A Figura 4.1 ilustra graficamente o
problema. Apenas os pontos assinalados com o sı́mbolo • são soluções viáveis para
o problema linear-inteiro (PLI).

x2

6
PSfrag replacements
5
4
3
Solução de
2 (PLIR)
1

0 1 2 3 4 x1

7x1 + 8x2 = 28
2x1 + x2 = 6

Figura 4.1: Representação gráfica do problema (PLI).

A solução ótima do problema linear-inteiro relaxado, (PLIR), obtido ignorando-


se as restrições de integralidade sobre as variáveis de decisão, é encontrada na in-
tersecção das restrições lineares: x?1 = 20/9 e x?2 = 14/9. Se a solução ótima obtida
fosse inteira, o problema (PLI) teria sido resolvido. O valor da função-objetivo na
solução do problema linear relaxado é
?
zPLIR = 120(20/9) + 80(14/9) = 3520/9 ' 391.1.

Uma primeira idéia para forçar a integralidade da solução seria arredondar


4.3. Modelos de Programação Inteira 107

os valores ótimos do problema (PLIR) para os inteiros mais próximos, obtendo-se


x1 = 2 e x2 = 1. O valor da função-objetivo na solução arredondada é zARR = 320.
Uma segunda idéia, possı́vel quando o problema considerado apresenta um
número relativamente pequeno de alternativas viáveis inteiras, seria resolver o pro-
blema por enumeração, isto é, determinar qual das alternativas viáveis inteiras
leva ao maior valor para a função-objetivo. A solução ótima do problema (PLI),
?
obtida por enumeração, é x?1 = 3, x?2 = 0 e zPLI = 360. Sua diferença percentual
em relação à solução obtida por arredondamento é

360 − 320
' 11%.
360

Diferenças percentuais da ordem de 10% de lucro costumam ser significativas


em problemas de planejamento. 2

Dado um problema de programação linear-inteira (PLI) qualquer e sua versão


(PLIR) obtida relaxando-se (ignorando-se) restrições de integralidade, então, em
termos de valores ótimos das funções-objetivos,
? ?
zPLI ≤ zPLIR

se o problema original for de maximização. No caso de minimização,


? ?
zPLI ≥ zPLIR .

A razão para as desigualdades é que a região viável do problema (PLIR)


contém todas as soluções viáveis inteiras do problema (PLI). Logo, o valor ótimo
de (PLIR) é no mı́nimo igual ao de (PLI), podendo ser maior ou menor, depen-
dendo do tipo de formulação, maximização ou minimização. Esta propriedade é
freqüentemente explorada por métodos de programação inteira.

4.3 Modelos de Programação Inteira


Muitos problemas de planejamento podem ser formulados a partir de mode-
los de programação inteira genéricos, e que por serem genéricos têm sido melhor
estudados na literatura da área. Alguns destes modelos são discutidos nesta seção.

Problema da Mochila
O chamado problema da mochila (knapsack problem) descreve a seguinte si-
tuação: certo indivı́duo possui uma mochila com capacidade para armazenar b
kilogramas. O indivı́duo precisa escolher as quantidades de n diferentes itens a
armazenar na mochila, sabendo que cada unidade do item i pesa ai kilogramas.
O indivı́duo atribui o valor pi a cada unidade do item i. O problema consiste em
maximizar o valor total dos itens a armazenar na mochila respeitando o seu limite
de capacidade.
108 Capı́tulo 4. Programação Inteira/Mista

Definindo xi como a quantidade do item i = 1, 2, . . . , n, o problema da mochila


assume a seguinte forma:

maximizar z = p1 x1 + p2 x2 + · · · + pn xn
(PM)
sujeito a a1 x1 + a2 x2 + · · · + an xn ≤ b,

com xi , i = 1, 2, . . . , n, variáveis inteiras não-negativas.


O problema da mochila surge com freqüência em problemas de planejamento,
como no discutido a seguir.

Exemplo 4.2 Uma empresa está considerando investir em quatro novos projetos.
Os projetos gerariam um lucro lı́quido presente de $16000, $22000, $12000 e $8000.
(O lucro lı́quido presente, NPV em inglês, seria o lucro obtido ao longo dos anos
referido ao momento no qual a decisão de investimento é tomada.) Os projetos exi-
giriam investimentos de $5000, $7000, $4000 e $3000, respectivamente. A empresa
dispõe de um total de $14000 para investimento nos quatro projetos. O objetivo da
empresa é determinar quais projetos devem receber investimentos para que o seu
lucro seja máximo.

Este problema se encaixa na formulação geral do problema da mochila definindo-


se as variáveis de decisão como xi = 1 se o projeto i é selecionado, e xi = 0, caso
contrário (i = 1, 2, 3, 4). Expressando valores em $1000, obtém-se o seguinte pro-
blema de programação linear-inteira;

maximizar z = 16x1 + 22x2 + 12x3 + 8x4
(P)
sujeito a 5x1 + 7x2 + 4x3 + 3x4 ≤ 14,

com xi = 1 ou xi = 0, i = 1, 2, 3, 4. (O problema (P) poderia ser classificado como


um problema de programação 0-1.)
A seguir discute-se a introdução de restrições adicionais como exercı́cio de
modelagem de problemas de programação inteira. Se a empresa resolver investir em
no máximo dois projetos (devido a limitações de recursos humanos, por exemplo),
então uma restrição do tipo

x1 + x 2 + x 3 + x 4 ≤ 2

deve ser agregada ao problema (P). Se investir no projeto 2 implicar em investir no


projeto 1, a restrição a ser agregada ao problema (P) deve ser

x2 ≤ x 1 .

Para evitar investimentos simultâneos nos projetos 1 e 4, acrescenta-se ao


problema (P) a restrição
x1 + x4 ≤ 1.

2
4.3. Modelos de Programação Inteira 109

Problema do Caixeiro Viajante


O problema do caixeiro viajante (travelling salesman problem) pode ser re-
sumido da seguinte forma: um vendedor parte para visitar um certo número de
cidades antes de retornar à sua cidade de origem. Qual a ordem das visitas que
minimiza a distância total percorrida?
O problema do caixeiro viajante possui inúmeras e importantes aplicações em
planejamento. Empresas transportadoras de grande porte, por exemplo, freqüente-
mente recorrem a programas computacionais para resolver problemas de rotea-
mento, isto é, determinar quais rotas percorrer para atender pedidos de entrega e
coleta de encomendas de forma a minimizar seus custos totais de transporte.
Denomina-se tour qualquer solução viável para o problema do caixeiro vi-
ajante, isto é, qualquer solução pela qual o caixeiro visita cada cidade uma vez
e retorna à sua cidade de origem, não necessariamente percorrendo um caminho
mı́nimo. Num problema envolvendo n cidades existem n! possibilidades de tours,
pois de uma cidade qualquer deve-se passar a uma das n − 1 restantes, e então
para as n − 2 restantes, e assim sucessivamente, até restar apenas uma cidade a ser
visitada. Se n = 11, então o número total de tours seria 10! = 3628800. Observe
que não é necessário especificar uma cidade de origem quando se adota o conceito
de tour.
Para obter o modelo matemático inicial de um problema com n cidades, define-
se como variáveis de decisão, para i, j = 1, 2, . . . , n,

 1, se o tour segue diretamente da cidade i para a cidade j;
xij =
0, caso contrário

Para que ocorra um tour, exatamente uma cidade deve ser visitada depois da
cidade i, o que se traduz nas n restrições
n
X
xij = 1, i = 1, 2, . . . , n. (4.1)
j=1,j6=i

Um segundo conjunto de n restrições impõe que exatamente uma cidade deve


ser visitada antes da cidade j:
n
X
xij = 1, j = 1, 2, . . . , n. (4.2)
i=1,i6=j

As 2n restrições (4.1) e (4.2) são similares às presentes em problemas de atri-


buição, discutidos no capı́tulo anterior.
O objetivo no problema do caixeiro viajante é minimizar a distância total
percorrida. Denotando por cij o custo de deslocamento entre as cidades i e j,
obtém-se a seguinte função-objetivo:
n
X n
X
z= cij xij . (4.3)
i=1 j=1,j6=i
110 Capı́tulo 4. Programação Inteira/Mista

O modelo matemático inicial do problema consiste em minimizar (4.3) sujeito


às restrições (4.1) e (4.2). Este modelo possui soluções viáveis que não são tours.
Exemplo: considere um modelo envolvendo n = 8 cidades e as seguintes variáveis
assumindo valor igual a 1: x13 , x32 , x26 , x64 , x41 , x57 , x78 e x85 . Todas as 2n = 16
restrições são satisfeitas, mas a solução não corresponde a um tour. Existem, na
verdade, dois subtours: um composto por x13 , x32 , x26 , x64 , x41 ; outro formado
por x57 , x78 e x85 . Para que qualquer solução viável corresponda a um tour é
necessário incorporar novas restrições ao modelo, o que não será feito nesta discussão
introdutória do problema.

Exemplo 4.3 Problemas envolvendo o seqüenciamento de tarefas são muitas vêzes


modelados como problemas do tipo caixeiro viajante. Considere a produção diária
de uma indústria quı́mica, que inclui a produção de tintas nas cores branco, verme-
lho, amarelo e preto. Como a indústria usa o mesmo equipamento para produzir
todos os tipos de cores, uma limpeza entre bateladas – produções de cores diferentes
– é necessária. A tabela a seguir resume os tempos de limpeza entre bateladas, em
minutos. As linhas da tabela representam cores correntes; as colunas, cores a serem
produzidas em seguida. O objetivo da indústria é determinar a seqüência ótima de
produção diária das quatro cores que minimiza o tempo total de limpeza (setup).

Branco Amarelo Preto Vermelho


Branco – 10 17 15
Amarelo 20 – 19 18
Preto 50 44 – 25
Vermelho 45 40 20 –

Este problema se enquadra no modelo do problema do caixeiro viajante associando-


se cores a cidades. Denotando as cores por 1, 2, 3 e 4 (branco, amarelo, preto e
vermelho), os tempos de limpeza por cij , as variáveis de decisão por xij = 1, se o
tour vai dar cor i para a cor j, e xij = 0, caso contrário, obtém-se diretamente o
modelo matemático do problema. Como comentado, a solução ótima do problema
pode não ser um tour. O tour ótimo obtido por enumeração é produzir as cores
na seqüência 1,2,4,3 (branco, amarelo, vermelho, preto), com um tempo mı́nimo
total de limpeza igual a 98 minutos. 2

4.4 Método Branch–and–Bound


Nesta seção apresenta-se um método geral para resolução de problemas de pro-
gramação inteira, conhecido como método branch–and–bound. Um exemplo simples
será usado para motivar o desenvolvimento do método. Considere o problema de
programação inteira

maximizar z = 3x1 + 4x2

(P1) sujeito a 2x1 + x2 ≤ 6,
2x1 + 3x2 ≤ 9,
4.4. Método Branch–and–Bound 111

sendo x1 e x2 variáveis inteiras não-negativas. As soluções viáveis do problema (P1)


são representadas pelo sı́mbolo • na Figura 4.11.

x2

6
5 PSfrag replacements
4
3
2
1

0 1 2 3 4 5 x1

2x1 + 3x2 = 9
2x1 + x2 = 6

Figura 4.11: Soluções viáveis do problema (P1).

A solução ótima do problema (P1), obtida por enumeração explı́cita das


alternativas viáveis, é x?1 = 0 e x?2 = 3, com z ? = 12. O método branch–and–
bound pode ser visto como um método de enumeração implı́cita, porque explora
todo o conjunto viável do problema sem recorrer à enumeração de todas as suas
alternativas viáveis.

Algoritmo Branch–and–bound
O algoritmo branch–and–bound para problemas de maximização pode ser des-
crito em três passos principais:

1: Primeira Aproximação. Ignore as restrições de integralidade e resolva o pro-


blema de programação linear resultante. Se a solução ótima encontrada for
integral, isto é, se os valores ótimos das variáveis de decisão forem todos
números inteiros, então o problema de programação inteira também sido re-
solvido e o algoritmo termina. Caso contrário, o valor ótimo encontrado para
z se transforma num limitante superior, LS, para o valor ótimo do pro-
blema com as restrições de integralidade. No exemplo acima, a solução ótima
do problema sem as restrições de integralidade é x?1 = 2.25 e x?2 = 1.5, com
z ? = 12.75. Faz-se LS = 12.75;

2: Ramificação (branching ) Se na primeira aproximação, uma das variáveis,


x?j por exemplo, possuir valor não-inteiro, então i1 ≤ x?j ≤ i2 , com i1 e
112 Capı́tulo 4. Programação Inteira/Mista

i2 representando números inteiros não-negativos consecutivos. Dois novos


problemas são criados acrescentando-se ao problema original as restrições x j ≤
i1 e xj ≥ i2 , respectivamente. Este procedimento, chamado de ramificação,
elimina a solução corrente com valor de xj não-inteiro, mas preserva todas as
possı́veis soluções viáveis inteiras do problema original. Se após a primeira
aproximação mais de uma variável for não-inteira, recomenda-se adotar para
ramificação uma das que apresentarem parte fracionária mais próxima de 0.5.
No exemplo, fazendo j = 2, obtém-se 1 ≤ x?2 ≤ 2, e os dois novos problemas
seriam
maximizar z = 3x1 + 4x2

sujeito a 2x1 + x2 ≤ 6,
(P2)
2x 1 + 3x 2 ≤ 9,
x2 ≤ 1,
e
maximizar z = 3x1 + 4x2

sujeito a 2x1 + x2 ≤ 6,
(P3)
2x 1 + 3x 2 ≤ 9,
x2 ≥ 2,
com x1 e x2 variáveis inteiras não-negativas. Primeiras aproximações dos
novos problemas (P2) e (P3) são obtidas. No exemplo, a solução de (P2)
é x?1 = 2.5, x?2 = 1 e z ∗ = 11.5; a solução de (P3) é x?1 = 1.5, x?2 = 2 e
z ? = 12.5. Se as soluções de (P2) e (P3) forem ambas não-integrais, como
no exemplo, selecione para nova ramificação o problema cuja valor ótimo da
primeira aproximação for mais próximo do limitante superior, LS = 12.75. No
exemplo, (P3) é selecionado para a ramificação da variável x1 : 1 ≤ x1 ≤ 2.
Os dois novos problema seriam

maximizar z = 3x1 + 4x2

sujeito a 2x1 + x2 ≤ 6,

(P4) 2x1 + 3x2 ≤ 9,

x 2 ≥ 2,
x1 ≤ 1,
e
maximizar z = 3x1 + 4x2

sujeito a 2x1 + x2 ≤ 6,

(P5) 2x1 + 3x2 ≤ 9,

x2 ≥ 2,
x1 ≥ 2,
sendo x1 e x2 variáveis inteiras não-negativas. As primeiras aproximações de
(P4) e (P5) são as seguintes: para (P4), x?1 = 1, x?2 = 2.33 e z ? = 12.33;
o problema (P5) é inviável. No procedimento de ramificação pode ocorrer
de algum problema tornar-se inviável com a incorporação da nova restrição.
Ramificações adicionais a partir deste tipo de problema não são possı́veis;
3: Limitação (bounding ) O procedimento de ramificação prossegue até que uma
primeira aproximação apresente solução inteira. O valor da função objetivo
4.4. Método Branch–and–Bound 113

correspondente à solução inteira torna-se um limitante inferior, LI, para o


valor ótimo do problema original, (P1). Todos os problemas cujas primeiras
aproximações, integrais ou não, apresentarem valores inferiores ao limitante
inferior são então descartados. O limitante inferior é atualizado sempre que
uma primeira aproximação exibir solução inteira com valor de z maior. O
algoritmo branch–and–bound termina quando não mais existirem problemas a
serem ramificados. No exemplo, a ramificação prossegue a partir do problema
(P4):


maximizar z = 3x1 + 4x2

sujeito a 2x1 + x2 ≤ 6,

2x1 + 3x2 ≤ 9,
(P6)
x2 ≥ 2,

x1 ≤ 1,
x2 ≤ 2,


maximizar z = 3x1 + 4x2

sujeito a 2x1 + x2 ≤ 6,

2x1 + 3x2 ≤ 9,
(P7)
x2 ≥ 2,

x1 ≥ 2,
x2 ≥ 3,

com x1 e x2 variáveis inteiras não-negativas. A primeira aproximação de (P6)


é x?1 = 1, x?2 = 2 e z ? = 11. Como a solução é inteira, LI = 11. Ainda não
é possı́vel descartar problemas. A solução de (P7), também inteira, é x ?1 = 0,
x?2 = 3 e z ? = 12; atualiza-se o limitante inferior para LI = 12, e agora é
possı́vel descartar os problemas (P2) (z ? = 11.5) e (P4) (z ? = 11). Como não
existem mais problemas a serem ramificados, a solução ótima do problema
(P1) é x?1 = 0, x?2 = 3 e z ? = 12.

O algoritmo branch–and–bound gera uma árvore. Cada nó da árvore repre-


senta um problema de onde partem dois ramos. Quando um limitante inferior é
obtido e ramos são eliminados, ocorre a poda da árvore, na denominação de alguns
autores. Para o exemplo considerado, a árvore se apresentaria como na Figura 4.12.
PSfrag replacements

114 Capı́tulo 4. Programação Inteira/Mista

z ∗ = 11.5 z ∗ = 11
P2 P6
(2.5, 1) (1, 2)
z ∗ = 12.75 z ∗ = 12.33
P1 P4
(2.25, 1.5) (1, 2.33)
z ∗ = 12.5 z ∗ = 12
P3 P7
(1.5, 2) (0, 3)

P5 Infactı́vel

Figura 4.12: Árvore associada ao exemplo.

Após a primeira aproximação do problema (P1), se poderia pensar em arre-


dondar os valores não-inteiros da solução encontrada para os valores inteiros mais
próximos. A solução inteira subótima assim obtida geralmente não produz bons
resultados, especialmente se os valores das variáveis forem pequenos. No exemplo
acima, a solução inteira viável mais próxima após a primeira aproximação de (P1)
é x1 = 2 e x2 = 1, com z = 10. A diferença percentual do valor ótimo do problema
(z ? = 12) em relação ao produzido pelo arredondamento da sua primeira apro-
ximação é de 17%. Em outros casos é possı́vel que o arredondamento não introduza
grande variação no valor ótimo da função-objetivo.
Exemplo 4.4 Um fabricante está começando a última semana de produção de
quatro diferentes tipos de consoles para televisores, os quais devem ser montados
e então decorados. Os modelos requerem 4, 5, 3 e 5 horas para serem montados,
e 2, 1.5, 3 e 3 horas para serem decorados, respectivamente. Os lucros unitários
com os modelos são $7, $7, $6 e $9, respectivamente. O fabricante dispõe de 30000
horas para montagem (750 montadores trabalhando 40 horas por semana) e 20000
horas para decoração (500 decoradores trabalhando 40 horas por semana). Quantas
unidades de cada modelo o fabricante deve produzir durante esta última semana
de forma a maximizar seu lucro? Assuma que todas as unidades produzidas serão
vendidas.

A formulação matemática do problema é



maximizar z = 7x1 + 7x2 + 6x3 + 9x4

(P1) sujeito a 4x1 + 5x2 + 3x3 + 5x4 ≤ 30000,
2x1 + 1.5x2 + 3x3 + 3x4 ≤ 20000,
com x1 , x2 , x3 e x4 variáveis inteiras não-negativas que representam os números
de consoles dos tipos 1, 2, 3 e 4. A primeira aproximação de (P1) é x?1 = x?2 = 0,
4.4. Método Branch–and–Bound 115

x?3 = 1666.67 e x?4 = 5000, com z ? = 55000. O limitante superior do problema é


LS = 55000. Como x?3 não possui valor inteiro, introduz-se dois novos problemas:

maximizar z = 7x1 + 7x2 + 6x3 + 9x4

sujeito a 4x1 + 5x2 + 3x3 + 5x4 ≤ 30000,
(P2)
2x 1 + 1.5x 2 + 3x 3 + 3x 4 ≤ 20000,
x3 ≤ 1666,
e
maximizar z = 7x1 + 7x2 + 6x3 + 9x4

sujeito a 4x1 + 5x2 + 3x3 + 5x4 ≤ 30000,
(P3)
2x1 + 1.5x2 + 3x3 + 3x4 ≤ 20000,
x3 ≥ 1667.
As soluções de (P2) e (P3) são x?1 = x?2 = 0, x?3 = 1666, x?4 = 5000.4 com z ? =
54999.6, e x?1 = 1, x?2 = 0, x?3 = 1667, x?4 = 4999 com z ? = 55000, respectivamente.
Como a solução de (P3) é inteira, atualiza-se o limitante inferior: LI = 55000.
Elimina-se o problema (P2) (z ? = 54999.6) e como não há mais problemas a serem
ramificados, a solução do problema inteiro (P1) é x?1 = 1, x?2 = 0, x?3 = 1667,
x?4 = 4999 com z ? = 55000.
Optando-se pelo estratégia de arredondamento, a solução inteira factı́vel mais
próxima após a primeira aproximação de (P1) é x?1 = x?2 = 0, x?3 = 1666, x?4 = 5000
com z ? = 54996. Neste caso, o valor ótimo do problema inteiro, z ? = 55000, é
menos do que 0.008% superior ao produzido pelo arredondamento. 2

O algoritmo branch–and–bound para problemas de programação inteira que


envolvam minimizar ao invés de maximizar é essencialmente o mesmo, com papéis
inversos dos limitantes: obtém-se inicialmente um limitante inferior e, em seguida,
um limitante superior, atualizado sempre que um problema apresentar solução in-
teira com valor ótimo z menor.