12.04.2013 Views

Problema do Carteiro Chinês - DCA

Problema do Carteiro Chinês - DCA

Problema do Carteiro Chinês - DCA

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Alunos:<br />

CENTRO DE CIÊNCIAS EXATAS<br />

DEPARTAMENTO DE COMPUTAÇ ÃO<br />

TEORIA DA COMPUTAÇ ÃO<br />

<strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong><br />

André Ricar<strong>do</strong> Gonçalves<br />

Luiz Gustavo Andrade <strong>do</strong>s Santos<br />

Paulo Roberto Silla<br />

Profa. Linnyer Beatrys Ruiz<br />

LONDRINA - PR<br />

2007


André Ricar<strong>do</strong> Gonçalves<br />

Luiz Gustavo Andrade <strong>do</strong>s Santos<br />

Paulo Roberto Silla<br />

<strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong><br />

Trabalho apresenta<strong>do</strong> à Universidade Estadual de Lon-<br />

drina, como parte de requisito de avaliação <strong>do</strong> 2 o Bimestre<br />

da disciplina de Teoria da Computação, <strong>do</strong> curso de Ciência<br />

da Computação sobre a orientação da Profa. Linnyer Bea-<br />

trys Ruiz.<br />

LONDRINA - PR<br />

2007


Sumário<br />

1 Introdução 5<br />

2 Teoria <strong>do</strong>s Grafos 6<br />

3 NP-Completude 10<br />

3.1 <strong>Problema</strong>s de Decisão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

3.2 Redução através de linguagem . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

3.3 Classe P e classe NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />

4 Histórico 12<br />

5 O <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> 13<br />

5.1 <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos não orienta<strong>do</strong>s . . . . . . . . . . 14<br />

5.1.1 Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />

5.2 <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos orienta<strong>do</strong>s . . . . . . . . . . . . . 19<br />

5.3 <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos mistos . . . . . . . . . . . . . . . 20<br />

5.4 <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> Capacita<strong>do</strong> . . . . . . . . . . . . . . . . . . . 20<br />

5.5 Algoritmos Implementa<strong>do</strong>s . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

6 Aplicações 23<br />

6.1 Roteamento de Veículos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

6.2 Escala de tripulação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

6.3 Varre<strong>do</strong>r de Ruas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

7 Conclusão 25<br />

Apêndice 25<br />

Referências Bibliográficas 28<br />

3


Lista de Figuras<br />

4.1 Representação das Sete Pontes de Königsberg . . . . . . . . . . . . . . . . 12<br />

4.2 Grafo - Sete Pontes de Königsberg . . . . . . . . . . . . . . . . . . . . . . 12<br />

5.1 Um grafo não Euleriano . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

5.2 Caminhos mais curtos partin<strong>do</strong> de A e posteriormente de C. . . . . . . . . 18<br />

5.3 Grafo após matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />

4


Capítulo 1<br />

Introdução<br />

Conheci<strong>do</strong> como <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong>, por ter si<strong>do</strong> proposto na revista Chinese<br />

Mathematics por Mei-Ko Kwan em 1962 e utilizar a rota de um carteiro como cenário, este<br />

intrigante problema possui grandes aplicações, como por exemplo na área de roteamento<br />

de veículos.<br />

Discutiremos, nesse trabalho, algumas maneiras de encontrar soluções em diferentes<br />

situações, tais como grafos orienta<strong>do</strong>s, não orienta<strong>do</strong>s e mistos. Para que os conceitos<br />

aplica<strong>do</strong>s durante o desenvolvimento <strong>do</strong> texto sejam corretamente assimila<strong>do</strong>s, na próxima<br />

seção encontra-se uma breve introdução sobre a teoria <strong>do</strong>s grafos.<br />

5


Capítulo 2<br />

Teoria <strong>do</strong>s Grafos<br />

Reservamos esta seção para introduzir alguns conceitos da Teoria <strong>do</strong>s Grafos que serão<br />

utiliza<strong>do</strong>s durante o desenvolvimento <strong>do</strong> texto:<br />

1. Vértice: objeto simples que pode ter nomes e outros atributos, da qual parte(m)<br />

e/ou sai(em) aresta(s).<br />

2. Aresta ou arco: unidade que conecta <strong>do</strong>is vértices, distintos ou não. Notação:<br />

{v1, v2} - aresta que liga vértice v1 ao vértice v2. Se existir a aresta {v1, v2}, então<br />

v1 e v2 são ditos vértices adjacentes.<br />

Tipos de aresta:<br />

• Laço: aresta na qual o vértice de destino é o mesmo da origem ( {v, v} ).<br />

Arestas paralelas: duas arestas e1 = {v1, v2} e e2 = {v3, v4} são ditas paralelas<br />

se v1 = v3 e v2 = v4.<br />

3. Grafo: um grafo G é defini<strong>do</strong> como um par G = (V, E), onde:<br />

V = V(G): conjunto finito de vértices <strong>do</strong> grafo G.<br />

E = E(G): conjunto de arestas <strong>do</strong> grafo G, onde E ⊆ V x V.<br />

Tipos de Grafo:<br />

Grafo simples: um grafo que não apresenta laços nem arestas paralelas. Grafo<br />

orienta<strong>do</strong>(dirigi<strong>do</strong>): G é um grafo orienta<strong>do</strong> se E(G) é um conjunto de pares or-<br />

dena<strong>do</strong>s de vértices. Ou seja, as arestas de E(G) possuem direção (orientação).<br />

Grafo não orienta<strong>do</strong> (não dirigi<strong>do</strong>): G é um grafo não orienta<strong>do</strong> E(G) é um<br />

conjunto de pares não ordena<strong>do</strong>s de vértices. Ou seja, as arestas de E(G) não<br />

possuem direção.<br />

6


Grafo misto: um grafo G é dito misto se apresenta arestas com e sem direção.<br />

E(G) é forma<strong>do</strong> pela união <strong>do</strong>s conjuntos disjuntos E1(G) e E2(G). Onde E1(G)<br />

é o conjunto de arestas com direção e E2(G) é o conjunto de arestas sem direção.<br />

4. Grau de um vértice: determina<strong>do</strong> pelo número de arestas que ele possui. Se esse<br />

número for par, o grau é dito par, caso contrário, ímpar. Em grafos dirigi<strong>do</strong>s, cada<br />

vértice possui semi-grau interno (grau de entrada) para as arestas que chegam nele,<br />

e semi-grau externo (grau de saída) para as arestas que dele saem.<br />

Nota: em um grafo não dirigi<strong>do</strong>, cada laço tem o mesmo valor de duas arestas.<br />

Notação:<br />

g(e): grau de um vértice<br />

gin(e): grau de entrada<br />

gout(e): grau de saída<br />

Um grafo orienta<strong>do</strong> G = (V, E) que satisfaz gout(e) = gin(e) para to<strong>do</strong>s os vértices<br />

e ∈ E(G), é dito pseu<strong>do</strong>-simétrico.<br />

5. Grau mínimo de um grafo: é o mesmo número <strong>do</strong> grau <strong>do</strong> vértice pertencente<br />

ao grafo que possui menor grau.<br />

6. Grau máximo de um grafo: corresponde ao número <strong>do</strong> grau <strong>do</strong> vértice perten-<br />

cente ao grafo que possui maior grau.<br />

7. Grafo regular: um grafo é dito regular quan<strong>do</strong> to<strong>do</strong>s os seus vértices apresentam<br />

mesmo grau. O grau máximo é igual ao grau mínimo.<br />

8. Peso de uma aresta: utilizadas quan<strong>do</strong> em um grafo as arestas apresentam ca-<br />

racterísticas diferentes umas das outras. Este peso pode ser expresso em qualquer<br />

unidade (como um número natural, inteiro, real, entre outros) dependen<strong>do</strong> da abor-<br />

dagem a<strong>do</strong>tada. Também é possível ter mais alguns atributos associa<strong>do</strong>s a uma<br />

aresta. Notação: w(e).<br />

9. Caminho (passeio): um caminho em um grafo G = (V, E) é uma seqüência<br />

composta de vértices e arestas (v1, e1, v2, e2, ..., vk−1, ek−1, vk) com ei=vi, vi+1 e 1<br />

≤ i ¡ |V(G)|. Um vértice vk é dito alcançável por vi, quan<strong>do</strong> existe um caminho de vi<br />

até vk. Num grafo simples, pode-se representar um caminho apenas pela seqüência<br />

de vértices. A quantidade de arestas designa o comprimento <strong>do</strong> caminho.<br />

10. Caminho simples: um passeio que não apresenta repetição de vértices.<br />

7


11. Circuito (ciclo): um caminho onde o último e o primeiro vértice da seqüência<br />

denotam o mesmo vértice. Se to<strong>do</strong>s os vértices <strong>do</strong> circuito forem distintos, este<br />

circuito é designa<strong>do</strong> circuito elementar.<br />

Proposição 2.1<br />

É conheci<strong>do</strong> como circuito de Hamilton, um circuito elementar<br />

que contenha to<strong>do</strong>s os vértices de um grafo não orienta<strong>do</strong>.<br />

Um circuito é simples se todas as arestas que o constituem são distintas.<br />

Proposição 2.2<br />

É conheci<strong>do</strong> como circuito de Euller, um circuito simples que in-<br />

clui todas as arestas de um grafo não orienta<strong>do</strong>.<br />

12. Grafo cíclico: um grafo que apresenta circuito(s) e a seqüência deste circuito<br />

é formada por, no mínimo, três vértices distintos. Um grafo que não apresente<br />

circuito é chama<strong>do</strong> de acíclico ou floresta. Numa floresta, um vértice com grau 1 é<br />

denomina<strong>do</strong> folha. A notação Cn indicar ˘m grafo que é um circuito de comprimento<br />

n.<br />

13. Grafo conexo: da<strong>do</strong> {v1, v2} um par qualquer de vértices de um grafo G. G será<br />

conexo se existir um caminho com extremos v1 e v2.<br />

14. Árvore: é um grafo conexo e acíclico.<br />

15. Complemento de um grafo: seja V’ o conjunto de to<strong>do</strong>s os pares não-ordena<strong>do</strong>s<br />

de elementos de V. Se V tem n elementos então V’ tem (n(n-1)/2) elementos. Os<br />

elementos de V’ são os subconjuntos de V de cardinalidade 2. Então, os elementos<br />

de V’ assumirão a forma {v1, v2}, com v1 = v2 e v1, v2 ∈ V.<br />

O complemento de um grafo G = (V, E) é o grafo H = (V, V(2) - E). Note que o<br />

grafo H possui os mesmos vértices de G mas nenhuma aresta que G possuirá.<br />

Notação: ¯ G = H.<br />

16. Grafo completo: um grafo simples de n vértices forma<strong>do</strong> com todas as possibili-<br />

dades de arestas.<br />

Notação: Kn O complemento de um grafo completo será o grafo vazio com E( ¯ G) =<br />

∅, que não possuirá arestas.<br />

Notação: ¯ Kn<br />

17. Subgrafo: da<strong>do</strong> G’ = (V’, E’), G’ será subgrafo de G = (V, E) se V’ ⊆ V, E’ ⊆ E.<br />

Assim, G’ ⊆ G.<br />

Nota: V’ deve ser um conjunto não-vazio.<br />

Tipos de subgrafo:<br />

8


Subgrafo gera<strong>do</strong>r: da<strong>do</strong> G’ = (V’, E’) um subgrafo de G = (V, E), se V’ ⊆ V<br />

então G’ é chama<strong>do</strong> de subgrafo gera<strong>do</strong>r de G.<br />

Subgrafo próprio: quan<strong>do</strong> V’ = V ou E’ = E.<br />

Subgrafo induzi<strong>do</strong>: um subgrafo de G induzi<strong>do</strong> por um conjunto X ⊆ V(G) é o<br />

grafo (X, A) onde A é o conjunto E(G) tais que estas arestas possuam as duas<br />

extremidades em X, desde que A não seja vazio.<br />

Notação: G[X]<br />

Subgrafo maximal: da<strong>do</strong> H um subgrafo conexo de um grafo G, será maximal<br />

se não for subgrafo próprio de nenhum subgrafo conexo de G.<br />

18. Componente (componente conexa) de um grafo: qualquer subgrafo conexo<br />

maximal <strong>do</strong> grafo. Assim, to<strong>do</strong> vértice de um grafo conexo pertence a somente um<br />

componente e se o grafo tem um único componente, ele será conexo.<br />

19. Fecho transitivo de um vértice: to<strong>do</strong>s os vértices que são alcança<strong>do</strong>s (transiti-<br />

vamente) a partir de um vértice vk formam o conjunto fecho transitivo de vk.<br />

20. Fecho transitivo inverso de um vértice: o conjunto de to<strong>do</strong>s os vértices que<br />

(transitivamente) alcançam um vértice vk é chama<strong>do</strong> de fecho transitivo inverso de<br />

vk.<br />

21. Componente fortemente conexa de um vértice: o conjunto de to<strong>do</strong>s os<br />

vértices que têm ligação com um vértice vk por um caminho de ida e volta. Ou<br />

seja, este conjunto é forma<strong>do</strong> pela intersecção <strong>do</strong>s fechos transitivo e transitivo in-<br />

verso de vk.<br />

22. Grafo parcial: é um grafo H = (V, A) será grafo parcial de G = (V, E) se A ⊆ E<br />

e V(H) = V(G).<br />

23. Grafo biparti<strong>do</strong>: um grafo G = (V, E) será considera<strong>do</strong> biparti<strong>do</strong> se V(G) possa<br />

ser particiona<strong>do</strong> em <strong>do</strong>is subconjuntos disjuntos A e B tal que V = A ∪ B, e para<br />

cada aresta e = {v1, v2} de E(G) (v1 ∈ A e v2 ∈ B) ou (v1 ∈ B e v2 ∈ A).<br />

24. Grafo biparti<strong>do</strong> completo: é um grafo biparti<strong>do</strong> simples conten<strong>do</strong> todas as<br />

possíveis arestas.<br />

Notação: Kn,m , com n = |A| e m = |B|.<br />

9


Capítulo 3<br />

NP-Completude<br />

Algoritmos com complexidade de tempo polinomial geralmente são rápi<strong>do</strong>s e por isso são<br />

considera<strong>do</strong>s eficientes. Mas para muitos problemas existentes não se consegue achar um<br />

algoritmo desta natureza para resolvê-lo. Então surge a teoria da NP-completude para<br />

informar que o algoritmo para solução destes problemas são não polinomiais.<br />

3.1 <strong>Problema</strong>s de Decisão<br />

Os problemas que aqui se apresentarão serão reduzi<strong>do</strong>s à problemas de decisão que pos-<br />

suem apenas duas respostas possíveis: sim ou não (1 ou 0). Mesmo com essa restrição,<br />

os problemas preservarão parte significativa da sua complexidade computacional, dife-<br />

rin<strong>do</strong> apenas por um fator polinomial. Principalmente problemas de otimização que não<br />

se conhece solução com algoritmos eficientes. O problema <strong>do</strong> carteiro chinês envolve tal<br />

circunstâcia, a de encontrar menor caminho global ao percorrer todas as arestas de um<br />

grafo e retornar ao ponto de partida.<br />

3.2 Redução através de linguagem<br />

O problema de decisão pode ser adapta<strong>do</strong> como problema de reconhecimento de lingua-<br />

gem, lembran<strong>do</strong> que linguagem é um conjunto forma<strong>do</strong> por concatenações <strong>do</strong>s símbolos<br />

de um alfabeto, neste caso, o alfabeto é Σ = 0,1. Para isso, admita U como sen<strong>do</strong> o<br />

conjunto de todas as entradas possíveis para um problema de decisão e L como sen<strong>do</strong> o<br />

conjunto de todas as entradas que gerem 1 como resposta. L representará a linguagem<br />

correspondente ao problema de decisão de reconhecer a pertinência de uma entrada dada<br />

à L. E considere o seguinte teorema:<br />

Teorema 3.1 Se L1 é polinomialmente redutível a L2 e existe algoritmo polinomial para<br />

L2, então existe algoritmo polinomial para L1.<br />

10


Por polinomialmente redutível entende-se que cada instância de L1 é convertida para<br />

uma instância exclusiva de L2 em tempo polinomial.<br />

Deste enuncia<strong>do</strong> podemos inferir a transitividade da redução e, se comprova<strong>do</strong> que L1<br />

não possui algoritmo polinomial e é polinomialmente redutível a L2, não existirá algoritmo<br />

polinomial para L2.<br />

3.3 Classe P e classe NP<br />

A<strong>do</strong>taremos como classe P, o conjunto de linguagens que é possível decidir se, dada a<br />

entrada de um problema, sua resposta pertence ou não à linguagem, consideran<strong>do</strong> tempo<br />

polinomial. Isto significa que se L pertencer a classe P, existirá um algoritmo capaz de<br />

fornecer uma resposta afirmativa (sim) em tempo polinomial.<br />

A classe NP pode ser definida como a classe das linguagens em que a decisão pode ser<br />

feita por um algoritmo polinomial não determinístico. Um algoritmo não determinístico<br />

possui todas as características de um determinístico mais o poder de realizar escolhas de<br />

forma não determinística.<br />

A classe NP também pode ser definida com o uso de certifica<strong>do</strong>s. O algoritmo possui<br />

<strong>do</strong>is argumentos, um deles o certifica<strong>do</strong>. Caso este exista, o algoritmo pode dar uma<br />

resposta afirmativa para uma entrada, que é o outro argumento. O certifica<strong>do</strong> deve<br />

apresentar complexidade polinomial em relação à entrada.<br />

Se ignorarmos o certifica<strong>do</strong> poderemos ver que se uma linguagem pertence à P, então<br />

ela também pertence à NP. Isto nos mostra que P ⊆ NP. Porém, até hoje, não sabe<br />

dizer se P = NP. A maioria <strong>do</strong>s especialistas acredita que não seja, por causa da classe<br />

NP-completo. Ela diz que se existe um algoritmo polinomial que resolva um problema<br />

NP-completo, então to<strong>do</strong>s os problemas NP poderão ser resolvi<strong>do</strong>s polinomialmente.<br />

Para mostrar que um problema pertence à classe NP-completo, é necessário conhe-<br />

cer um problema NP-completo, e tentar reduzi-lo a este problema conheci<strong>do</strong>. Para os<br />

problemas <strong>do</strong> circuito Hamiltoniano e <strong>do</strong> caixeiro viajante serem ditos NP-completos, é<br />

necessário usar o teorema de Cook, um conheci<strong>do</strong> problema NP-completo.<br />

11


Capítulo 4<br />

Histórico<br />

No século XVIII na cidade de Königsberg (Prússia, atual Kaliningra<strong>do</strong> Rússia) havia um<br />

rio chama<strong>do</strong> Pregel e, nesse rio, duas ilhas. Ligan<strong>do</strong> uma ilha à outra existia uma ponte.<br />

A primeira ilha possuía outras quatro pontes, duas para cada margem <strong>do</strong> rio. Na segunda<br />

ilha, havia também duas pontes, cada qual ligan<strong>do</strong> uma margem, totalizan<strong>do</strong> sete pontes,<br />

conforme ilustra<strong>do</strong> na figura 4.1:<br />

Os habitantes de Königsberg desejavam realizar um desfile e não gostariam de passar<br />

mais de uma vez sobre cada ponte. Este problema ficou conheci<strong>do</strong> como ”As Sete Pontes<br />

de Königsberg”e o matemático Leonhard Euller (1707-1783) foi chama<strong>do</strong> para resolvê-lo.<br />

No entanto, Euler provou que era impossível encontrar uma solução, pois, ao transformar<br />

o mapa em um grafo, onde as ilhas e o continente são os vértices e as pontes arestas,<br />

conforme ilustra a figura abaixo, notou que os vértices possuíam grau ímpar.<br />

Figura 4.1: Representação das Sete Pon-<br />

tes de Königsberg<br />

Figura 4.2: Grafo - Sete Pontes de<br />

Königsberg<br />

Muitos autores referem-se a esse problema como o marco inicial no estu<strong>do</strong> da teoria<br />

<strong>do</strong>s grafos.<br />

12


Capítulo 5<br />

O <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong><br />

O <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> (Chinese Postman Problem) possui forte relação com<br />

o <strong>Problema</strong> das Sete Pontes descrito na seção anterior e foi originalmente discuti<strong>do</strong> na<br />

revista Chinese Mathematics em um artigo de autoria de Mei-Ko Kwan em 1962. Tal<br />

problema consiste em encontrar uma rota para um carteiro, onde as seguintes restrições<br />

são colocadas:<br />

• Todas as ruas devem ser visitadas;<br />

• O caminho deve ser mínimo, ou seja, a distância percorrida pelo carteiro deve ser a<br />

menor possível.<br />

A principal diferença entre o problema das Sete Pontes e o <strong>Carteiro</strong> <strong>Chinês</strong> está em<br />

que este último permite ao carteiro passar por um caminho já utiliza<strong>do</strong> anteriormente<br />

e, ao fim <strong>do</strong> percurso, ele deve estar no ponto de partida. A rota <strong>do</strong> carteiro pode ser<br />

transformada em um grafo, onde cada rua é uma aresta e os cruzamentos das ruas são os<br />

vértices.<br />

Segun<strong>do</strong> [1], o <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> divide-se em quatro categorias. São elas:<br />

(a) <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos não orienta<strong>do</strong>s;<br />

(b) <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos orienta<strong>do</strong>s;<br />

(c) <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos mistos;<br />

(d) <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> Capacita<strong>do</strong>.<br />

Para os itens (a) e (b) existe solução em tempo polinomial. Já para (c) e (d) a solução<br />

não pode ser encontrada em tempo polinomial.<br />

Faremos uma descrição de cada uma dessas categorias, dan<strong>do</strong> ênfase ao <strong>Problema</strong> <strong>do</strong><br />

<strong>Carteiro</strong> <strong>Chinês</strong> para grafos não orienta<strong>do</strong>s, pois foi nossa escolha de implementação.<br />

13


5.1 <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos não ori-<br />

enta<strong>do</strong>s<br />

Nesta seção descreveremos nossa escolha de implementação. Para começar, vamos intro-<br />

duzir o conceito de Circuito Euleriano: o percurso em um grafo conexo a partir de um<br />

vértice inicial qualquer, atravessan<strong>do</strong> todas as suas arestas apenas uma vez e retornan<strong>do</strong><br />

ao vértice onde se originou tal percurso é denomina<strong>do</strong> Circuito Euleriano. No entanto,<br />

para que esse fato ocorra em um grafo, ele não deve possuir vértice de grau ímpar, ou<br />

seja, o número de arestas incidentes de cada vértice existente no grafo deve ser par. Logo,<br />

o parágrafo acima define o seguinte teorema:<br />

Teorema 5.1 Teorema de Euller: Da<strong>do</strong> um grafo G(V,A) qualquer, existe em G(V,A)<br />

um Circuito Euleriano se, e somente se, G(V,A) for conexo e o grau de to<strong>do</strong>s os seus<br />

vértices for par.<br />

Prova:<br />

1. Da<strong>do</strong> G(V,A) um grafo Euleriano, o grau de qualquer vértice v pertencente a V é<br />

par. Ao definir um caminho Euleriano C em G(V,A), cada vértice v pertencente<br />

a V possui uma aresta de chegada e outra de saída. Como cada aresta de G(V,A)<br />

deve aparecer apenas uma vez em C, to<strong>do</strong> v pertencente a V possui grau par;<br />

2. Para to<strong>do</strong> vértice v pertencente a V em G(V,A), o grau de v é par, logo G(V,A) é<br />

um grafo Euleriano. Nesse caso, tenta-se encontrar um caminho C em G(V,A) de<br />

maneira a não repetir arestas e que passe por todas elas.<br />

Consideran<strong>do</strong> o grau par para to<strong>do</strong>s os vértices pertencentes a V, sempre será<br />

possível entrar e sair de qualquer vértice, exceto quan<strong>do</strong> o vértice for o último<br />

<strong>do</strong> percurso. Se, ao final <strong>do</strong> processo, C possuir todas as arestas de A, o Circuito<br />

Euleriano estará descrito. Caso contrário, define-se um novo grafo G’(V’,A’) com<br />

todas as arestas de A que ainda não foram percorridas e também com os vértices<br />

de V que possuem alguma aresta não percorrida. Como o grafo é conexo G’(V’,A’)<br />

possui um vértice em comum com C. Reinicia-se o processo no vértice comum para<br />

obter um novo caminho C’. Quan<strong>do</strong> não restam mais arestas, os caminhos percorri-<br />

<strong>do</strong>s unem-se através de seus vértices em comum forman<strong>do</strong> um caminho único. Tal<br />

caminho é o Circuito Euleriano <strong>do</strong> grafo.<br />

A prova acima sugere um algoritmo em alto nível para a busca <strong>do</strong> Ciclo Euleriano:<br />

1. Escolha o nó inicial; vá para 2;<br />

14


2. Se existem vértices adjacentes ao nó escolhi<strong>do</strong> vá para 3; Senão pare, pois o Circuito<br />

Euleriano está descrito;<br />

3. Entre os nós adjacentes ao vértice inicial, escolha um em que ao eliminar a aresta<br />

entre ambos, o grafo não se torne desconexo. Mude para esse nó (escolhen<strong>do</strong>-o),<br />

elimine a aresta e vá para 2;<br />

Na literatura, são apresenta<strong>do</strong>s <strong>do</strong>is algoritmos para a busca <strong>do</strong> circuito Euleriano em<br />

um grafo, o algoritmo de Hierholzer e o algoritmo de Fleury, os quais são descritos abaixo:<br />

Algoritmo de Hierholzer para a busca <strong>do</strong> Ciclo<br />

Euleriano:<br />

caminho Hierholzer(grafo G = (V,A)) {<br />

v0 = vértice inicial <strong>do</strong> percurso<br />

C = [v0] //caminho recebe o vértice inicial<br />

Enquanto existir aresta em A<br />

vi = um vértice de C tal que d(vi) ¿ 0 em G<br />

C = Circuito em G que contém vi<br />

G = G - {a | a é aresta em C}<br />

Em C, substituir o vértice vi pelo circuito C<br />

Retornar C }<br />

Algoritmo de Fleury para a busca <strong>do</strong> Ciclo Euleri-<br />

ano em um grafo:<br />

caminho Fleury(grafo G = (V,A)) {<br />

v0 = vértice em V<br />

C = [v0]<br />

Enquanto existir aresta em A<br />

vi = último vértice inseri<strong>do</strong> em C<br />

Se vi possui apenas uma aresta incidente;<br />

ai = a aresta incidente a vi em G<br />

Senão<br />

ai = aresta de vi em G não ponte<br />

Apagar ai de A em G<br />

Inserir ai no final de C<br />

vj = vértice destino de ai<br />

Inserir vj na posição final de C<br />

Retornar C<br />

}<br />

15


Ambos os algoritmos possuem tempo de execução O(n).<br />

Até o momento, verificamos como resolver o <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> em um grafo<br />

onde to<strong>do</strong>s os seus vértices possuem grau par. No entanto, podem existir situações onde<br />

algum vértice, ou um conjunto de vértices, <strong>do</strong> grafo possua grau ímpar. Essa situação<br />

pode ser contornada através da execução de um algoritmo de emparelhamento (Matching),<br />

que tem sua funcionalidade ligada ao fato de existir, em um grafo conexo, um número par<br />

de vértices de grau ímpar.<br />

A função desse algoritmo é buscar no grafo to<strong>do</strong>s os nós de grau ímpar e encontrar a<br />

melhor maneira de ligá-los entre si, através da criação de novas arestas. O peso de uma<br />

nova aresta é calcula<strong>do</strong> com base na distância, ou seja, na soma <strong>do</strong>s pesos das arestas<br />

existentes entre os nós que essa nova aresta irá ligar.<br />

Portanto, para cada vértice de grau ímpar, existirá um conjunto de novas arestas.<br />

Esses conjuntos devem ser analisa<strong>do</strong>s e a menor aresta que ligue cada par de vértices<br />

deve ser escolhida para entrar no grafo original. Ao final da execução <strong>do</strong> algoritmo de<br />

emparelhamento, o grafo resultante é Euleriano e pode, então, ser determina<strong>do</strong> um circuito<br />

Euleriano, o qual é a rota <strong>do</strong> carteiro.<br />

Para realizar o passo 3 (três), é necessário encontrar o ”casamento de pares com a<br />

mínima distância”, ou seja, devem ser inseridas novas arestas no grafo, para que o mesmo<br />

torne um grafo Euleriano, e possa ser encontra<strong>do</strong> o um circuito Euleriano, então assim<br />

obtemos o caminho que o carteiro deve percorrer.<br />

5.1.1 Matching<br />

O matching (emparelhamento) é realiza<strong>do</strong> para tornar o grafo, um grafo Euleriano. Este<br />

processo é realiza<strong>do</strong> sobre os vértices de grau ímpar, nos quais são inseridas novas arestas<br />

para tornar estes vértices, vértices de grau par. Essas arestas devem ser inseridas nestes<br />

vértices com a distância mínima entre tais vértices.<br />

Larson e O<strong>do</strong>ni(1981 apud [3]) apresentam alguns algoritmos para a realização <strong>do</strong><br />

matching, são eles o Algoritmo de Edmonds e Johnson(1973), cuja complexidade é O(n 3 )<br />

e o Algoritmo de Christofides(1975). Um outro algoritmo que diversos autores chamam<br />

de algoritmo guloso, pode ser utiliza<strong>do</strong> para resolver o emparelhamento, ele é basea<strong>do</strong> no<br />

algoritmo de Christofides, este algoritmo é descrito abaixo:<br />

Algoritmo Guloso, basea<strong>do</strong> em Christofides:<br />

Passo 1 Inicialmente crie um grafo G’(V’,A’), que contém apenas os vértices de grau ímpares<br />

<strong>do</strong> grafo inicial G(V,A), escolha um vértice inicial de G’(V’,A’) para ser o nó cor-<br />

rente.<br />

16


Figura 5.1: Um grafo não Euleriano<br />

Passo 2 Caso o vértice agora é de grau par, obtenha o próximo vértice de G’(V’,A’) e volte<br />

para o passo 2, senão calcule a distância mínima deste vértice a to<strong>do</strong>s os outros<br />

vértices de G’(V’,A’), e determine qual é o vértice final cuja distância <strong>do</strong> vértice<br />

atual é a menor distância dentre as distâncias de to<strong>do</strong>s os outros vértices em relação<br />

ao vértice corrente.<br />

Passo 3 Crie em G’(V’,A’) uma nova aresta, ou novas arestas ligan<strong>do</strong> to<strong>do</strong> o caminho <strong>do</strong><br />

vértice corrente até o vértice final, calcula<strong>do</strong> no passo 2.<br />

Passo 4 Marque os <strong>do</strong>is vértices como sen<strong>do</strong> de grau par.<br />

Passo 5 Caso existam mais vértices de grau ímpar obtenha-o e volte ao passo 2.<br />

No algoritmo de Edmonds e Johnson, é utiliza<strong>do</strong> o algoritmo de BFS (Breadth-First<br />

Search), para encontrar os menores caminhos <strong>do</strong> vértice corrente até to<strong>do</strong>s os outros. A<br />

figura 5.1, mostra o exemplo de um processo de emparelhamento, executa<strong>do</strong> pelo algoritmo<br />

descrito acima. Inicialmente temos o grafo não Euleriano, e devemos executar o matching.<br />

Separe to<strong>do</strong>s os vértices que for de grau ímpar, que o matching trabalhará sobre eles.<br />

Escolhe um nó de grau ímpar para iniciar o matching, neste exemplo iniciaremos por A.<br />

Posteriormente calcula-se a menor distância de A, a to<strong>do</strong>s os e outros vértices de grau<br />

ímpar, como é mostra<strong>do</strong> na figura 5.2, dentre estes caminhos selecione o menor deles, e<br />

ligue uma nova arestas entre os <strong>do</strong>is vértices, neste exemplo a menor distância é entre A<br />

e B, e marque os <strong>do</strong>is vértices como agora, de grau par e selecione o próximo vértice de<br />

grau ímpar, neste exemplo o vértice C.<br />

A figura 5.2 agora na parte (d), vemos os caminhos mais curtos sain<strong>do</strong> de C até os<br />

outros vértices de grau ímpar, que no caso é um pois só existe agora C e E, como vértices<br />

de grau ímpar, então é criada uma novas arestas paralelas as já existentes pelo caminho<br />

de C até F.<br />

A figura 5.3 mostra o grafo após a realização <strong>do</strong> matching.<br />

Portanto, a resolução <strong>do</strong> <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos não orienta<strong>do</strong>s<br />

resume-se em:<br />

17


Figura 5.2: Caminhos mais curtos partin<strong>do</strong> de A e posteriormente de C.<br />

Figura 5.3: Grafo após matching<br />

18


Passo 1: Verificar se o grafo é Euleriano, se for, vá para o passo 5;<br />

Passo 2: Identificar os k vértices que possuem grau ímpar. O valor de k será par devi<strong>do</strong> ao<br />

grafo ser conexo;<br />

Passo 3: Encontrar a menor distância entre esses k vértices, ou seja, o emparelhamento per-<br />

feito através <strong>do</strong> matching;<br />

Passo 4: Acrescentar as arestas resultantes <strong>do</strong> matching ao grafo original;<br />

Passo 5: Buscar o circuito euleriano.<br />

5.2 <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos orien-<br />

ta<strong>do</strong>s<br />

Segun<strong>do</strong> [3] para que o <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> tenha solução em grafos orienta<strong>do</strong>s<br />

é necessário que tal grafo seja fortemente conecta<strong>do</strong>. Em outras palavras, deve existir um<br />

caminho que, ao ser percorri<strong>do</strong>, visite to<strong>do</strong>s os vértices <strong>do</strong> grafo.<br />

A determinação desse caminho é feita através da busca <strong>do</strong> Circuito Euleriano no grafo.<br />

Para tanto, existe uma versão <strong>do</strong> teorema de Euler, baseada em grafos orienta<strong>do</strong>s:<br />

Teorema de Euler para grafos direciona<strong>do</strong>s:[3]<br />

Teorema 5.2 Seja o grafo G(V,A) orienta<strong>do</strong> e conexo. G(V,A) possui um Circuito<br />

Euleriano se, e somente se, to<strong>do</strong>s os vértices pertencentes a V possuírem grau de entrada<br />

igual ao grau de saída. Em outras palavras, o número de arestas que entram em cada<br />

vértice v pertencente a V deve ser igual ao número de arestas que saem de v.<br />

Pela teoria <strong>do</strong>s grafos, um grafo com as características citadas no teorema acima é clas-<br />

sifica<strong>do</strong> como simétrico. Para determinar o Circuito Euleriano em um grafo direciona<strong>do</strong>,<br />

seguimos o trabalho de [3]:<br />

1. Separar o conjunto de arestas em um conjunto de ciclos direciona<strong>do</strong>s;<br />

2. Iniciar a rota em um vértice qualquer pertencente a um <strong>do</strong>s ciclos. Este vértice<br />

chamaremos de V1;<br />

3. Percorrer to<strong>do</strong>s os vértices pertencentes ao ciclo até encontrar V1 ou algum V2 per-<br />

tencente a algum outro ciclo ainda não visita<strong>do</strong>;<br />

4. Se encontrou V1, encerra o algoritmo pois o circuito está determina<strong>do</strong>. Senão, visite<br />

o ciclo de V2 antes de encerrar o ciclo de V1;<br />

19


5. Volte ao passo 3, para o ciclo de V2.<br />

Do mesmo mo<strong>do</strong> que em um grafo não orienta<strong>do</strong>, quan<strong>do</strong> o grafo não possuir um<br />

Circuito Euleriano, este deve ser obti<strong>do</strong> através <strong>do</strong>s algoritmos de emparelhamento, acres-<br />

centan<strong>do</strong> novas arestas ao grafo de maneira a minimizar o custo <strong>do</strong> percurso.<br />

5.3 <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> para grafos mistos<br />

Como já visto, um grafo misto é um grafo que possui tanto arestas orientadas quanto<br />

arestas não orientadas. O PCC em grafos mistos é soluciona<strong>do</strong> pela obtenção <strong>do</strong> circuito<br />

Euleriano, assim como em grafos orienta<strong>do</strong>s. Segun<strong>do</strong> Eiselt et al.(1995 apud [3]) um<br />

grafo misto tem um circuito Euleriano, se to<strong>do</strong>s os vértices tiverem grau par e sejam<br />

balancea<strong>do</strong>s, tais condições estão presentes na versão modificada <strong>do</strong> Teorema de Euller<br />

para grafos mistos.<br />

Caso o grafo seja um grafo Euleriano, apenas é necessário encontrar o circuito Eu-<br />

leriano, utilizan<strong>do</strong> um <strong>do</strong>s algoritmos aplica<strong>do</strong>s no PCC em grafos orienta<strong>do</strong>s, e o PCC<br />

já está soluciona<strong>do</strong>. Eiselt (Eiselt et. al, 1995 apud [3]) descreve algums passos para<br />

determinação <strong>do</strong> circuito Euleriano em grafos mistos, o qual é descrito abaixo:<br />

Méto<strong>do</strong> de Eiselt:<br />

Passo 1: Atribuir direções às arestas não orientadas para que o grafo se torne simétrico;<br />

Passo 2: Atribuir direção aos arcos restantes;<br />

Passo 3: Após isto com o grafo está totalmente orienta<strong>do</strong>, pode se utilizar algum <strong>do</strong>s algorit-<br />

mos de busca <strong>do</strong> circuito Euleriano, apresenta<strong>do</strong>s no PCC para grafos orienta<strong>do</strong>s.<br />

No passo 1, apenas observamos que um grafo simétrico, é um grafo em que o número<br />

de arestas incidentes é o mesmo de arestas que saem <strong>do</strong> vértice.<br />

Mas se o grafo não for Euleriano, uma abordagem parecida com o emparelhamento<br />

pode ser utilizada, porém não existe um algoritmo, que resolve para to<strong>do</strong> problema, o<br />

casamento de custo mínimo em um grafo não Euleriano, segun<strong>do</strong> [3] algumas abordagens<br />

fora propostas como em Grotschel e Win (1992); Christofides et al (1983) e Morábito<br />

(1996), mas apenas funcionam para problemas de pequeno e médio porte.<br />

5.4 <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> Capacita<strong>do</strong><br />

Este problema consiste em definir n rotas para um conjunto de carteiros, que devem<br />

atender à demanda apresentada em um grafo G. Este problema pode ser formula<strong>do</strong> como<br />

um problema de fluxo, com formula<strong>do</strong> por Golden e Wong(1981 apud [1]).<br />

20


Foi prova<strong>do</strong> por Golden e Wrong(1981), que este problema se trata de um NP-árduo,<br />

neste mesmo trabalho foi apresenta<strong>do</strong> um algoritmo para solução de tal problema, o qual<br />

é descrito abaixo:<br />

IN ÍCIO<br />

Ler o grafo G = (N , A);<br />

Faça todas as arestas serem servidas em um circuito individual.<br />

Inician<strong>do</strong> com o maior circuito disponível, verifique se uma aresta de<br />

um circuito menor pode ser servida por um circuito maior.<br />

Sujeito às restrições <strong>do</strong> problema, procure compor <strong>do</strong>is circuitos de<br />

forma a obter a maior economia possível.<br />

Repita a composição até não existir composição que traga a economia<br />

a solução.<br />

FIM<br />

Este algoritmo permite a utilização para realizar determina<strong>do</strong>s passos, pois se trata de<br />

um algoritmo de alto nível, um exemplo é o Repita, que pode ser implementada utilizan<strong>do</strong><br />

heurísticas apresentadas em Clark e Wright(1964 apud [1]).<br />

5.5 Algoritmos Implementa<strong>do</strong>s<br />

Dentre os algoritmos apresenta<strong>do</strong>s na literatura foram utiliza<strong>do</strong>s neste trabalho certos<br />

algoritmos na forma original, mas outros realizamos algumas modificações por motivo de<br />

desempenho e de simplicidade. No processo de implementação foram utiliza<strong>do</strong>s algoritmos<br />

para grafos não orienta<strong>do</strong>s, por motivo de simplicidade.<br />

Para encontrar o circuito Euleriano em um grafo, foi implementa<strong>do</strong> o Algoritmo de<br />

Fleury, porém tivemos dificuldade em buscar uma solução quan<strong>do</strong>, durante o percurso,<br />

existe mais de uma aresta incidente ao vértice. A solução encontrada foi eleger uma aresta<br />

da lista de adjacência de vi e fazer uma busca em largura (BFS), com início no vértice<br />

destino da aresta, chama<strong>do</strong> aqui de vj, até encontrar vi novamente. Ou seja, pesquisamos<br />

pela existência de um ciclo. Se esse ciclo não for identifica<strong>do</strong>, a aresta em questão não<br />

pode ser escolhida pois trata-se de uma ponte e sua remoção torna o grafo desconexo.<br />

Logo uma nova aresta de vi deve ser escalada para análise.<br />

Para o matching foi implementa<strong>do</strong> o algoritmo basea<strong>do</strong> em Christofides(1975), com<br />

uma alteração no algoritmo de encontrar os caminhos mínimos, originalmente foi utiliza<strong>do</strong><br />

o algoritmo encontra o matching mínimo, neste trabalho foi utiliza<strong>do</strong> um méto<strong>do</strong> guloso<br />

para encontrar o matching mínimo, este méto<strong>do</strong> guloso utiliza o algoritmo de Djikstra,<br />

para determinar as menores distâncias entre os vértices de grau ímpar, para que possa<br />

21


ser inseridas entre eles, novas arestas para que de tal forma o grafo, se torne um grafo<br />

Euleriano.<br />

22


Capítulo 6<br />

Aplicações<br />

Nesta seção descreveremos algumas situações onde o <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong> é apli-<br />

ca<strong>do</strong>:<br />

6.1 Roteamento de Veículos<br />

Para [1], esta é a principal aplicação <strong>do</strong> <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong>. Consiste em<br />

determinar rotas para uma frota de veículos de maneira que atenda to<strong>do</strong>s os clientes de<br />

forma otimizada, minimizan<strong>do</strong> as distâncias percorridas e, consequentemente, os custos.<br />

Ao modelar o problema em um grafo, os clientes estão distribuí<strong>do</strong>s ao longo das arestas<br />

(as ruas). Ainda no roteamento de veículos pode-se inserir uma restrição de capacidade,<br />

ou seja, um valor diferente para cada veículo que indica a quantidade máxima de carga<br />

suportada. Tal problema enquadra-se na categoria NP-Difícil.<br />

6.2 Escala de tripulação<br />

Este problema relaciona-se com o anterior. é defini<strong>do</strong> da seguinte maneira: da<strong>do</strong> um<br />

veículo, este possui tarefas que irá executar durante uma viagem. é necessário construir<br />

um conjunto de turnos, cada qual referencian<strong>do</strong> uma parte da viagem a ser realizada por<br />

uma tripulação nesse veículo, de maneira a cumprir a programação minimizan<strong>do</strong> os custos<br />

com a tripulação.<br />

6.3 Varre<strong>do</strong>r de Ruas<br />

Este problema consiste em que o varre<strong>do</strong>r de ruas busca <strong>do</strong> caminho mínimo em um grafo<br />

orienta<strong>do</strong>, ou seja, onde as arestas podem ser percorridas em somente uma direção. Este<br />

problema foi discuti<strong>do</strong> pela primeira vez em Nova Iorque, por suas avenidas serem de<br />

23


mão única e, portanto, ficou conheci<strong>do</strong> na literatura como The New York Street Sweeper<br />

Problem.<br />

24


Capítulo 7<br />

Conclusão<br />

Após estu<strong>do</strong>s realiza<strong>do</strong>s sobre o <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong>, podemos definir que este<br />

na teoria <strong>do</strong>s grafos, possui resolução em tempo polinomial para grafos orienta<strong>do</strong>s e não<br />

orienta<strong>do</strong>s. Verificamos que o algoritmo de Fleury encontra um Circuito Euleriano em<br />

tempo O(n).<br />

Caso o grafo não possua um Circuito Euleriano, pode-se aplicar um algoritmo de<br />

emparelhamento, para transformá-lo. Em nossa implementação utilizamos o algoritmo de<br />

guloso basea<strong>do</strong> no algoritmo de Christofides para tal função.<br />

25


Apêndice A<br />

Algoritmo utiliza<strong>do</strong> para busca <strong>do</strong> caminho euleriano no grafo.<br />

Implementa<strong>do</strong> na linguagem de Programação Java.<br />

public int[] fleury( int inicio ) {<br />

}<br />

int arestas[] = new int[100];<br />

int vertice = inicio;<br />

int cont=0;<br />

No<strong>do</strong>Aresta a, b; //aresta a-b == aresta b-a<br />

this.mostraGrafo();<br />

while(this.existeAresta()) {<br />

}<br />

if(G[vertice].arestasRestantes() == 1)<br />

else {<br />

}<br />

a = G[vertice].getRestante();<br />

a = this.escolheNaoPonte(vertice);<br />

arestas[cont] = a.getIdent();<br />

int aux = vertice; //aux recebe o vertice de origem<br />

a.setRetirada(’s’); //marca como aresta percorrida<br />

vertice = a.getDestino(); //vertice recebe o novo vertice<br />

b = G[vertice].getAresta(aux); //b recebe a aresta que liga o novo vertice ao antigo<br />

b.setRetirada(’s’); //marca como aresta percorrida<br />

cont++;<br />

return arestas;<br />

Este algoritmo é utiliza<strong>do</strong> pelo algoritmo de Fleury, para escolher o próxima aresta a<br />

ser seguida, mas que ela não seja uma ponte, pois se o algoritmo percorrer pela ponte,<br />

ela a eliminaria e o grafo ficaria desconexo.Segue o algoritmo que escolhe uma aresta<br />

26


não-ponte, implementa<strong>do</strong> em linguagem Java.<br />

public No<strong>do</strong>Aresta escolheNaoPonte(int vertice) {<br />

}<br />

No<strong>do</strong>Aresta ret, a, b, c;<br />

No<strong>do</strong>Vertice u;<br />

Fila f = new Fila();<br />

int destino, aux1, origem;<br />

a = G[vertice].getRestante();<br />

while(a != null) {<br />

if((a.getRetirada() == ’n’) && (a.getVisitada() == ’n’)) {<br />

}<br />

ret = a;<br />

destino = a.getDestino();<br />

a.setVisitada(’s’);<br />

c = G[destino].getAresta(vertice);<br />

c.setVisitada(’s’);<br />

f.enqueue(G[destino]);<br />

while(!f.isEmpty()) {<br />

}<br />

return null;<br />

u = f.dequeue();<br />

origem = u.getIndice();<br />

b = u.getRestante();<br />

while(b != null) {<br />

}<br />

if((b.getVisitada() == ’n’) && (b.getRetirada()==’n’)) {<br />

}<br />

a = a.getProx();<br />

aux1 = b.getDestino();<br />

if(aux1 == vertice) return ret;<br />

b.setVisitada(’s’);<br />

c = G[aux1].getAresta(origem);<br />

c.setVisitada(’s’);<br />

f.enqueue(G[aux1]);<br />

}<br />

b = b.getProx();<br />

27


Referências Bibliográficas<br />

[1] Goldbarg, Marco C., Pacca, H., Lima, Loureiro. Otimização Combinatória e Pro-<br />

gramação Linear. 2 Edição. Editora Campus. 2005.<br />

[2] Oliveira, J.A., O <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong>. Disponível em:<br />

webdi.ci.uminho.pt/6307N2LEGI/pdfs/T CART EIRO05.pdf. Acessa<strong>do</strong> em:<br />

30/05/2007.<br />

[3] Godinho Filho, Moacir, Junqueira, Rogério de<br />

Ávila Ribeiro. Um algoritmo para<br />

auxiliar na escolha de méto<strong>do</strong>s de solução para o <strong>Problema</strong> <strong>do</strong> <strong>Carteiro</strong> <strong>Chinês</strong>: pro-<br />

posta e aplicação em uma grande cidade <strong>do</strong> interior paulista . XII SIMPEP, Bauru,<br />

São Paulo, 2005.<br />

28

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!