O objetivo deste trabalho é a implementação de heurísticas para encontrar soluções para o problema do caixeiro viajante (PCV).
O trabalho deve ser feito em equipe de no máximo duas pessoas. O compartilhamento de informações entre as equipes é permitido (e aconselhado), mas o compartilhamento de código não é permitido. Trabalhos que tenham porções significativas de código iguais, ou copiados da internet, serão anulados. Veja a resolução Nº 008/2007-COU para as possíveis sansões disciplinares.
Este trabalho vale 2,0 na segundo nota, 1,0 relativo ao critério de avaliação oficial da disciplina e 1,0 extra (bônus).
Data de entrega: até o dia 12/06/2012 às 23:00h.
Implementar as seguintes heurísticas para o PCV:
O programa deve receber como parâmetro na linha de comando o nome do algoritmo e o nome de um arquivo e escrever na saída padrão o custo da viagem e a viagem encontrada pelo algoritmo para a instância especificada pelo arquivo de entrada.
O nome do algoritmo pode ser um dos valores: NN, MST, NN+2opt, NN+3opt, MST+2opt, MST+3opt. Nomes do tipo A+B, significam a aplicação da heurística construtiva A seguido da heurística melhorativa B.
Por exemplo, para os parâmetros NN e arquivo.tsp, a saída do programa poderia ser
18 1 2 3 8 6 5 4 7 1
Onde 18
é o custo da viagem e 1 2 3 8 6 5 4 7 1
é a viagem.
Os arquivo de entrada são uma simplificação dos arquivos da tsplib.
Cada linha do arquivo de entrada contém a descrição de um vértice (ponto no plano cartesiano):
inteiro real real
O primeiro valor é o número do vértice, o segundo a coordenada x
e o terceiro
a coordenada y
. O grafo (completo) de entrada deve ser construído calculando
a distância entre todos os pares de pontos. Para dois vértices (x1, y1)
e
(x2, y2)
a distância (inteira) entre os vértices deve ser calculada da
seguinte forma:
dx = x1 - x2
dy = y1 - y2
dist_real = sqrt(dx * dx + dy * dy)
dist_int = int(dist_real + 0.5)
Confira as soluções ótimas para estes arquivos de entrada. Observe que estes ótimos foram calculados com distâncias inteiras.
As linguagens permitidas para a implementação deste trabalho são:
Para facilitar o desenvolvimento do trabalho, está disponível um
projeto com alguns arquivos iniciais, entre eles
um programa chamado runner
que compara a execução dos diversos algoritmos e
um Makefile
para enviar o trabalho.
Para utilizar o programa runner
é necessário escrever dois scripts: um
chamado compilar
, que quando executado deve compilar o seu programa, e outro
chamado executar
, que quando executado deve executar o seu programa.
Para executar o programa runner
, execute o comando
make run
Todos os arquivos de código do programa devem ficar no diretório src
, isto é
importante porque o script de envio do trabalho enviará, além dos arquivos
compilar
e executar
, apenas os arquivos deste diretório. Tenha o cuidado de
não deixar arquivos compilador no diretório src
.
Para enviar o trabalho, execute o comando
make enviar
O script de envio criará um arquivo compactado com os arquivos a serem entregues para correção e enviará para a página do professor.
O trabalho deve ser enviado até as 23:00h do dia 12/06/2012. O trabalho deve ser apresentado pela equipe ao professor no dia 13/06 ou 15/06 no horário da aula.
Este trabalho vale 2,0 pontos na segunda nota. O trabalho será avaliado de acordo com os critérios:
Esta seção contém alguns dicas de implementação. Use as que achar útil.