You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
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