• Nenhum resultado encontrado

Algoritmo Simplex Para Redes de Transbordo

No documento Curso de Otimização Combinatória (páginas 76-84)

Poderíamos resolver o problema do fluxo de custo mínimo (problema5.1) submetendo o programa linear (1) ao algoritmo Simplex de programação linear (veja o livro de Chvátal [Chv83]). Mas isso é ineficiente, pois o Simplex genérico não leva em conta o caráter peculiar do pl (1). Para tirar proveito da estrutura especial de (1) é preciso desenvolver uma versão especializada do Simplex. Essa versão, conhecida como Sim- plex Para Redes(= Network Simplex), é o algoritmo mais usado na prática para resolver

o problema.

Nessa primeira versão do Simplex Para Redes, tratamos apenas das redes que não têm restrições de capacidade, isto é, das redes (G, b, u, c) em que ue = ∞ para todo cada

arco e. O correspondente conjunto de instâncias do problema do fluxo de custo mínimo é conhecido como problema do transbordo (= transshipment), ou da baldeação. Como as capacidades são todas infinitas, um fluxo só preciso satisfazer b para ser considerado viável.

Fluxos induzidos por árvores

O Simplex Para Redes substitui fluxos por árvores. Uma árvore de um digrafo G é uma árvore T tal que V (T ) = V (G) e E(T ) ⊆ E(G). (Num outro contexto, diríamos que T é uma árvore geradora de G.) Podemos confundir uma árvore com seu conjunto de arcos: se E0 ⊆ E(G) e (V (G), E0)

é uma árvore, podemos dizer que E0 uma árvore de G.

Para garantir que as redes em estudo tenham árvores, restringimos a atenção, daqui em diante, a digrafos conexos. Para digrafos não conexos, o problema do fluxo de custo mínimo pode ser resolvido separadamente em cada componente conexa.

Uma bipartição (T, L) do conjunto de arcos de uma rede (G, b) é arbórea se T é uma árvore. Uma bipartição arbórea (T, L) é viável se algum fluxo viável deixa vazios todos os arco que pertencem a L. Dizemos que um arco e é vazio em relação a um fluxo x se xe= 0.

Um fluxo x é induzido por uma bipartição arbórea (T, L) se x é viável e deixa vazios todos os arcos de L. Como a palavra “induzido” sugere, existe um só fluxo com essa propriedade:

Proposição 5.7 Toda bipartição viável de uma rede (G, b) induz um único fluxo. ESBOÇO DA PROVA: Para cada arco ij de T , xij é igual a b(Aj), sendo Aj a componente

conexa de T − ij que contém j.

Dizemos que uma bipartição viável (T, L) é degenerada se o fluxo induzido pela bi- partição deixa vazio algum arco de T .

Podemos nos dar ao luxo de tratar apenas de fluxos que são induzidos por bipartições arbóreas porque se uma rede tem um fluxo viável então também tem um fluxo indu- zido. Além disso, se a rede tem um fluxo ótimo então também tem um fluxo ótimo que é induzido.

A propósito, um fluxo é induzido (por uma bipartição arbórea) se e somente se todo circuito do digrafo tem um arco vazio. Isso é assim porque estamos supondo o digrafo é conexo.

5.25 Seja x um fluxo num digrafo conexo G. Suponha que todo circuito (dirigido ou não) em G tem um arco vazio. Mostre que x é induzido por alguma bipartição arbórea.

5.26 ? Prove a proposição5.7. Dê um algoritmo que receba uma bipartição arbórea (T, L) de uma rede (G, b), decida se a bipartição é viável, e em caso afirmativo calcule o fluxo induzido por (T, L). 5.27 Fluxo viável implica fluxo induzido. Prove a seguinte afirmação: se uma rede (G, b) tem um fluxo

viável então também tem um fluxo viável induzido por alguma bipartição arbórea. Prove a se- guinte afirmação: se uma rede (G, b, c) tem um fluxo ótimo então também tem um fluxo ótimo que é induzido por alguma bipartição arbórea.

Potenciais induzidos por árvores

Para toda bipartição arbórea (T, L) de uma rede (G, c), existe um potencial y tal que yv + cvw = yw para cada arco vw de T . Dizemos que um tal potencial é induzido por (T, L). Um potencial induzido por uma bipartição arbórea é quase único: se y e y0 são potenciais induzidos então a diferença yv− y0v não depende de v.

Como mostra a seguinte proposição, qualquer potencial induzido por uma bipartição arbórea “mede” os custos de caminhos na árvore. O custo de um caminho P numa rede (G, c) é definido da mesma forma que o custo de um circuito na seção5.4: c(P ) := c( ´E(P )) − c( `E(P )), sendo ´E(P ) o conjunto dos arcos diretos de P e `E(P ) o conjunto dos arcos inversos.

Proposição 5.8 Se y é um potencial induzido por uma bipartição arbórea (T, L) e r e s são dois nós quaisquer então ys− yr = c(P ), sendo P o único caminho simples de r

a s em T .

Dada uma bipartição arbórea (T, L) de G e um arco vw em L, o digrafo T + vw tem um único circuito no qual vw é um arco direto. (O circuito tem a forma P + vw, sendo P o único caminho simples de w a v em T .) Diremos que esse é o circuito fundamental de T + vw. O custo desse circuito fundamental é igual ao custo reduzido yv + cvw− yw

de vw:

Proposição 5.9 Seja y um potencial induzido por uma bipartição arbórea (T, L) e ¯co custo reduzido associado a y. Para todo arco e de G, se e ∈ T então ¯ce = 0e se e ∈ L

então ¯ce = c(C), sendo C o circuito fundamental de T + e.

Exercícios

5.28 ? Dê um algoritmo que receba uma bipartição arbórea (T, L) de uma rede (G, c) e calcule um potencial y induzido pela bipartição.

Simplex Para Transbordo

Ao receber uma rede de transbordo (G, b, c), o algoritmo Simplex Para Redes produz uma bipartição arbórea (T, L) e um potencial y tais que

¯

ce = 0para todo e em T e ¯ce ≥ 0 para todo e em L, (8)

sendo ¯co custo reduzido associado a y. Portanto, o fluxo x induzido por (T, L) é ótimo, de acordo com teorema5.2.

TRANSSHIPMENTSIMPLEX(G, b, c)  G conexo 01 (T, L) ←BIPARTIÇÃOVIÁVEL(G, b)

02 se (T, L) é indefinido

03 então pare  rede inviável 04 repita

05 seja x o fluxo induzido por (T, L) 06 seja y um potencial induzido por (T, L) 07 seja ¯co custo reduzido associado a y 08 se ¯c ≥ 0

09 então devolva (T, L) e y e pare  fluxo ótimo 10 escolha um arco e tal que ¯ce < 0

11 seja C o circuito fundamental de T + e 12 ε ← minxh : h ∈ `E(C)



13 se ε = ∞

14 então pare  rede ilimitada 15 escolha h em `E(C)tal que xh = ε

16 T ← T + e − h 17 L ← L + h − e

A rotina BIPARTIÇÃOVIÁVEL(G, b) produz uma bipartição arbórea viável (T, L). Se uma tal bipartição não existe, a rede é inviável e (T, L) fica indefinido. A rotina pode ser implementada da seguinte maneira: calcule um fluxo viável x (veja o problema de Gale na seção 4.3); em seguida, aplique o algoritmo sugerido no exercício 5.27 para obter uma bipartição viável.

No fim da linha 07, ¯ce = 0para todo arco e de T . No fim da linha 08, as condições de

otimalidade (8) estão satisfeitas e portanto temos um fluxo ótimo. Na linha 14, a rede é ilimitada conforme o teorema5.5.

Nas linhas 16–17, o arco e é transferido de L para T e o arco h é transferido de T para L. No fim da linha 17, (T, L) é uma bipartição viável e o fluxo induzido pela bipartição deixará o arco h vazio.

Não é eficiente calcular x, y e ¯c diretamente a partir de (T, L), como sugerem as li- nhas 05–07. É mais eficiente atualizar essas variáveis a partir de seus valores na iteração anterior. (No caso de x, por exemplo, basta enviar ε unidades de fluxo ao longo do circuito C.) Uma implementação séria do algoritmo deve fazer isso.

Gé dado por sua matriz de adjacências. A função-demanda b e os custos c dos arcos são dadas nas tabelas. p v w q b p − 1 1 − −3 v − − 1 1 +2 w − − − 1 −1 q − − − − +2 pv pw vw vq wq c +10 +30 +10 +10 +10

Suponha que a primeira iteração começa a bipartição viável (T, L) cuja árvore T está indicada em negrito na tabela abaixo. A tabela também registra o fluxo x e o potencial y induzidos por (T, L), bem como os custos reduzidos ¯c. O custo do fluxo é cx = 70.

pv pw vw vq wq x 2 1 0 0 2 ¯ c 0 0 −10 −20 0 y p 0 v +10 w +30 q +40

O algoritmo escolhe o arco vw e envia 1 unidade de fluxo ao longo do circuito (v, w, p, v). O novo fluxo terá custo cx = 70 − 10 × 1 = 60. O arco vw é transferido de L para T e o arco pw é transferido de T para L.

A segunda iteração começa com a bipartição arbórea (T, L) indicada abaixo em negrito. A tabela dá o fluxo induzido x, o potencial induzido y, e o custo reduzido ¯c. O fluxo tem custo cx = 60.

pv pw vw vq wq x 3 0 1 0 2 ¯ c 0 +10 0 −10 0 y p 0 v +10 w +20 q +30

O algoritmo escolhe o arco vq e envia 1 unidade de fluxo ao longo do circuito (v, q, w, v). O novo fluxo terá custo cx = 60 − 10 × 1 = 50.

A terceira iteração começa a bipartição arbórea (T, L), o fluxo x, e o potencial y indicados a seguir: pv pw vw vq wq x 3 0 0 1 1 ¯ c 0 0 +10 0 0 y p 0 v +10 w +10 q +20

Como ¯c ≥ 0, a execução do algoritmo termina. Para detetar eventuais erros aritméticos cometido durante a execução do algoritmo, convém verificar que cx = yb.

No fim da linha 17, o custo do fluxo induzido por (T, L) é cx + ¯ceε(veja a seção 5.4e

a proposição5.9). Se ε não for nulo, o novo fluxo será mais barato que o anterior. Se ε for nulo, o fluxo não se altera, embora a bipartição (T, L) seja modificada. Se isso acontece, a iteração é considerada degenerada. É claro que uma iteração degenerada só acontece se a bipartição arbórea (T, L) no início da iteração for degenerada. Ite- rações degeneradas merecem atenção pois podem levar o algoritmo a ser executado ad æternum.

EXEMPLO7: Considere a rede de transbordo (G, b, c) descrita a seguir. (Faça uma figura.) O grafo Gé dado por sua matriz de adjacências. A função-demanda b e os custos c dos arcos são dados nas

tabelas. a b c d e f b a − 1 1 − − − −4 b − − − − 1 − 0 c − − − 1 1 − −1 d − 1 − − − 1 0 e − − − − − 1 +1 f − − − − − − +4 ab ac be cd ce db df ef c +20 +50 +60 +30 +30 +30 +20 +30

A primeira iteração começa com a bipartição arbórea (T, L) indicada abaixo em negrito. A tabela dá o fluxo induzido x, o potencial induzido y, e o correspondente custo reduzido ¯c. O custo do fluxo é cx = 560. ab ac be cd ce db df ef x 4 0 5 1 0 1 0 4 ¯ c 0 +90 0 0 −90 0 −100 0 y a +10 b +30 c −30 d 0 e +90 f +120

O algoritmo escolhe o arco ce e envia 1 unidade de fluxo ao longo do circuito (c, e, b, d, c). Os arcos cde db ficam vazios. O primeiro sai da árvore mas o segundo continua na árvore. O novo fluxo tem custo cx = 560 − 90 × 1 = 470.

A segunda iteração começa com os dados a seguir. A bipartição arbórea é degenerada. ab ac be cd ce db df ef x 4 0 4 0 1 0 0 4 ¯ c 0 0 0 +90 0 0 −100 0 y a +10 b +30 c +60 d 0 e +90 f +120

O algoritmo escolhe o arco df e portanto o circuito (d, f, e, b, d). Apenas 0 unidades de fluxo podem ser enviadas ao longo do circuito. A iteração é degenerada. O fluxo x não se altera mas os arcos df e db são transferidos entre T e L. A terceira iteração começa com os dados indicados a seguir:

ab ac be cd ce db df ef x 4 0 4 0 1 0 0 4 ¯ c 0 0 0 −10 0 +100 0 0 y a −90 b −70 c −40 d 0 e −10 f +20

O algoritmo escolhe o arco cd e envia 1 unidade de fluxo ao longo do circuito (c, d, f, e, c). O novo fluxo tem custo cx = 470 − 10 × 1 = 460. A quarta iteração começa com os seguintes dados:

ab ac be cd ce db df ef x 4 0 4 1 0 0 1 3 ¯ c 0 −10 0 0 +10 +100 0 0 y a −90 b −70 c −30 d 0 e −10 f +20

O algoritmo escolhe o arco ac e envia 3 unidades de fluxo ao longo do circuito (a, c, d, f, e, b, a). O novo fluxo tem custo cx = 460 − 10 × 3 = 430. A quinta iteração começa com os seguintes dados:

ab ac be cd ce db df ef x 1 3 1 4 0 0 4 0 ¯ c 0 0 0 0 0 +90 0 +10 y a −80 b −60 c −30 d 0 e 0 f +20 Como ¯c ≥ 0, a execução do algoritmo termina.

Exercícios

5.30 Resolva a instância do problema do transbordo indicada na figura. Use o algoritmo Simplex Para Transbordo. Os números junto aos nós são as demandas b. Os números nos arcos são os custos c. Comece com o fluxo x induzido pela bipartição arbórea (T, L) representada pelas linhas mais grossas.[CCPS 4.22]

5.31 Escreva uma implementação da rotina BIPARTIÇÃOVIÁVEL.

5.32 Implementação eficiente. Mostre como representar T de maneira eficiente no algoritmo TRANS- SHIPMENTSIMPLEX. Mostre como os valores x, y e ¯c podem ser calculados, a cada iteração, a partir dos valores de x, y e ¯cna iteração anterior (evitando assim que os valores sejam calculadas diretamente a partir de (T, L)).

Número de iterações

O algoritmo TRANSSHIPMENTSIMPLEX, tal como descrito acima, é infinito no pior caso, embora o pior caso seja muito raro na prática.

Cada iteração não-degenerada diminui o custo do fluxo. Como os fluxos são induzidos por bipartições arbóreas e o número de árvores G é finito, o número de iterações não- degeneradas também é finito. Já o número de iterações degeneradas pode ser infinito, pois uma mesma bipartição arbórea degenerada (T, L) pode aparecer no início de duas (e portanto infinitas) iterações.

Para evitar esse desastre, basta que no início de cada iteração a bipartição arbórea (T, L) seja mais que viável, no sentido que passamos a definir.

Antes de começar a execução do algoritmo, escolha um nó r (arbitrário mas fixo) para fazer o papel de raiz. No início de cada iteração, para cada nó j, seja Pjo único caminho

de r a j em T . A bipartição arbórea viável (T, L) é considerada fortemente viável se o fluxo induzido pela bipartição tem a seguinte propriedade: cada arco vazio de T

“aponta para longe de r”, ou seja, se ij é um arco vazio de T então ij é um arco (direto) de Pj.

Suponha que (T, L) é fortemente viável no início de uma iteração. Para que a bipartição (T −e+h, L−h+e) no início da linha 16 do código também seja fortemente viável, é preciso escolher o arco h na linha 15 do código como passamos a explicar. Seja s o nó de C que está mais próximo de r em T , isto é, o último nó comum aos caminhos Pv

e Pw. Percorra o circuito fundamental C a partir de s e

escolha para h o primeiro arco em `E(C)que tenha xh = ε. (9)

Com isso, a bipartição (T +e−h, L−h+e) será fortemente viável.

Se (T, L) é fortemente viável no início de todas as iterações, a execução de TRANS- SHIPMENTSIMPLEX termina depois de um número finito de iterações. Resta apenas encontrar uma maneira de fazer com que a primeira bipartição arbórea (linha 01 do código) seja fortemente viável. Isso é um bom exercício.

EXEMPLO8: Considere a rede de transbordo (G, b, c) descrita a seguir. (Faça uma figura.) O grafo

Gé dado por sua matriz de adjacências. Os custos c, o potencial y, e o custos reduzidos ¯cforam omitidos. Adote o nó r com raiz e suponha que ¯cij < 0.

r i j k l p q b r − − − − 1 − − −2 i − − 1 − − − 1 −1 j − − − − − − − +1 k − − 1 − − − − +1 l − − − 1 − 1 − 0 p − − − − − − − +1 q − − − − − 1 − 0 rl ij kj lk lp qp iq x 2 0 1 2 0 1 1

Execute uma iteração do Simplex Para Transbordo começando com a bipartição arbórea (T, L) que tem T = {rl, kj, lk, lp, qp, iq}. Note que (T, L) é fortemente viável. O algoritmo escolhe o arco ij pois ¯cij < 0. O circuito fundamental de T + ij é (i, j, k, l, p, q, i). A largura do circuito é 1. Qualquer

um dos arcos kj, qp, iq poderia ser removido de T para dar lugar a ij. Para garantir que a nova bipartição arbórea seja fortemente viável, o algoritmo remove o arco qp.

EXEMPLO9: Considere a rede de transbordo (G, b, c) descrita a seguir. (Faça uma figura.) O grafo Gé dado por sua matriz de adjacências. A função-demanda b e os custos c dos arcos são dadas nas tabelas. Adote o nó p como raiz.[CCPS fig.4.10]

p v w q b p − − − − +10 v 1 − 1 1 −10 w 1 − − 1 −10 q − − − − +10 vp wp vw vq wq c +10 +10 +10 +10 +20

A primeira iteração começa com a bipartição arbórea (T, L) indicada a seguir (os arcos de T estão destacados em negrito). A bipartição é degenerada mas fortemente viável. O fluxo induzido tem custo cx = 30. vp wp vw vq wq x 1 0 0 0 1 ¯ c 0 +10 0 −20 0 y p 0 v −10 w 0 q +20

O algoritmo escolhe o arco vq. O correspondente circuito fundamental, escrito a partir do nó mais próximo da raiz, é (v, q, w, v). Como ε = 0, a iteração é degenerada. O envio de 0 unidades de fluxo ao longo do circuito não altera o fluxo mas altera a bipartição arbórea.

A segunda iteração começa com uma bipartição arbórea degenerada mas fortemente viável. O fluxo induzido tem custo cx = 30.

vp wp vw vq wq x 1 0 0 0 1 ¯ c 0 −10 +20 0 0 y p 0 v −10 w −20 q 0

O algoritmo escolhe o arco wp. O correspondente circuito fundamental, a partir do nó mais pró- ximo da raiz, é (p, v, q, w, p). Temos ε = 1 e o arco vp faz o papel de h. O envio de 1 unidade de fluxo ao longo do circuito produz um novo fluxo de custo cx = 30 − 10 × 1 = 20.

A terceira iteração começa com uma bipartição arbórea degenerada mas fortemente viável. (Se a iteração anterior tivesse escolhido h = wq, a bipartição não seria fortemente viável.)

vp wp vw vq wq x 0 10 0 10 0 ¯ c +10 0 0 0 0 y p 0 v 0 w −10 q +10 Como ¯c ≥ 0, a execução do algoritmo termina.

Exercícios

5.33 Suponha que (T, L) é fortemente viável no início de uma iteração em que ε = 0. Mostre que h estará em Pw(e não em Pv). Mostre que h será o último arco direto vazio de Pw.

5.34 Bipartição arbórea inicial. Encontre uma maneira de construir a bipartição viável (T, L) na linha 01 do código de modo que ela seja fortemente viável.

5.35 Exemplo 7. Estude o exemplo 7. Adote o nó d como raiz e verifique que no início de cada iteração do algoritmo a bipartição arbórea (T, L) é fortemente viável.

5.36 De fortemente viável a fortemente viável. Suponha que (T, L) é fortemente viável e h é escolhido de acordo com a regra (9). Mostre que no início da linha 16 a bipartição arbórea (T +e−h, L+h−e) é fortemente viável.

5.37 O número de iterações é finito. Seja r a raiz de G e defina y na linha 06 de modo que yr= 0(e portanto

yv = c(Pv)para cada v). Suponha que (T, L) é fortemente viável no início de uma iteração e seja

Y o valor da somaP(yv : v ∈ V )no fim da linha 06. Suponha que ε é nulo nessa iteração. Prove

que na próxima iteração, no fim da linha 06, a somaP(yv: v ∈ V )será menor que Y . Deduza daí

que o número de iterações degeneradas é finito. (Sugestão: Veja o teorema 4.12 de CCPS.)

No documento Curso de Otimização Combinatória (páginas 76-84)