Apêndice C
Programação linear
Formular problemas de otimização combinatória como programas lineares
é muito útil e revelador.
Este apêndice faz uma rápida revisão dos conceitos e da terminologia básica
da programação linear.
C.1 Programas lineares
O problema de programação linear
consiste em encontrar um vetor de um dado poliedro
que maximize uma dada função linear.
Mais especificamente, o problema de programação linear consiste no seguinte:
Dados conjuntos finitos e ,
uma matriz indexada por , e
vetores e indexados por
e respectivamente,
encontrar um vetor que
A expressão maximize
deve ser entendida assim:
procuramos tal que para todo
que satisfaça as restrições .
Cada desigualdade é uma restrição do problema.
O número é o valor de .
O máximo de é o valor ótimo
do problema.
É usual supor que a matriz e os vetores e são reais,
mas poderíamos nos restringir às matrizes e vetores racionais,
uma vez que computadores digitais desconhecem números irracionais.
Exemplo C.1:
Considere a matriz e os vetores e representados abaixo,
com na vertical à direita da matriz
e na horizontal abaixo da matriz:
O problema de maximizar sujeito às restrições
pode ser escrito explicitamente assim:
encontrar números
, , , , que maximizem o valor da combinação linear
enquanto satisfazem as restrições lineares
(Todos os coeficientes nesse exemplo são inteiros positivos,
mas isso é mero acidente.)
O problema de programação linear é muitas vezes chamado
de programa linear
(= linear program).
Usamos a expressão pl
como abreviatura de programa linear
.
O pl dado na definição pode ser escrito
assim: encontrar um vetor indexado por que
De acordo com a definição ,
um programa linear é um problema de maximização.
Mas a definição é suficientemente flexível
para incluir problemas de minimização:
basta trocar
por .
Exemplo C.2:
Considere o problema de minimizar sob as restrições .
Esse problema equivale a maximizar sob as mesmas restrições.
O segundo problema satisfaz a definição de programa linear.
Exemplo C.3:
Considere o problema de maximizar sob as restrições .
Esse problema equivale a maximizar sob as restrições ,
que satisfaz a definição .
Exemplo C.4:
Considere o problema de encontrar um vetor que maximize
sob as restrições .
Esse problema pode ser reescrito assim:
maximize sujeito a .
Assim, o problema dado satisfaz
a definição
de pl.
Exemplo C.5:
Considere o problema de maximizar sujeito a e .
Isso equivale a maximizar sob as restrições
e ,
sendo a matriz identidade com linhas e colunas indexadas
pelo conjunto de índices de .
Esse segundo problema tem a forma da definição de pl:
basta tomar a justaposição apropriada das matrizes e
e dos vetores e .
Podemos dizer, então, que o problema original é um pl.
C.1.1 Soluções de programas lineares
Considere o pl
e seja
o poliedro .
Uma solução viável
(= feasible solution)
do pl é qualquer vetor de .
Uma solução ótima
do pl é qualquer vetor de para o qual é máximo.
[Essa terminologia tradicional é um tanto ilógica.
Como a definição do pl
inclui a maximização de ,
o ótima
da expressão solução ótima
é redundante.
Além disso, uma solução viável
não é, a rigor,
uma solução do pl
pois não maximiza .]
O pl pode não ter solução ótima
porque é vazio ou porque não tem máximo
(ou seja, porque o máximo é infinito).
Se é vazio, dizemos que o pl é inviável
(= infeasible).
Caso contrário, dizemos que o pl é viável
(= feasible).
Se não é vazio mas não tem máximo,
dizemos que o pl é ilimitado
(= unbounded).
Suponha agora que o pl não é inviável nem ilimitado.
Então, como veremos adiante,
o pl tem uma solução ótima.
Exemplo C.6:
Considere os dois pl's abaixo.
O primeiro é inviável e o segundo é ilimitado.
Exercícios C.1
-
Seja a matriz representada abaixo,
o vetor representado à direita de
e o vetor representado abaixo de .
Escreva por extenso o seguinte pl:
minimize sujeito às restrições .
-
Considere o problema de maximizar sob as restrições .
Mostre que esse problema
satisfaz a definição de programa linear.
-
Considere o pl que consiste em maximizar
sujeito a ,
sendo é uma matriz indexada por ,
um vetor indexado por e
um vetor indexado por .
Suponha que é uma solução ótima do pl
e ,
sendo um subconjunto de .
Mostre que é solução ótima do pl
C.2 Dualidade em programação linear
Há uma fundamental relação dualidade entre programas lineares.
Considere, por exemplo, o programa linear
O dual
desse pl consiste em encontrar um vetor que
A relação básica entre os pl's
e
é conhecida como teorema fraco da dualidade.
Ela dá uma delimitação superior para a expressão que queremos maximizar
e, ao mesmo tempo,
uma delimitação inferior para a expressão que queremos minimizar:
Lema C.1 (teorema fraco da dualidade)
Para qualquer solução viável do programa primal
e qualquer solução viável do programa dual
tem-se .
Prova:
A prova da desigualdade
decorre da associatividade do produto entre matrizes e vetores:
(Note que a prova usa
todas as restrições dos dois pl's.) ■
O lema tem a seguinte consequência:
se então
é solução ótima do pl primal e é solução ótima do
pl dual.
Portanto, para mostrar que uma solução viável do primal é ótima,
basta exibir uma solução viável do dual tal que .
A recíproca dessa observação é garantida pelo
teorema forte da dualidade:
Teorema C.2 (von Neumann)
Se os programas lineares
e
são viáveis então
existe uma solução viável do primeiro
e uma solução viável do segundo tais que .
Se um dos programas lineares é inviável então o outro é
inviável ou ilimitado. ■
A prova do teorema é algorítmica:
o algoritmo Simplex
recebe , e ,
decide se os dois pl's são viáveis e,
em caso afirmativo, devolve e
tais que .
Corolário C.3
Se o poliedro
do programa linear
não é vazio nem ilimitado
então o programa tem uma solução ótima que é vértice
do poliedro. ■
Corolário C.4
Se é um vértice do poliedro
então existe um vetor tal que
é a única solução do
programa linear . ■
Exemplo C.7:
Considere o seguinte par dual de pl's.
Verifique que ambos são inviáveis.
Exemplo C.8:
Considere o seguinte par dual de pl's.
Verifique que o primeiro é inviável e o segundo é ilimitado.
Exemplo C.9:
Considere o seguinte par dual de pl's.
Verifique que o primeiro é ilimitado e o segundo é inviável.
Exemplo C.10:
Considere o seguinte par dual de pl's.
Verifique que ambos são viáveis.
(Mostre uma solução ótima de cada um.)
Exercícios C.2
-
Considere o problema de encontrar que
maximize sob as restrições e .
Enuncie o pl dual.
Verifique o teorema fraco da dualidade para esse par de pl's.
Enuncie o teorema forte da dualidade para esse par de pl's.
-
Considere o problema de encontrar
que maximize sob as restrições
, , ,
Qual o dual desse pl?
O dual é viável? inviável? ilimitado?
-
Considere o seguinte pl:
encontrar que maximize
sob as restrições e .
Mostre que o dual desse pl pede um vetor que minimize
sob as restrições e .
-
Prove o corolário C.3.
-
Prove o corolário C.4.
-
Sejam , , , , , conjuntos finitos disjuntos entre si.
Sejam , , , , , , , ,
matrizes reais indexadas por
respectivamente.
Sejam , , vetores reais indexados
por , e , respectivamente.
Sejam , , vetores reais indexados
por , e , respectivamente.
Seja o conjunto de todos os vetores reais
que satisfazem as restrições abaixo à esquerda
e o conjunto de todos os vetores reais
que satisfazem as restrições abaixo à direita.
Suponha que e e prove que
.
[CCPS A.8]
C.3 Folgas complementares
Seja uma matriz indexada por ,
um vetor indexado por ,
e um vetor indexado por .
Seja uma solução viável do pl
e uma solução viável do pl .
Para cada índice em ,
dizemos que é justo em se
e folgado em se .
Analogamente,
é justo em se
e folgado em se .
(Nesse par dual de pl's,
as folgas envolvem apenas os índices das linhas de .
Em outros pl's,
as folgas podem envolver também os índices das colunas.)
Se é justo sempre que é folgado
(ou, equivalentemente, é justo sempre que é folgado),
dizemos que as folgas de e são
complementares
(= complementary slackness).
No caso dos pl's
e ,
as folgas de e são complementares se,
para cada índice ,
(O ou
não é exclusivo,
pois podemos ter e
para alguns valores de .)
Essa definição de complementaridade de folgas
também pode ser formulada assim:
para cada índice ,
se então
O seguinte lema é consequência imediata de :
Lema C.5 (das folgas complementares)
Para qualquer viável no pl
e qualquer viável no pl , a igualdade
vale se e somente se
as folgas de e são complementares. ■
Exercícios C.3
-
★
Dados números não-negativos e ,
suponha que
.
É verdade que ou ?
Mostre que, para cada , ou .
-
★
Folgas complementares.
Sejam , e vetores indexados por um conjunto .
Suponha que e .
Prove que se e somente se,
para cada em ,
tem-se ou .
-
Prove o lema C.5.
(Veja a prova do lema fraco da dualidade
e o exercício acima).
-
Considere o seguinte pl:
minimizar sob as restrições e .
Enuncie as condições de folgas complementares.
-
Considere o seguinte pl:
maximizar sob as restrições e .
Enuncie o pl dual.
Enuncie as condições de folgas complementares para o par de pl's.
-
Considere o seguinte pl:
maximizar sujeito às restrições e .
Enuncie o pl dual.
Prove o teorema fraco da dualidade para esse par de pl's.
Enuncie as condições de folgas complementares.
Enuncie o teorema forte da dualidade.
-
Considere o problema de encontrar que maximize sob as restrições
e .
Considere também o dual desse pl.
Suponha que é uma solução viável do primeiro pl
e é uma solução viável do segundo.
O que significam as expressões
é justo em
e é justo em
?
Enuncie as condições de folgas complementares para o par dual de pl's.
Prove que,
para qualquer viável no primeiro pl
e qualquer viável no segundo,
temos se e somente se
as folgas de e são complementares.
C.4 Algoritmos para programas lineares
Existem vários algoritmos para o problema de programação linear.
Todo algoritmo para o problema de
maximizar
sob as restrições
recebe uma matriz racional ,
um vetor racional ,
e um vetor racional
e devolve
-
um vetor racional que é solução ótima do problema ou
-
a informação de que o problema é inviável ou
-
a informação de que o problema é ilimitado.
Ademais, se o poliedro tiver algum vértice
então o vetor do caso (a) é um vértice.
O algoritmo de programação linear mais célebre
é o Simplex.
(Veja o livro de Chvátal \cite{chvatal}.)
Um algoritmo mais complexo é o do elipsóide
(= ellipsoid algorithm).
Outro, também complexo, é o algoritmo
do ponto interior
(= interior point method).
Os dois últimos algoritmos são polinomiais:
consomem tempo limitado por um polinômio em e ,
sendo o número de linhas e o número de colunas de .
O Simplex não é polinomial,
mas muito usado na prática porque as instâncias
que consomem tempo excessivo são raras.
C.5 Lema de Farkas
Considere, mais uma vez, o programa linear .
Como tornar evidente que uma dada instância do pl é inviável?
Um vetor de inviabilidade
para o pl
é qualquer vetor indexado por tal que
Um tal vetor é um certificado (computacionalmente verificável)
da inviabilidade do pl:
Lema C.6
Se existe um vetor de inviabilidade para o pl
então o pl é inviável.
Prova:
Seja um vetor de inviabilidade.
Se existisse um vetor tal que teríamos
A contradição mostra que um tal vetor não existe. ■
A recíproca desse lema é conhecida como
lema de Farkas
e decorre do
teorema forte da dualidade:
Lema C.7 (Farkas)
Se o programa linear
é inviável
então existe um vetor de inviabilidade
para . ■
Resultados análogos valem para o pl dual.
Um vetor de inviabilidade
para o pl
é qualquer vetor indexado por tal que
Um tal vetor é um certificado da inviabilidade do
pl
por razões análogas à do lema C.6.
Vale também a versão apropriada do
lema de Farkas.
Exercícios C.5
-
Mostre que um vetor de inviabilidade
para o pl
poderia ter sido definido pelas condições
, e .
-
★
Qual a definição apropriada de vetor de inviabilidade para o seguinte pl:
encontrar um vetor que minimize sob as restrições ,
e ?
(Aqui, o segundo
é o número e o
primeiro
representa um vetor cujos elementos são todos iguais
a
e cujos índices são os mesmos de .)
-
Mostre vetores de inviabilidade para os exemplos C.7
a C.9.
-
Considere o problema de encontrar
que maximize sob as restrições abaixo.
Mostre que o pl é inviável e calcule um vetor de inviabilidade.
-
Suponha dado um vetor de inviabilidade para
o pl .
Mostre que o pl dual é inviável ou ilimitado.
-
Suponha dado um vetor de inviabilidade para
o pl .
Mostre que o pl dual é inviável ou ilimitado.
-
Deduza o lema de Farkas do
teorema forte da dualidade.
C.6 Programação inteira
Dada uma matriz real ,
um vetor real ,
e um vetor real ,
o problema de programação inteira
consiste em encontrar um vetor inteiro que
Muitos problemas de otimização combinatória são naturalmente
representados por programas lineares inteiros.
A restrição de integralidade torna o problema muito difícil.
Não se conhecem algoritmos polinomiais para o problema.
O problema é NP-difícil.
A relaxação linear
de um programa
inteiro
é o pl que se obtém quando a restrição de integralidade é removida.