Problema do Carteiro Chinês

Documentos relacionados
Teoria dos Grafos. Edson Prestes

PROBLEMA DO CARTEIRO CHINÊS

Roteamentos AULA ... META. Introduzir alguns problemas de roteamento. OBJETIVOS. Ao final da aula o aluno deverá ser capaz de:

PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas

Teoria dos Grafos. Aulas 3 e 4. Profa. Alessandra Martins Coelho

Técnicas para Programação Inteira e Aplicações em Problemas de Roteamento de Veículos 14

Passeios de Euler e as pontes de Königsberg

BCC204 - Teoria dos Grafos

PESQUISA OPERACIONAL TEORIA DOS GRAFOS

Grafo: Algoritmos e Aplicações

Este material traz a teoria necessária à resolução das questões propostas.

UM TEOREMA QUE PODE SER USADO NA

Prof. Bruno Holanda - Semana Oĺımpica Nível 1. Teoria dos Grafos

01/05/2016. Danillo Tourinho Sancho da Silva, MSc ROTEIRIZAÇÃO TEORIA DOS GRAFOS MOTIVAÇÃO

7 - Análise de redes Pesquisa Operacional CAPÍTULO 7 ANÁLISE DE REDES. 4 c. Figura Exemplo de um grafo linear.

Complexidade de Algoritmos

Teoria dos Grafos. Edson Prestes

CAPÍTULO 2. Grafos e Redes

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

x0 = 1 x n = 3x n 1 x k x k 1 Quantas são as sequências com n letras, cada uma igual a a, b ou c, de modo que não há duas letras a seguidas?

APLICAÇÕES DA DERIVADA

Projeto e Análise de Algoritmos Projeto de Algoritmos Tentativa e Erro. Prof. Humberto Brandão humberto@bcc.unifal-mg.edu.br

Dadas a base e a altura de um triangulo, determinar sua área.

Autómatos Finitos Determinísticos

Capítulo 7. Topologia Digital. 7.1 Conexidade

Algoritmos e Estrutura de Dados III. Árvores

2 Problema das p-medianas

Algumas Aplicações da Teoria dos Grafos

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Pesquisa Operacional Programação em Redes

Faculdade de Computação

MÓDULO 6 INTRODUÇÃO À PROBABILIDADE

Arquitetura de Rede de Computadores

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Análise de Redes de Transportes. Útil também para várias outras áreas além de Transportes!

Análise e Complexidade de Algoritmos

O ESPAÇO NULO DE A: RESOLVENDO AX = 0 3.2

Só Matemática O seu portal matemático FUNÇÕES

Projetos. Universidade Federal do Espírito Santo - UFES. Mestrado em Informática 2004/1. O Projeto. 1. Introdução. 2.

a 1 x a n x n = b,

Bases Matemáticas. Aula 2 Métodos de Demonstração. Rodrigo Hausen. v /15

Orientação a Objetos

O Princípio da Complementaridade e o papel do observador na Mecânica Quântica

BCC204 - Teoria dos Grafos

Contagem (2) Anjolina Grisi de Oliveira / CIn-UFPE. Centro de Informática Universidade Federal de Pernambuco

Dicas para a 6 a Lista de Álgebra 1 (Conteúdo: Homomorfismos de Grupos e Teorema do Isomorfismo para grupos) Professor: Igor Lima.

The Stable Matching Problem

5COP096 TeoriadaComputação

Aplicações de Combinatória e Geometria na Teoria dos Números

QUESTÃO 1 ALTERNATIVA B

Capítulo 1. x > y ou x < y ou x = y

6.3 Equivalência entre Autômatos com Pilha Não-Determinísticos e Gramáticas Livre do Contexto

Soluções Nível 1 5 a e 6 a séries (6º e 7º anos) do Ensino Fundamental

FUNÇÃO REAL DE UMA VARIÁVEL REAL

Contagem. Prof. Dr. Leandro Balby Marinho. Matemática Discreta. Fundamentos Inclusão/Exclusão Princípio da Casa dos Pombos Permutações Combinações

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

O Problema do Troco Principio da Casa dos Pombos. > Princípios de Contagem e Enumeração Computacional 0/48

4 Segmentação Algoritmo proposto

Grafos Msc. Daniele Carvalho Oliveira. Doutoranda em Computação UFU Mestre em Computação - UFU Bacharel em Computação - UFJF 1

¹CPTL/UFMS, Três Lagoas, MS,Brasil, ²CPTL/UFMS, Três Lagoas, MS, Brasil.

Trabalho Computacional

Equações do segundo grau

Múltiplos Estágios processo com três estágios Inquérito de Satisfação Fase II

Função Mudar de unidade estatística

Algoritmos e Estruturas de Dados II. Trabalho Prático 2

Conceitos e fórmulas

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Árvores Binárias e Busca. Jeane Melo

Estrutura de Dados Básica

PROBLEMA DE TRANSPORTE: MODELO E MÉTODO DE SOLUÇÃO

Utilização do SOLVER do EXCEL

A-Graph: Uma ferramenta computacional de suporte para o ensino-aprendizado da disciplina Teoria dos Grafos e seus Algoritmos

OBI2014 Caderno de Tarefas

Análise e Projeto de Algoritmos

Apostila de Fundamentos de Programação I. Prof.: André Luiz Montevecchi

Objetivos. Apresentar as superfícies regradas e superfícies de revolução. Analisar as propriedades que caracterizam as superfícies regradas e

PROGRAMAÇÃO LINEAR. Resolução de problemas de programação linear usando o comando Solver, no Excel.

9. Derivadas de ordem superior

AULA 6 - Operações Espaciais

Resíduos Quadráticos e Fatoração: uma aplicação à criptoanálise do RSA

Disciplina: Unidade III: Prof.: Período:

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

(a 1 + a 100 ) + (a 2 + a 99 ) + (a 3 + a 98 ) (a 50 + a 51 ).

Usando o Excel ESTATÍSTICA. Funções

Máquinas de Turing. Juliana Kaizer Vizzotto. Disciplina de Teoria da Computação. Universidade Federal de Santa Maria

Sistemas Distribuídos: Princípios e Algoritmos Introdução à Análise de Complexidade de Algoritmos

IA: Problemas de Satisfação de Restrições. Prof. Msc. Ricardo Britto DIE-UFPI

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

BC-0506: Comunicação e Redes Algoritmos em Grafos

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

TRIBUNAL DE JUSTIÇA DO PARANÁ PROJUDI REFORMULAÇÃO DE CUMPRIMENTOS - MANDADOS

Projeto e Análise de Algoritmos Projeto de Algoritmos Introdução. Prof. Humberto Brandão humberto@dcc.ufmg.br

ANALISE COMBINATORIA Um pouco de probabilidade

Notas de aula número 1: Otimização *

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

A TEORIA DOS GRAFOS NA ANÁLISE DO FLUXOGRAMA DO CURSO DE ENGENHARIA DE PRODUÇÃO DA UFF

Árvores Binárias de Busca

CAP. I ERROS EM CÁLCULO NUMÉRICO

PROBABILIDADE Prof. Adriano Mendonça Souza, Dr.

Transcrição:

CENTRO DE CIÊNCIAS EXATAS DEPARTAMENTO DE COMPUTAÇÃO TEORIA DA COMPUTAÇÃO Problema do Carteiro Chinês Alunos: André Ricardo Gonçalves Luiz Gustavo Andrade dos Santos Paulo Roberto Silla Profa. Linnyer Beatrys Ruiz LONDRINA - PR 2007

André Ricardo Gonçalves Luiz Gustavo Andrade dos Santos Paulo Roberto Silla Problema do Carteiro Chinês Trabalho apresentado à Universidade Estadual de Londrina, como parte de requisito de avaliação do 2 o Bimestre da disciplina de Teoria da Computação, do curso de Ciência da Computação sobre a orientação da Profa. Linnyer Beatrys Ruiz. LONDRINA - PR 2007

Sumário 1 Introdução 5 2 Teoria dos Grafos 6 3 NP-Completude 10 3.1 Problemas de Decisão.............................. 10 3.2 Redução através de linguagem......................... 10 3.3 Classe P e classe NP.............................. 11 4 Histórico 12 5 O Problema do Carteiro Chinês 13 5.1 Problema do Carteiro Chinês para grafos não orientados.......... 14 5.1.1 Matching................................. 16 5.2 Problema do Carteiro Chinês para grafos orientados............. 19 5.3 Problema do Carteiro Chinês para grafos mistos............... 20 5.4 Problema do Carteiro Chinês Capacitado................... 20 5.5 Algoritmos Implementados........................... 21 6 Aplicações 23 6.1 Roteamento de Veículos............................ 23 6.2 Escala de tripulação.............................. 23 6.3 Varredor de Ruas................................ 23 7 Conclusão 25 Apêndice 25 Referências Bibliográficas 28 3

Lista de Figuras 4.1 Representação das Sete Pontes de Königsberg................ 12 4.2 Grafo - Sete Pontes de Königsberg...................... 12 5.1 Um grafo não Euleriano............................ 17 5.2 Caminhos mais curtos partindo de A e posteriormente de C......... 18 5.3 Grafo após matching.............................. 18 4

Capítulo 1 Introdução Conhecido como Problema do Carteiro Chinês, por ter sido proposto na revista Chinese Mathematics por Mei-Ko Kwan em 1962 e utilizar a rota de um carteiro como cenário, este intrigante problema possui grandes aplicações, como por exemplo na área de roteamento de veículos. Discutiremos, nesse trabalho, algumas maneiras de encontrar soluções em diferentes situações, tais como grafos orientados, não orientados e mistos. Para que os conceitos aplicados durante o desenvolvimento do texto sejam corretamente assimilados, na próxima seção encontra-se uma breve introdução sobre a teoria dos grafos. 5

Capítulo 2 Teoria dos Grafos Reservamos esta seção para introduzir alguns conceitos da Teoria dos Grafos que serão utilizados durante o desenvolvimento do texto: 1. Vértice: objeto simples que pode ter nomes e outros atributos, da qual parte(m) e/ou sai(em) aresta(s). 2. Aresta ou arco: unidade que conecta dois vértices, distintos ou não. Notação: {v 1, v 2 } - aresta que liga vértice v 1 ao vértice v 2. Se existir a aresta {v 1, v 2 }, então v 1 e v 2 são ditos vértices adjacentes. Tipos de aresta: Laço: aresta na qual o vértice de destino é o mesmo da origem ( {v, v} ). Arestas paralelas: duas arestas e1 = {v 1, v 2 } e e2 = {v 3, v 4 } são ditas paralelas se v 1 = v 3 e v 2 = v 4. 3. Grafo: um grafo G é definido como um par G = (V, E), onde: V = V(G): conjunto finito de vértices do grafo G. E = E(G): conjunto de arestas do grafo G, onde E V x V. Tipos de Grafo: Grafo simples: um grafo que não apresenta laços nem arestas paralelas. Grafo orientado(dirigido): G é um grafo orientado se E(G) é um conjunto de pares ordenados de vértices. Ou seja, as arestas de E(G) possuem direção (orientação). Grafo não orientado (não dirigido): G é um grafo não orientado E(G) é um conjunto de pares não ordenados de vértices. Ou seja, as arestas de E(G) não possuem direção. 6

Grafo misto: um grafo G é dito misto se apresenta arestas com e sem direção. E(G) é formado pela união dos conjuntos disjuntos E1(G) e E2(G). Onde E1(G) é o conjunto de arestas com direção e E2(G) é o conjunto de arestas sem direção. 4. Grau de um vértice: determinado pelo número de arestas que ele possui. Se esse número for par, o grau é dito par, caso contrário, ímpar. Em grafos dirigidos, cada vértice possui semi-grau interno (grau de entrada) para as arestas que chegam nele, e semi-grau externo (grau de saída) para as arestas que dele saem. Nota: em um grafo não dirigido, cada laço tem o mesmo valor de duas arestas. Notação: g(e): grau de um vértice g in (e): grau de entrada g out (e): grau de saída Um grafo orientado G = (V, E) que satisfaz g out (e) = g in (e) para todos os vértices e E(G), é dito pseudo-simétrico. 5. Grau mínimo de um grafo: é o mesmo número do grau do vértice pertencente ao grafo que possui menor grau. 6. Grau máximo de um grafo: corresponde ao número do grau do vértice pertencente ao grafo que possui maior grau. 7. Grafo regular: um grafo é dito regular quando todos os seus vértices apresentam mesmo grau. O grau máximo é igual ao grau mínimo. 8. Peso de uma aresta: utilizadas quando em um grafo as arestas apresentam características diferentes umas das outras. Este peso pode ser expresso em qualquer unidade (como um número natural, inteiro, real, entre outros) dependendo da abordagem adotada. Também é possível ter mais alguns atributos associados a uma aresta. Notação: w(e). 9. Caminho (passeio): um caminho em um grafo G = (V, E) é uma seqüência composta de vértices e arestas (v 1, e 1, v 2, e 2,..., v k 1, e k 1, v k ) com e i =v i, v i+1 e 1 i V(G). Um vértice v k é dito alcançável por v i, quando existe um caminho de v i até v k. Num grafo simples, pode-se representar um caminho apenas pela seqüência de vértices. A quantidade de arestas designa o comprimento do caminho. 10. Caminho simples: um passeio que não apresenta repetição de vértices. 7

11. Circuito (ciclo): um caminho onde o último e o primeiro vértice da seqüência denotam o mesmo vértice. Se todos os vértices do circuito forem distintos, este circuito é designado circuito elementar. Proposição 2.1 É conhecido como circuito de Hamilton, um circuito elementar que contenha todos os vértices de um grafo não orientado. Um circuito é simples se todas as arestas que o constituem são distintas. Proposição 2.2 É conhecido como circuito de Euller, um circuito simples que inclui todas as arestas de um grafo não orientado. 12. Grafo cíclico: um grafo que apresenta circuito(s) e a seqüência deste circuito é formada por, no mínimo, três vértices distintos. Um grafo que não apresente circuito é chamado de acíclico ou floresta. Numa floresta, um vértice com grau 1 é denominado folha. A notação C n indicar m grafo que é um circuito de comprimento n. 13. Grafo conexo: dado {v 1, v 2 } um par qualquer de vértices de um grafo G. G será conexo se existir um caminho com extremos v 1 e v 2. 14. Árvore: é um grafo conexo e acíclico. 15. Complemento de um grafo: seja V o conjunto de todos os pares não-ordenados de elementos de V. Se V tem n elementos então V tem (n(n-1)/2) elementos. Os elementos de V são os subconjuntos de V de cardinalidade 2. Então, os elementos de V assumirão a forma {v 1, v 2 }, com v 1 v 2 e v 1, v 2 V. O complemento de um grafo G = (V, E) é o grafo H = (V, V(2) - E). Note que o grafo H possui os mesmos vértices de G mas nenhuma aresta que G possuirá. Notação: Ḡ = H. 16. Grafo completo: um grafo simples de n vértices formado com todas as possibilidades de arestas. Notação: K n O complemento de um grafo completo será o grafo vazio com E(Ḡ) =, que não possuirá arestas. Notação: Kn 17. Subgrafo: dado G = (V, E ), G será subgrafo de G = (V, E) se V V, E E. Assim, G G. Nota: V deve ser um conjunto não-vazio. Tipos de subgrafo: 8

Subgrafo gerador: dado G = (V, E ) um subgrafo de G = (V, E), se V V então G é chamado de subgrafo gerador de G. Subgrafo próprio: quando V V ou E E. Subgrafo induzido: um subgrafo de G induzido por um conjunto X V(G) é o grafo (X, A) onde A é o conjunto E(G) tais que estas arestas possuam as duas extremidades em X, desde que A não seja vazio. Notação: G[X] Subgrafo maximal: dado H um subgrafo conexo de um grafo G, será maximal se não for subgrafo próprio de nenhum subgrafo conexo de G. 18. Componente (componente conexa) de um grafo: qualquer subgrafo conexo maximal do grafo. Assim, todo vértice de um grafo conexo pertence a somente um componente e se o grafo tem um único componente, ele será conexo. 19. Fecho transitivo de um vértice: todos os vértices que são alcançados (transitivamente) a partir de um vértice v k formam o conjunto fecho transitivo de v k. 20. Fecho transitivo inverso de um vértice: o conjunto de todos os vértices que (transitivamente) alcançam um vértice v k é chamado de fecho transitivo inverso de v k. 21. Componente fortemente conexa de um vértice: o conjunto de todos os vértices que têm ligação com um vértice v k por um caminho de ida e volta. Ou seja, este conjunto é formado pela intersecção dos fechos transitivo e transitivo inverso de v k. 22. Grafo parcial: é um grafo H = (V, A) será grafo parcial de G = (V, E) se A E e V(H) = V(G). 23. Grafo bipartido: um grafo G = (V, E) será considerado bipartido se V(G) possa ser particionado em dois subconjuntos disjuntos A e B tal que V = A B, e para cada aresta e = {v 1, v 2 } de E(G) (v 1 A e v 2 B) ou (v 1 B e v 2 A). 24. Grafo bipartido completo: é um grafo bipartido simples contendo todas as possíveis arestas. Notação: K n,m, com n = A e m = B. 9

Capítulo 3 NP-Completude Algoritmos com complexidade de tempo polinomial geralmente são rápidos e por isso são considerados eficientes. Mas para muitos problemas existentes não se consegue achar um algoritmo desta natureza para resolvê-lo. Então surge a teoria da NP-completude para informar que o algoritmo para solução destes problemas são não polinomiais. 3.1 Problemas de Decisão Os problemas que aqui se apresentarão serão reduzidos à problemas de decisão que possuem apenas duas respostas possíveis: sim ou não (1 ou 0). Mesmo com essa restrição, os problemas preservarão parte significativa da sua complexidade computacional, diferindo apenas por um fator polinomial. Principalmente problemas de otimização que não se conhece solução com algoritmos eficientes. O problema do carteiro chinês envolve tal circunstâcia, a de encontrar menor caminho global ao percorrer todas as arestas de um grafo e retornar ao ponto de partida. 3.2 Redução através de linguagem O problema de decisão pode ser adaptado como problema de reconhecimento de linguagem, lembrando que linguagem é um conjunto formado por concatenações dos símbolos de um alfabeto, neste caso, o alfabeto é Σ = 0,1. Para isso, admita U como sendo o conjunto de todas as entradas possíveis para um problema de decisão e L como sendo o conjunto de todas as entradas que gerem 1 como resposta. L representará a linguagem correspondente ao problema de decisão de reconhecer a pertinência de uma entrada dada à L. E considere o seguinte teorema: Teorema 3.1 Se L1 é polinomialmente redutível a L2 e existe algoritmo polinomial para L2, então existe algoritmo polinomial para L1. 10

Por polinomialmente redutível entende-se que cada instância de L1 é convertida para uma instância exclusiva de L2 em tempo polinomial. Deste enunciado podemos inferir a transitividade da redução e, se comprovado que L1 não possui algoritmo polinomial e é polinomialmente redutível a L2, não existirá algoritmo polinomial para L2. 3.3 Classe P e classe NP Adotaremos como classe P, o conjunto de linguagens que é possível decidir se, dada a entrada de um problema, sua resposta pertence ou não à linguagem, considerando tempo polinomial. Isto significa que se L pertencer a classe P, existirá um algoritmo capaz de fornecer uma resposta afirmativa (sim) em tempo polinomial. A classe NP pode ser definida como a classe das linguagens em que a decisão pode ser feita por um algoritmo polinomial não determinístico. Um algoritmo não determinístico possui todas as características de um determinístico mais o poder de realizar escolhas de forma não determinística. A classe NP também pode ser definida com o uso de certificados. O algoritmo possui dois argumentos, um deles o certificado. Caso este exista, o algoritmo pode dar uma resposta afirmativa para uma entrada, que é o outro argumento. O certificado deve apresentar complexidade polinomial em relação à entrada. Se ignorarmos o certificado poderemos ver que se uma linguagem pertence à P, então ela também pertence à NP. Isto nos mostra que P NP. Porém, até hoje, não sabe dizer se P = NP. A maioria dos especialistas acredita que não seja, por causa da classe NP-completo. Ela diz que se existe um algoritmo polinomial que resolva um problema NP-completo, então todos os problemas NP poderão ser resolvidos polinomialmente. Para mostrar que um problema pertence à classe NP-completo, é necessário conhecer um problema NP-completo, e tentar reduzi-lo a este problema conhecido. Para os problemas do circuito Hamiltoniano e do caixeiro viajante serem ditos NP-completos, é necessário usar o teorema de Cook, um conhecido problema NP-completo. 11

Capítulo 4 Histórico No século XVIII na cidade de Königsberg (Prússia, atual Kaliningrado Rússia) havia um rio chamado Pregel e, nesse rio, duas ilhas. Ligando uma ilha à outra existia uma ponte. A primeira ilha possuía outras quatro pontes, duas para cada margem do rio. Na segunda ilha, havia também duas pontes, cada qual ligando uma margem, totalizando sete pontes, conforme ilustrado na figura 4.1: Os habitantes de Königsberg desejavam realizar um desfile e não gostariam de passar mais de uma vez sobre cada ponte. Este problema ficou conhecido como As Sete Pontes de Königsberg e o matemático Leonhard Euller (1707-1783) foi chamado para resolvê-lo. No entanto, Euler provou que era impossível encontrar uma solução, pois, ao transformar o mapa em um grafo, onde as ilhas e o continente são os vértices e as pontes arestas, conforme ilustra a figura abaixo, notou que os vértices possuíam grau ímpar. Figura 4.1: Representação das Sete Pontes de Königsberg Figura 4.2: Königsberg Grafo - Sete Pontes de Muitos autores referem-se a esse problema como o marco inicial no estudo da teoria dos grafos. 12

Capítulo 5 O Problema do Carteiro Chinês O Problema do Carteiro Chinês (Chinese Postman Problem) possui forte relação com o Problema das Sete Pontes descrito na seção anterior e foi originalmente discutido na revista Chinese Mathematics em um artigo de autoria de Mei-Ko Kwan em 1962. Tal problema consiste em encontrar uma rota para um carteiro, onde as seguintes restrições são colocadas: Todas as ruas devem ser visitadas; O caminho deve ser mínimo, ou seja, a distância percorrida pelo carteiro deve ser a menor possível. A principal diferença entre o problema das Sete Pontes e o Carteiro Chinês está em que este último permite ao carteiro passar por um caminho já utilizado anteriormente e, ao fim do percurso, ele deve estar no ponto de partida. A rota do carteiro pode ser transformada em um grafo, onde cada rua é uma aresta e os cruzamentos das ruas são os vértices. Segundo [1], o Problema do Carteiro Chinês divide-se em quatro categorias. São elas: (a) Problema do Carteiro Chinês para grafos não orientados; (b) Problema do Carteiro Chinês para grafos orientados; (c) Problema do Carteiro Chinês para grafos mistos; (d) Problema do Carteiro Chinês Capacitado. Para os itens (a) e (b) existe solução em tempo polinomial. Já para (c) e (d) a solução não pode ser encontrada em tempo polinomial. Faremos uma descrição de cada uma dessas categorias, dando ênfase ao Problema do Carteiro Chinês para grafos não orientados, pois foi nossa escolha de implementação. 13

5.1 Problema do Carteiro Chinês para grafos não orientados Nesta seção descreveremos nossa escolha de implementação. Para começar, vamos introduzir o conceito de Circuito Euleriano: o percurso em um grafo conexo a partir de um vértice inicial qualquer, atravessando todas as suas arestas apenas uma vez e retornando ao vértice onde se originou tal percurso é denominado Circuito Euleriano. No entanto, para que esse fato ocorra em um grafo, ele não deve possuir vértice de grau ímpar, ou seja, o número de arestas incidentes de cada vértice existente no grafo deve ser par. Logo, o parágrafo acima define o seguinte teorema: Teorema 5.1 Teorema de Euller: Dado um grafo G(V,A) qualquer, existe em G(V,A) um Circuito Euleriano se, e somente se, G(V,A) for conexo e o grau de todos os seus vértices for par. Prova: 1. Dado G(V,A) um grafo Euleriano, o grau de qualquer vértice v pertencente a V é par. Ao definir um caminho Euleriano C em G(V,A), cada vértice v pertencente a V possui uma aresta de chegada e outra de saída. Como cada aresta de G(V,A) deve aparecer apenas uma vez em C, todo v pertencente a V possui grau par; 2. Para todo vértice v pertencente a V em G(V,A), o grau de v é par, logo G(V,A) é um grafo Euleriano. Nesse caso, tenta-se encontrar um caminho C em G(V,A) de maneira a não repetir arestas e que passe por todas elas. Considerando o grau par para todos os vértices pertencentes a V, sempre será possível entrar e sair de qualquer vértice, exceto quando o vértice for o último do percurso. Se, ao final do processo, C possuir todas as arestas de A, o Circuito Euleriano estará descrito. Caso contrário, define-se um novo grafo G (V,A ) com todas as arestas de A que ainda não foram percorridas e também com os vértices de V que possuem alguma aresta não percorrida. Como o grafo é conexo G (V,A ) possui um vértice em comum com C. Reinicia-se o processo no vértice comum para obter um novo caminho C. Quando não restam mais arestas, os caminhos percorridos unem-se através de seus vértices em comum formando um caminho único. Tal caminho é o Circuito Euleriano do grafo. A prova acima sugere um algoritmo em alto nível para a busca do Ciclo Euleriano: 1. Escolha o nó inicial; vá para 2; 14

2. Se existem vértices adjacentes ao nó escolhido vá para 3; Senão pare, pois o Circuito Euleriano está descrito; 3. Entre os nós adjacentes ao vértice inicial, escolha um em que ao eliminar a aresta entre ambos, o grafo não se torne desconexo. Mude para esse nó (escolhendo-o), elimine a aresta e vá para 2; Na literatura, são apresentados dois algoritmos para a busca do circuito Euleriano em um grafo, o algoritmo de Hierholzer e o algoritmo de Fleury, os quais são descritos abaixo: Algoritmo de Hierholzer para a busca do Ciclo Euleriano: caminho Hierholzer(grafo G = (V,A)) { v 0 = vértice inicial do percurso C = [v 0 ] //caminho recebe o vértice inicial Enquanto existir aresta em A v i = um vértice de C tal que d(v i ) 0 em G C = Circuito em G que contém v i G = G - {a a é aresta em C} Em C, substituir o vértice v i pelo circuito C Retornar C } Algoritmo de Fleury para a busca do Ciclo Euleriano em um grafo: caminho Fleury(grafo G = (V,A)) { v 0 = vértice em V C = [v 0 ] Enquanto existir aresta em A v i = último vértice inserido em C Se v i possui apenas uma aresta incidente; a i = a aresta incidente a v i em G Senão a i = aresta de v i em G não ponte Apagar a i de A em G Inserir a i no final de C v j = vértice destino de a i Inserir v j na posição final de C Retornar C } 15

Ambos os algoritmos possuem tempo de execução O(n). Até o momento, verificamos como resolver o Problema do Carteiro Chinês em um grafo onde todos os seus vértices possuem grau par. No entanto, podem existir situações onde algum vértice, ou um conjunto de vértices, do grafo possua grau ímpar. Essa situação pode ser contornada através da execução de um algoritmo de emparelhamento (Matching), que tem sua funcionalidade ligada ao fato de existir, em um grafo conexo, um número par de vértices de grau ímpar. A função desse algoritmo é buscar no grafo todos os nós de grau ímpar e encontrar a melhor maneira de ligá-los entre si, através da criação de novas arestas. O peso de uma nova aresta é calculado com base na distância, ou seja, na soma dos pesos das arestas existentes entre os nós que essa nova aresta irá ligar. Portanto, para cada vértice de grau ímpar, existirá um conjunto de novas arestas. Esses conjuntos devem ser analisados e a menor aresta que ligue cada par de vértices deve ser escolhida para entrar no grafo original. Ao final da execução do algoritmo de emparelhamento, o grafo resultante é Euleriano e pode, então, ser determinado um circuito Euleriano, o qual é a rota do carteiro. Para realizar o passo 3 (três), é necessário encontrar o casamento de pares com a mínima distância, ou seja, devem ser inseridas novas arestas no grafo, para que o mesmo torne um grafo Euleriano, e possa ser encontrado o um circuito Euleriano, então assim obtemos o caminho que o carteiro deve percorrer. 5.1.1 Matching O matching (emparelhamento) é realizado para tornar o grafo, um grafo Euleriano. Este processo é realizado sobre os vértices de grau ímpar, nos quais são inseridas novas arestas para tornar estes vértices, vértices de grau par. Essas arestas devem ser inseridas nestes vértices com a distância mínima entre tais vértices. Larson e Odoni(1981 apud [3]) apresentam alguns algoritmos para a realização do matching, são eles o Algoritmo de Edmonds e Johnson(1973), cuja complexidade é O(n 3 ) e o Algoritmo de Christofides(1975). Um outro algoritmo que diversos autores chamam de algoritmo guloso, pode ser utilizado para resolver o emparelhamento, ele é baseado no algoritmo de Christofides, este algoritmo é descrito abaixo: Algoritmo Guloso, baseado em Christofides: Passo 1 Inicialmente crie um grafo G (V,A ), que contém apenas os vértices de grau ímpares do grafo inicial G(V,A), escolha um vértice inicial de G (V,A ) para ser o nó corrente. 16

Figura 5.1: Um grafo não Euleriano Passo 2 Caso o vértice agora é de grau par, obtenha o próximo vértice de G (V,A ) e volte para o passo 2, senão calcule a distância mínima deste vértice a todos os outros vértices de G (V,A ), e determine qual é o vértice final cuja distância do vértice atual é a menor distância dentre as distâncias de todos os outros vértices em relação ao vértice corrente. Passo 3 Crie em G (V,A ) uma nova aresta, ou novas arestas ligando todo o caminho do vértice corrente até o vértice final, calculado no passo 2. Passo 4 Marque os dois vértices como sendo de grau par. Passo 5 Caso existam mais vértices de grau ímpar obtenha-o e volte ao passo 2. No algoritmo de Edmonds e Johnson, é utilizado o algoritmo de BFS (Breadth-First Search), para encontrar os menores caminhos do vértice corrente até todos os outros. A figura 5.1, mostra o exemplo de um processo de emparelhamento, executado pelo algoritmo descrito acima. Inicialmente temos o grafo não Euleriano, e devemos executar o matching. Separe todos os vértices que for de grau ímpar, que o matching trabalhará sobre eles. Escolhe um nó de grau ímpar para iniciar o matching, neste exemplo iniciaremos por A. Posteriormente calcula-se a menor distância de A, a todos os e outros vértices de grau ímpar, como é mostrado na figura 5.2, dentre estes caminhos selecione o menor deles, e ligue uma nova arestas entre os dois vértices, neste exemplo a menor distância é entre A e B, e marque os dois vértices como agora, de grau par e selecione o próximo vértice de grau ímpar, neste exemplo o vértice C. A figura 5.2 agora na parte (d), vemos os caminhos mais curtos saindo de C até os outros vértices de grau ímpar, que no caso é um pois só existe agora C e E, como vértices de grau ímpar, então é criada uma novas arestas paralelas as já existentes pelo caminho de C até F. A figura 5.3 mostra o grafo após a realização do matching. Portanto, a resolução do Problema do Carteiro Chinês para grafos não orientados resume-se em: 17

Figura 5.2: Caminhos mais curtos partindo de A e posteriormente de C. Figura 5.3: Grafo após matching 18

Passo 1: Verificar se o grafo é Euleriano, se for, vá para o passo 5; Passo 2: Identificar os k vértices que possuem grau ímpar. O valor de k será par devido ao grafo ser conexo; Passo 3: Encontrar a menor distância entre esses k vértices, ou seja, o emparelhamento perfeito através do matching; Passo 4: Acrescentar as arestas resultantes do matching ao grafo original; Passo 5: Buscar o circuito euleriano. 5.2 Problema do Carteiro Chinês para grafos orientados Segundo [3] para que o Problema do Carteiro Chinês tenha solução em grafos orientados é necessário que tal grafo seja fortemente conectado. Em outras palavras, deve existir um caminho que, ao ser percorrido, visite todos os vértices do grafo. A determinação desse caminho é feita através da busca do Circuito Euleriano no grafo. Para tanto, existe uma versão do teorema de Euler, baseada em grafos orientados: Teorema de Euler para grafos direcionados:[3] Teorema 5.2 Seja o grafo G(V,A) orientado e conexo. G(V,A) possui um Circuito Euleriano se, e somente se, todos os vértices pertencentes a V possuírem grau de entrada igual ao grau de saída. Em outras palavras, o número de arestas que entram em cada vértice v pertencente a V deve ser igual ao número de arestas que saem de v. Pela teoria dos grafos, um grafo com as características citadas no teorema acima é classificado como simétrico. Para determinar o Circuito Euleriano em um grafo direcionado, seguimos o trabalho de [3]: 1. Separar o conjunto de arestas em um conjunto de ciclos direcionados; 2. Iniciar a rota em um vértice qualquer pertencente a um dos ciclos. Este vértice chamaremos de V 1 ; 3. Percorrer todos os vértices pertencentes ao ciclo até encontrar V 1 ou algum V 2 pertencente a algum outro ciclo ainda não visitado; 4. Se encontrou V 1, encerra o algoritmo pois o circuito está determinado. Senão, visite o ciclo de V 2 antes de encerrar o ciclo de V 1 ; 19

5. Volte ao passo 3, para o ciclo de V 2. Do mesmo modo que em um grafo não orientado, quando o grafo não possuir um Circuito Euleriano, este deve ser obtido através dos algoritmos de emparelhamento, acrescentando novas arestas ao grafo de maneira a minimizar o custo do percurso. 5.3 Problema do Carteiro Chinês para grafos mistos Como já visto, um grafo misto é um grafo que possui tanto arestas orientadas quanto arestas não orientadas. O PCC em grafos mistos é solucionado pela obtenção do circuito Euleriano, assim como em grafos orientados. Segundo Eiselt et al.(1995 apud [3]) um grafo misto tem um circuito Euleriano, se todos os vértices tiverem grau par e sejam balanceados, tais condições estão presentes na versão modificada do Teorema de Euller para grafos mistos. Caso o grafo seja um grafo Euleriano, apenas é necessário encontrar o circuito Euleriano, utilizando um dos algoritmos aplicados no PCC em grafos orientados, e o PCC já está solucionado. Eiselt (Eiselt et. al, 1995 apud [3]) descreve algums passos para determinação do circuito Euleriano em grafos mistos, o qual é descrito abaixo: Método de Eiselt: Passo 1: Atribuir direções às arestas não orientadas para que o grafo se torne simétrico; Passo 2: Atribuir direção aos arcos restantes; Passo 3: Após isto com o grafo está totalmente orientado, pode se utilizar algum dos algoritmos de busca do circuito Euleriano, apresentados no PCC para grafos orientados. No passo 1, apenas observamos que um grafo simétrico, é um grafo em que o número de arestas incidentes é o mesmo de arestas que saem do vértice. Mas se o grafo não for Euleriano, uma abordagem parecida com o emparelhamento pode ser utilizada, porém não existe um algoritmo, que resolve para todo problema, o casamento de custo mínimo em um grafo não Euleriano, segundo [3] algumas abordagens fora propostas como em Grotschel e Win (1992); Christofides et al (1983) e Morábito (1996), mas apenas funcionam para problemas de pequeno e médio porte. 5.4 Problema do Carteiro Chinês Capacitado Este problema consiste em definir n rotas para um conjunto de carteiros, que devem atender à demanda apresentada em um grafo G. Este problema pode ser formulado como um problema de fluxo, com formulado por Golden e Wong(1981 apud [1]). 20

Foi provado por Golden e Wrong(1981), que este problema se trata de um NP-árduo, neste mesmo trabalho foi apresentado um algoritmo para solução de tal problema, o qual é descrito abaixo: INÍCIO Ler o grafo G = (N, A); Faça todas as arestas serem servidas em um circuito individual. Iniciando com o maior circuito disponível, verifique se uma aresta de um circuito menor pode ser servida por um circuito maior. Sujeito às restrições do problema, procure compor dois circuitos de forma a obter a maior economia possível. Repita a composição até não existir composição que traga a economia a solução. FIM Este algoritmo permite a utilização para realizar determinados passos, pois se trata de um algoritmo de alto nível, um exemplo é o Repita, que pode ser implementada utilizando heurísticas apresentadas em Clark e Wright(1964 apud [1]). 5.5 Algoritmos Implementados Dentre os algoritmos apresentados na literatura foram utilizados neste trabalho certos algoritmos na forma original, mas outros realizamos algumas modificações por motivo de desempenho e de simplicidade. No processo de implementação foram utilizados algoritmos para grafos não orientados, por motivo de simplicidade. Para encontrar o circuito Euleriano em um grafo, foi implementado o Algoritmo de Fleury, porém tivemos dificuldade em buscar uma solução quando, durante o percurso, existe mais de uma aresta incidente ao vértice. A solução encontrada foi eleger uma aresta da lista de adjacência de v i e fazer uma busca em largura (BFS), com início no vértice destino da aresta, chamado aqui de v j, até encontrar v i novamente. Ou seja, pesquisamos pela existência de um ciclo. Se esse ciclo não for identificado, a aresta em questão não pode ser escolhida pois trata-se de uma ponte e sua remoção torna o grafo desconexo. Logo uma nova aresta de v i deve ser escalada para análise. Para o matching foi implementado o algoritmo baseado em Christofides(1975), com uma alteração no algoritmo de encontrar os caminhos mínimos, originalmente foi utilizado o algoritmo encontra o matching mínimo, neste trabalho foi utilizado um método guloso para encontrar o matching mínimo, este método guloso utiliza o algoritmo de Djikstra, para determinar as menores distâncias entre os vértices de grau ímpar, para que possa 21

ser inseridas entre eles, novas arestas para que de tal forma o grafo, se torne um grafo Euleriano. 22

Capítulo 6 Aplicações Nesta seção descreveremos algumas situações onde o Problema do Carteiro Chinês é aplicado: 6.1 Roteamento de Veículos Para [1], esta é a principal aplicação do Problema do Carteiro Chinês. Consiste em determinar rotas para uma frota de veículos de maneira que atenda todos os clientes de forma otimizada, minimizando as distâncias percorridas e, consequentemente, os custos. Ao modelar o problema em um grafo, os clientes estão distribuídos ao longo das arestas (as ruas). Ainda no roteamento de veículos pode-se inserir uma restrição de capacidade, ou seja, um valor diferente para cada veículo que indica a quantidade máxima de carga suportada. Tal problema enquadra-se na categoria NP-Difícil. 6.2 Escala de tripulação Este problema relaciona-se com o anterior. é definido da seguinte maneira: dado um veículo, este possui tarefas que irá executar durante uma viagem. é necessário construir um conjunto de turnos, cada qual referenciando uma parte da viagem a ser realizada por uma tripulação nesse veículo, de maneira a cumprir a programação minimizando os custos com a tripulação. 6.3 Varredor de Ruas Este problema consiste em que o varredor de ruas busca do caminho mínimo em um grafo orientado, ou seja, onde as arestas podem ser percorridas em somente uma direção. Este problema foi discutido pela primeira vez em Nova Iorque, por suas avenidas serem de 23

mão única e, portanto, ficou conhecido na literatura como The New York Street Sweeper Problem. 24

Capítulo 7 Conclusão Após estudos realizados sobre o Problema do Carteiro Chinês, podemos definir que este na teoria dos grafos, possui resolução em tempo polinomial para grafos orientados e não orientados. Verificamos que o algoritmo de Fleury encontra um Circuito Euleriano em tempo O(n). Caso o grafo não possua um Circuito Euleriano, pode-se aplicar um algoritmo de emparelhamento, para transformá-lo. Em nossa implementação utilizamos o algoritmo de guloso baseado no algoritmo de Christofides para tal função. 25

Apêndice A Algoritmo utilizado para busca do caminho euleriano no grafo. Implementado na linguagem de Programação Java. public int[] fleury( int inicio ) { int arestas[] = new int[100]; int vertice = inicio; int cont=0; NodoAresta a, b; //aresta a-b == aresta b-a this.mostragrafo(); while(this.existearesta()) { if(g[vertice].arestasrestantes() == 1) a = G[vertice].getRestante(); else { a = this.escolhenaoponte(vertice); } arestas[cont] = a.getident(); int aux = vertice; //aux recebe o vertice de origem a.setretirada( s ); //marca como aresta percorrida vertice = a.getdestino(); //vertice recebe o novo vertice b = G[vertice].getAresta(aux); //b recebe a aresta que liga o novo vertice ao antigo b.setretirada( s ); //marca como aresta percorrida cont++; } return arestas; } Este algoritmo é utilizado pelo algoritmo de Fleury, para escolher o próxima aresta a ser seguida, mas que ela não seja uma ponte, pois se o algoritmo percorrer pela ponte, ela a eliminaria e o grafo ficaria desconexo.segue o algoritmo que escolhe uma aresta 26

não-ponte, implementado em linguagem Java. public NodoAresta escolhenaoponte(int vertice) { NodoAresta ret, a, b, c; NodoVertice u; Fila f = new Fila(); int destino, aux1, origem; a = G[vertice].getRestante(); while(a!= null) { if((a.getretirada() == n ) && (a.getvisitada() == n )) { ret = a; destino = a.getdestino(); a.setvisitada( s ); c = G[destino].getAresta(vertice); c.setvisitada( s ); f.enqueue(g[destino]); while(!f.isempty()) { u = f.dequeue(); origem = u.getindice(); b = u.getrestante(); while(b!= null) { if((b.getvisitada() == n ) && (b.getretirada()== n )) { aux1 = b.getdestino(); if(aux1 == vertice) return ret; b.setvisitada( s ); c = G[aux1].getAresta(origem); c.setvisitada( s ); f.enqueue(g[aux1]); } b = b.getprox(); } } } a = a.getprox(); } return null; } 27

Referências Bibliográficas [1] Goldbarg, Marco C., Pacca, H., Lima, Loureiro. Otimização Combinatória e Programação Linear. 2 Edição. Editora Campus. 2005. [2] Oliveira, J.A., O Problema do Carteiro Chinês. Disponível em: webdi.ci.uminho.pt/6307n2 L EGI/pdfs/T CART EIRO05.pdf. Acessado em: 30/05/2007. [3] Godinho Filho, Moacir, Junqueira, Rogério de Ávila Ribeiro. Um algoritmo para auxiliar na escolha de métodos de solução para o Problema do Carteiro Chinês: proposta e aplicação em uma grande cidade do interior paulista. XII SIMPEP, Bauru, São Paulo, 2005. 28