trab123432

6
Programa¸c˜ ao II - Trabalho 1 Mariella Berger 4 de outubro de 2011 Resumo Especica¸c˜ ao do primeiro trabalho de Programa¸c˜ ao II: Implementa¸ ao em C das heur´ ısticas Vizinho mais Pr´ oximo e Algoritmo Gen´ etico para encontrar uma resposta para o problema do Caixeiro Viajante. Consi- dera¸ oes feitas em sala tamb´ em devem ser atendidas. 1 Introdu¸ ao O Problema do Caixeiro Viajante (Traveling Salesman Problem, doravante cha- mado de TSP) comp˜ oe um cl´ assico da carreira de algoritmos, teoria dos grafos, otimiza¸c˜ ao combinatorial e tantas outras ´ areas de estudos computacionais e ma- tem´ aticos. Al´ em disso, ´ e um problema fascinante e pertence ao seleto grupo de problemas NP-Completos (o que o torna ainda mais fascinante). A forma assim´ etrica do TSP (Asymmetric Traveling Salesman Problem, do- ravante chamado de ATSP), ´ e uma variante menos explorada do problema ori- ginal. Este trabalho aborda o problema atravs da combina¸ ao das heur´ ısticas Vizinho mais Pr´ oximo e Algoritmo Gen´ etico. 1.1 Defini¸ oes Um caixeiro viajante deve visitar v´ arias cidades partindo de uma cidade inicial qualquer, passando por todas as cidades exatamente uma vez e voltando ` a cidade inicial no m do percurso. Sabendo os custos entre todas as cidades, o caixeiro deve fazer esse caminho de forma que o custo total percorrido seja o menor poss´ ıvel. Chamamos uma rota, ou caminho, de tour. Chamamos o caminho de menor custo poss´ ıvel de tour ´ otimo. Em teoria dos grafos, o problema ´ e representado por um grafo direcionado completo com arestas e valoradas. O problema consiste em encontrar um Ciclo Hamiltoniano (um ciclo (caminho fechado) que passa por cada v´ ertice do grafo exatamente uma vez) com o menor custo poss´ ıvel. O custo total de um ciclo percorrido ´ e a soma dos custos dos arcos percorridos (tamb´ em chamados de peso). Matematicamente, tem-se um conjunto de N cidades e uma matriz de custos M = m i,j [0 <= i, j <= N - 1] onde m i,j ´ e o custo entre o par de cidades (i, j ), ou seja, o custo de partir da cidade i e chegar diretamente at´ e a cidade j . 1

description

trab123432

Transcript of trab123432

  • Programacao II - Trabalho 1

    Mariella Berger

    4 de outubro de 2011

    Resumo

    Especicacao do primeiro trabalho de Programacao II: Implementacaoem C das heursticas Vizinho mais Proximo e Algoritmo Genetico paraencontrar uma resposta para o problema do Caixeiro Viajante. Consi-deracoes feitas em sala tambem devem ser atendidas.

    1 Introducao

    O Problema do Caixeiro Viajante (Traveling Salesman Problem, doravante cha-mado de TSP) compoe um classico da carreira de algoritmos, teoria dos grafos,otimizacao combinatorial e tantas outras areas de estudos computacionais e ma-tematicos. Alem disso, e um problema fascinante e pertence ao seleto grupo deproblemas NP-Completos (o que o torna ainda mais fascinante).

    A forma assimetrica do TSP (Asymmetric Traveling Salesman Problem, do-ravante chamado de ATSP), e uma variante menos explorada do problema ori-ginal. Este trabalho aborda o problema atravs da combinacao das heursticasVizinho mais Proximo e Algoritmo Genetico.

    1.1 Definicoes

    Um caixeiro viajante deve visitar varias cidades partindo de uma cidade inicialqualquer, passando por todas as cidades exatamente uma vez e voltando a cidadeinicial no m do percurso. Sabendo os custos entre todas as cidades, o caixeirodeve fazer esse caminho de forma que o custo total percorrido seja o menorpossvel. Chamamos uma rota, ou caminho, de tour. Chamamos o caminho demenor custo possvel de tour otimo.

    Em teoria dos grafos, o problema e representado por um grafo direcionadocompleto com arestas e valoradas. O problema consiste em encontrar um CicloHamiltoniano (um ciclo (caminho fechado) que passa por cada vertice do grafoexatamente uma vez) com o menor custo possvel. O custo total de um ciclopercorrido e a soma dos custos dos arcos percorridos (tambem chamados depeso).

    Matematicamente, tem-se um conjunto de N cidades e uma matriz de custos

    M = mi,j [0

  • mi,j = ci,j

    O objetivo do problema e achar a permutacao das cidades que minimizea seguinte funcao:

    (N2

    i=0 c((i), (i + 1))) + c((N 1), (0))

    No ATSP, para cada par de cidades (i, j), pode-se haver custos diferentesdependendo da direcao do arco, ou seja, os custos entre duas cidades sao nao-simetricos. Este fato torna sua matriz de custos uma matriz assimetrica.

    O ATSP e facil de ser resolvido: geram-se todas as permutacoe possveis ecalcula-se o custo de cada uma delas. A permutacao com o menor custo e ocaminho procurado.Esta seria uma otima solucao, se nao fosse por um detalhe:dadas N cidades, sao geradas N ! permutacoes, o que torna esta solucao intrataveldo ponto de vista computacional. Basta observar-se que para se obter umasolucao de rota com 21 cidades, seriam explorados

    21! = 51.090.942.171.709.440.000

    tours diferentes. Supondo que se tem um processador de 3.6GHz, que podefazer 3.6x109 ciclos por segundo, e que pode gerar um tour a cada ciclo doprocessador, seriam levados

    51.090.942.171.709.440.000/3.600.000.000 = 14.191.928.382

    segundos para se encontrar e explorar todos os caminhos possveis. Mas14.191.928.382 segundos sao aproximadamente 450 anos! E nao se deseja esperar450 anos para encontrar o melhor tour entre apenas 21 cidades.

    Computacionalmente sabe-se que o ATSP pertence a classe de problemascom complexidade O(N !) e a classe de problemas NP-Completos. Devido a essaalta complexidade, existem diversas heursticas que encontram solucoes parao problema num tempo computacional satisfatorio (polinomial), mas nenhumadelas garante que a solucao encontrada e a otima.

    Este trabalho aborda o problema primeiramente atraves da construcao detours iniciais. A escolha desses tours e suas implicacoes sao mostradas na secao1.1.1. Depois da escolha dos tours iniciais, e aplicado o algoritmo genetico,explicado na secao 1.1.2.

    1.1.1 O Tour Inicial

    Este trabalho utiliza a heurstica Vizinho Mais Proximo (Nearest Neighbour,doravante chamado de NN) para construir dois tours iniciais. Esse algoritmo foiescolhido entre outros algoritmos de construcao de tour (como Greedy, PATCH,por exemplo) pois, num amplo estudo do ATSP realizado por Cirasella, Johnson,McGeoch e Zhang em [Cirasella et al. (2001)], ele se mostrou mais eciente etrouxe melhores resultados em qualidade de tour nas instancias estudadas.

    No algoritmo NN, o tour se inicia com uma cidade qualquer (neste trabalho,as cidades escolhidas como iniciais, para cada um dos tours gerados, sao ascidades de ndice 0 e n 1, respectivamente). Enquanto nao se insere todasas cidades, o tour ainda e um caminho e nao um ciclo. So se tornara um cicloquando, ao final, liga-se a ultima cidade a primeira.

    2

  • Havera entao sempre uma cidade sem destino: a cidade no fim do caminho.A partir dessa cidade, escolhe-se o destino de menor custo a partir dela (dentretodas as demais cidades que ainda nao estao no caminho da o nome VizinhoMais Proximo). Quando nao houver mais cidades a serem ligadas ao caminho,liga-se a ultima cidade a primeira, fechando assim o ciclo com todas as cidades,sem repeti-las ou deixar alguma de fora do ciclo.

    Ha casos em que o NN pode gerar tours com custos finais absurdos devidoa falta de opcoes de escolha de arcos com custos viaveis. Casos como esse saovistos raramente em algumas instancias, mas e importante ressaltar essa possvelanomalia.

    1.1.2 O Algoritmo Genetico - GA

    Apos os tours iniciais serem encontrados atraves do algoritmo NN, esses toursserao submetidos ao algoritmo genetico. Dados os tours iniciais, o GA consisteem rearranjar esses tours gerando novos tours atraves das operacoes de crossovere de mutacao.

    Como operador de crossover pode-se utilizar Order Operator (OX). Inicial-mente constroem-se os descendentes escolhendo uma subsequencia de um tourde um pai e preservando a ordem relativa das cidades do outro pai. Exemplo:

    p1 = (1 2 3 | 4 5 6 7 | 8 9)p2 = (4 5 2 | 1 8 7 6 | 9 3) - mantm os segmentos selecionadoso1 = (x x x | 4 5 6 7 | x x)o2 = (x x x | 1 8 7 6 | x x)

    A seguir, partindo do ponto do segundo corte de um dos pais, as cidadesdo outro pai sao copiadas na mesma ordem, omitindo-se as cidades que estaoentre os pontos de corte. Ao se atingir o final do vetor continua-se no incio domesmo.

    o1 = (2 1 8 | 4 5 6 7 | 9 3)o2 = (3 4 5 | 1 8 7 6 | 9 2)

    Ja como tecnica de mutacao dos filhos gerados deve-se utilizar a Recipro-cal Exchange. Esta tecnica sorteia aleatoriamente duas cidades e inverte suasposicoes. Exemplo:

    (123456789) > (123756489)

    2 Objetivo

    Implementar as heursticas Vizinho mais Proximo e Algoritmo Genetico des-critas anteriormente a m de encontrar, num tempo computacional viavel, umcaminho satisfatorio a ser seguido por um caixeiro viajante que precisa visitarn cidades, passando exatamente uma vez por cada cidade, e voltando para acidade inicial no nal do percurso.

    3

  • 3 Requisitos

    Seu programa vai ler do stdin o numero n de cidades que o caixeiro viajantedevera visitar. Em seguida, lera do stdin a matriz M(n, n) de distancias entresos pares de cidades. Exemplo de entrada para n = 3 cidades:

    999999 331 450162 999999 970856 424 999999

    A primeira cidade sera identicada pelo ndice 0, a segunda pelo ndice 1 eassim sucessivamente. A matriz deve ser lida de forma que ao se acessar o valorde M [1][2], o resultado obtido seja 970, que indica que o custo de ir da cidade dendice 1 ate a cidade de ndice 2 e 970. Os numeros de cada linha sao separadospor um espaco.

    A sada do programa deve conter a ordem das cidades que o caixeiro devevisitar (uma cidadeda por linha), de acordo com o algoritmo NN. Em seguida,deve-se imprimir o custo do tour encontrado de acordo com esse algoritmo, se-guido de um asterisco. Lembre-se que o algoritmo NN gerara dois tours iniciais:iniciando da cidade 0 e iniciando da cidade n1. Por exemplo, a primeira parteda sada do programa para a entrada acima deve ser a impressao na tela de:

    0122157*2101036*

    Em seguida, devem ser impressos os tours gerados a partir do algoritmogenetico, respeitando o formato anterior (a ordem das cidades que o caixeirodeve visitar (uma cidade por linha) seguida do custo do tour encontrado seguidode um asterisco). Por exemplo, a segunda parte da sada do programa para aentrada acima deve ser a impressao na tela de (lembre-se que seu resultadopodera ser diferente!):

    1021036*1202157*

    4

  • Portanto, a sada nal do programa para a entrada acima deve ser:

    0122157*2101036*1021036*1202157*

    Deve-se vericar se o numero de argumentos recebidos pelo programa estacorreto. Se nao estiver deve-se imprimir uma mensagem de erro. Nao e ne-cessario vericar se os numeros lidos na matriz de custos sao realmente numerosvalidos.

    4 Entrega

    Este trabalho deve ser feito em grupo de ate dois (2) componentes e entregue ateo dia 24 de outubro de 2011 (segunda). O trabalho vale 10 pontos. Trabalhosconsiderados plagio, com erro de execucao, com formato de sada incorreto,ou que nao compilarem terao nota 0 (no caso de plagio, para quem copioue para quem forneceu o trabalho). Trabalhos entregues apos o prazo seraoautomaticamente rejeitados.

    Os codigos do seu programa tambem serao analisados. Codigos confusos,sem comentarios sucientes e com funcoes desnecessarias tambem poderao ternota 0.

    O trabalho deve ser enviado para:

    [email protected]

    O assunto da mensagem deve conter o nome completo dos intergrantes (comespacos e sem acentos), como a seguir:

    pd2:trab1:Pedro Alvares Cabral:Cristovao Colombo

    O nome do arquivo com o trabalho enviado em anexo deve ser trab1.zip. Elesera descompactado da seguinte forma:

    5

  • unzip trab1.zip

    e devera gerar, pelo menos, um arquivo chamado trab1.c, com o codigoprincipal do programa e um arquivo LEIAME.txt, com as consideracoes sobrea implementacao do seu trabalho. O programa sera compilado e executado daseguinte forma:

    gcc -otrab1 trab1.c./trab1

    5 Duvidas

    Em caso de duvidas na especicacao do trabalho ou no proprio trabalho, contate-me em

    [email protected]

    6