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 V e E, uma matriz A indexada por V×E, e vetores b e c indexados por V e E respectivamente, encontrar um vetor x que (1)maximizecxsob as restriçõesAxb.

A expressão maximize cx deve ser entendida assim: procuramos x tal que cxcx para todo x que satisfaça as restrições Axb. Cada desigualdade A[v,]xb[v] é uma restrição do problema. O número cx é o valor de x. O máximo de cx é o valor ótimo do problema.

É usual supor que a matriz A e os vetores b e c 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 A e os vetores b e c representados abaixo, com b na vertical à direita da matriz e c na horizontal abaixo da matriz:

1112131415162122232425263132333435364142434445465152535455

O problema de maximizar cx sujeito às restrições Axb pode ser escrito explicitamente assim: encontrar números x1, x2, x3, x4, x5 que maximizem o valor da combinação linear 51x1+52x2+53x3+54x4+55x5  11 enquanto satisfazem as restrições lineares 11x1+12x2+13x3+14x4+15x5  1621x1+22x2+23x3+24x4+25x5  2631x1+32x2+33x3+34x4+35x5  3641x1+42x2+43x3+44x4+45x5  46. (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 (1) pode ser escrito assim: encontrar um vetor x indexado por E que maximizeeEc[e]x[e]sujeito aeEA[v,e]x[e]b[v]para todo v em V.

De acordo com a definição (1), um programa linear é um problema de maximização. Mas a definição é suficientemente flexível para incluir problemas de minimização: basta trocar c por c.

Exemplo C.2: Considere o problema de minimizar cx sob as restrições Axb. Esse problema equivale a maximizar cx sob as mesmas restrições. O segundo problema satisfaz a definição (1) de programa linear.

Exemplo C.3: Considere o problema de maximizar cx sob as restrições Axb. Esse problema equivale a maximizar cx sob as restrições Axb, que satisfaz a definição (1).

Exemplo C.4: Considere o problema de encontrar um vetor y que maximize yb sob as restrições yAc. Esse problema pode ser reescrito assim: maximize by sujeito a ATyc. Assim, o problema dado satisfaz a definição (1) de pl.

Exemplo C.5: Considere o problema de maximizar cx sujeito a Axb e x0. Isso equivale a maximizar cx sob as restrições Axb e Ix0, sendo I a matriz identidade com linhas e colunas indexadas pelo conjunto de índices de x. Esse segundo problema tem a forma da definição (1) de pl: basta tomar a justaposição apropriada das matrizes A e I e dos vetores b e 0. Podemos dizer, então, que o problema original é um pl.

C.1.1 Soluções de programas lineares

Considere o pl (1) e seja P o poliedro {x:Axb}. Uma solução viável (= feasible solution) do pl é qualquer vetor de P. Uma solução ótima do pl é qualquer vetor x de P para o qual cx é máximo.  [Essa terminologia tradicional é um tanto ilógica. Como a definição do pl inclui a maximização de cx, 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 cx.]  O  pl pode não ter solução ótima porque P é vazio ou porque cx não tem máximo (ou seja, porque o máximo é infinito). Se P é vazio, dizemos que o pl é inviável (= infeasible). Caso contrário, dizemos que o pl é viável (= feasible). Se P não é vazio mas cx não tem máximo, dizemos que o pl é ilimitado (= unbounded).

Suponha agora que o pl (1) 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.

maximizex1+x2sob as restriçõesx1+x22x1+x23maximizex2sob as restriçõesx1+x23x1+x22

Exercícios C.1

  1. Seja A a matriz representada abaixo, b o vetor representado à direita de A e c o vetor representado abaixo de A. Escreva por extenso o seguinte pl: minimize cx sujeito às restrições Axb.
    10+110+2010002+1+10010001+1+1011111
  2. Considere o problema de maximizar cx sob as restrições Ax=b. Mostre que esse problema satisfaz a definição (1) de programa linear.
  3. Considere o pl que consiste em maximizar cx sujeito a Axb, sendo A é uma matriz indexada por V×E, b um vetor indexado por V e c um vetor indexado por E. Suponha que s é uma solução ótima do pl e s[VJ]=0, sendo J um subconjunto de E. Mostre que s[J] é solução ótima do pl maximizec[J]xsujeito aA[V,J]xb.

C.2 Dualidade em programação linear

Há uma fundamental relação dualidade entre programas lineares. Considere, por exemplo, o programa linear (2)maximize cxsujeito a Axb.

dual desse pl consiste em encontrar um vetor y que (3)minimize ybsujeito a yA=c  ey0. A relação básica entre os pl's (2) e (3) é 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 x do programa primal (2) e qualquer solução viável y do programa dual (3) tem-se  cxyb.

Prova: A prova da desigualdade decorre da associatividade do produto entre matrizes e vetores: (4)cx = (yA)x = y(Ax)  yb. (Note que a prova usa todas as restrições dos dois pl's.) ■

O lema tem a seguinte consequência: se cx=yb então x é solução ótima do pl primal e y é solução ótima do pl dual. Portanto, para mostrar que uma solução viável x do primal é ótima, basta exibir uma solução viável y do dual tal que cx=yb. A recíproca dessa observação é garantida pelo teorema forte da dualidade:

Teorema C.2 (von Neumann) Se os programas lineares (2) e (3) são viáveis então existe uma solução viável x do primeiro e uma solução viável y do segundo tais que cx=yb. 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 A, b e c, decide se os dois pl's são viáveis e, em caso afirmativo, devolve x e y tais que cx=yb.

Corolário C.3 Se o poliedro {x:Axb} do programa linear (2) não é vazio nem ilimitado então o programa tem uma solução ótima que é vértice do poliedro. ■

Corolário C.4 Se v é um vértice do poliedro {x:Axb} então existe um vetor c tal que v é a única solução do programa linear (2). ■

Exemplo C.7: Considere o seguinte par dual de pl's. Verifique que ambos são inviáveis.

maximize2x1+x2sujeito ax1+x24x1x22x0minimize4y1+2y2sujeito ay1+y22y1y21y0

Exemplo C.8: Considere o seguinte par dual de pl's. Verifique que o primeiro é inviável e o segundo é ilimitado.

maximize2x1+x2sujeito ax1x24x1+x22x0minimize4y1+2y2sujeito ay1+y22y1+y21y0

Exemplo C.9: Considere o seguinte par dual de pl's. Verifique que o primeiro é ilimitado e o segundo é inviável.

maximize2x1+x2sujeito ax1x24x1x22x0minimize4y1+2y2sujeito ay1+y22y1y21y0

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.)

maximize2x1+x2sujeito ax1+x24x1x22x0minimize4y1+2y2sujeito ay1+y22y1y21y0

Exercícios C.2

  1. Considere o problema de encontrar x que maximize cx sob as restrições Ax=b e x0. 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.
  2. Considere o problema de encontrar x que maximize x1+2x2+3x3 sob as restrições x10, x20, x30,
    x1+x2+x3=10ex1+x2+4x3=20.

    Qual o dual desse pl? O dual é viável? inviável? ilimitado?

  3. Considere o seguinte pl: encontrar x que maximize cx sob as restrições Axb e x0. Mostre que o dual desse pl pede um vetor y que minimize yb sob as restrições yAc e y0.
  4. Prove o corolário C.3.
  5. Prove o corolário C.4.
  6. Sejam L, M, N, O, P, Q conjuntos finitos disjuntos entre si. Sejam A, B, C, D, E, F, G, H, K matrizes reais indexadas por
    L×O,L×P,L×Q,M×O,M×P,M×Q,N×O,N×P,N×Q,

    respectivamente. Sejam a, b, c vetores reais indexados por L, M e N, respectivamente. Sejam d, e, f vetores reais indexados por O, P e Q, respectivamente. Seja X o conjunto de todos os vetores reais (x,y,z) que satisfazem as restrições abaixo à esquerda e Y o conjunto de todos os vetores reais (u,v,w) que satisfazem as restrições abaixo à direita. Ax+By+CzaDx+Ey+Fz=bGx+Hy+Kzcx0z0uA+vD+wGduB+vE+wH=euC+vF+wKfu0w0 Suponha que X e Y e prove que max{dx+ey+fz:(x,y,z)X}=min{ua+vb+wc:(u,v,w)Y}. [CCPS A.8]

C.3 Folgas complementares

Seja A uma matriz indexada por V×E, b um vetor indexado por V, e c um vetor indexado por E. Seja x uma solução viável do pl (2) e y uma solução viável do pl (3). Para cada índice i em V, dizemos que x é justo em i se (Ax)[i]=b[i] e folgado em i se (Ax)[i]<b[i]. Analogamente, y é justo em i se y[i]=0 e folgado em i se y[i]>0.  (Nesse par dual de pl's, as folgas envolvem apenas os índices das linhas de A. Em outros pl's, as folgas podem envolver também os índices das colunas.)

Se x é justo sempre que y é folgado (ou, equivalentemente, y é justo sempre que x é folgado), dizemos que as folgas de x e y são complementares (= complementary slack­ness). No caso dos pl's (2) e (3), as folgas de x e y são complementares se, para cada índice i, (5)(Ax)[i]=b[i]ouy[i]=0.

(O ou não é exclusivo, pois podemos ter (Ax)[i]=b[i] e y[i]=0 para alguns valores de i.)  Essa definição de complementaridade de folgas também pode ser formulada assim: para cada índice i,

se  (Ax)[i]<b[i]  então  y[i]=0.

O seguinte lema é consequência imediata de (4):

Lema C.5 (das folgas complementares) Para qualquer x viável no pl (2) e qualquer y viável no pl (3), a igualdade  cx=yb  vale se e somente se as folgas de x e y são complementares. ■

Exercícios C.3

  1. ★ Dados números não-negativos a1,a2,,am e b1,b2,,bm, suponha que a1b1+a2b2++ambm=0. É verdade que a1==am=0 ou b1==bm=0? Mostre que, para cada i,  ai=0 ou bi=0.
  2. Folgas complementares. Sejam a, b e c vetores indexados por um conjunto E. Suponha que a0 e bc. Prove que ab=ac se e somente se, para cada e em E, tem-se ae=0 ou be=ce.
  3. Prove o lema C.5. (Veja a prova do lema fraco da dualidade e o exercício acima).
  4. Considere o seguinte pl: minimizar cx sob as restrições Ax=b e x0. Enuncie as condições de folgas complementares.
  5. Considere o seguinte pl: maximizar cx sob as restrições Ax=b e x0. Enuncie o pl dual. Enuncie as condições de folgas complementares para o par de pl's.
  6. Considere o seguinte pl: maximizar cx sujeito às restrições Axb e x0. 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.
  7. Considere o problema de encontrar x que maximize cx sob as restrições Ax=b e x0. Considere também o dual desse pl. Suponha que x é uma solução viável do primeiro pl e y é uma solução viável do segundo. O que significam as expressões x é justo em j e y é justo em j? Enuncie as condições de folgas complementares para o par dual de pl's. Prove que, para qualquer x viável no primeiro pl e qualquer y viável no segundo, temos cx=yb se e somente se as folgas de x e y 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  cx  sob as restrições  Axb  recebe uma matriz racional A, um vetor racional b, e um vetor racional c e devolve

  1. um vetor racional x que é solução ótima do problema ou
  2. a informação de que o problema é inviável ou
  3. a informação de que o problema é ilimitado.

Ademais, se o poliedro {x:Axb} tiver algum vértice então o vetor x 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 al­go­rithm).  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 n e m, sendo m o número de linhas e n o número de colunas de A. 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 (2). Como tornar evidente que uma dada instância do pl é inviável?  Um vetor de inviabilidade para o pl (2) é qualquer vetor y indexado por V tal que (6)yA=0ey0eyb<0.

Um tal vetor é um certificado (computacionalmente verificável) da inviabilidade do pl:

Lema C.6 Se existe um vetor de inviabilidade para o pl (2) então o pl é inviável.

Prova: Seja y um vetor de inviabilidade. Se existisse um vetor x tal que Axb teríamos 0=(yA)x=y(Ax)yb<0. A contradição 0<0 mostra que um tal vetor x 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 (2) é inviável então existe um vetor de inviabilidade para (2). ■

Resultados análogos valem para o pl dual. Um vetor de inviabilidade para o pl (3) é qualquer vetor x indexado por E tal que (7)Ax0ecx>0.

Um tal vetor é um certificado da inviabilidade do pl (3) por razões análogas à do lema C.6. Vale também a versão apropriada do lema de Farkas.

Exercícios C.5

  1. Mostre que um vetor de inviabilidade para o pl (2) poderia ter sido definido pelas condições  yA=0, y0 e yb>0.
  2. ★ Qual a definição apropriada de vetor de inviabilidade para o seguinte pl: encontrar um vetor x que minimize cx sob as restrições Ax=b, 1x=1 e x0?  (Aqui, o segundo 1 é o número 1 e o primeiro 1 representa um vetor cujos elementos são todos iguais a 1 e cujos índices são os mesmos de x.)
  3. Mostre vetores de inviabilidade para os exemplos C.7C.9.
  4. Considere o problema de encontrar x0 que maximize x1+2x2+3x3 sob as restrições abaixo. Mostre que o pl é inviável e calcule um vetor de inviabilidade.
    x1+x2+x3=10x1+x2+4x3=20
  5. Suponha dado um vetor de inviabilidade para o pl (2). Mostre que o pl dual (3) é inviável ou ilimitado.
  6. Suponha dado um vetor de inviabilidade para o pl (3). Mostre que o pl dual (2) é inviável ou ilimitado.
  7. Deduza o lema de Farkas do teorema forte da dualidade.

C.6 Programação inteira

Dada uma matriz real A, um vetor real b, e um vetor real c, o problema de programação inteira consiste em encontrar um vetor inteiro z que (8)maximizeczsob as restriçõesAzb.

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.