Dada uma lista de pontos, encontre o caminho mais curto que visite todos os pontos e retorne ao ponto de partida.
O Problema do Vendedor Viajante é bem conhecido no campo da ciência da computação, pois há muitas maneiras de calcular / aproximar esse problema. Foi resolvido para grupos muito grandes de pontos, mas alguns dos maiores levam muitos anos de CPU para serem concluídos.
Não se queime pela batata.
Hot Potato é um jogo em que mais de 2 jogadores passam uma "batata" em círculo enquanto a música toca. O objetivo é passá-lo para o próximo jogador rapidamente. Se você estiver segurando a batata quando a música parar, estará fora.
O objetivo do vendedor de batata quente é:
Dado um conjunto de 100 pontos únicos , retorne esses pontos em uma ordem melhor ( distância total menor, conforme definido mais abaixo ). Isso "passará" o problema para o próximo jogador. Eles precisam aprimorá-lo e passá-lo para o próximo, etc. Se um jogador não puder melhorá-lo, eles estarão fora e o jogo continuará até que um jogador seja deixado.
Para evitar que isso seja uma competição de "força bruta-por-um-caminho", existem as seguintes estipulações:
Você não pode demorar mais de um minuto para passar a batata. Se você não encontrou e aprovou uma solução mais curta quando termina um minuto, está fora.
Você não pode alterar a posição de mais de 25 pontos. Para ser exato, os
>= 75
pontos devem estar na mesma posição em que você os recebeu. Não importa quais você decide mudar, apenas a quantidade que você muda.
Quando resta apenas um jogador, ele é o vencedor do jogo e recebe um ponto. Um torneio consiste em 5*n
jogos, onde n
é o número de jogadores. A cada jogo, o jogador inicial será girado e a ordem restante do jogador será embaralhada . O jogador com mais pontos no final é o vencedor do torneio. Se o torneio terminar empatado em primeiro lugar, um novo torneio será disputado apenas com esses competidores. Isso continuará até que não haja empate.
O jogador inicial de cada jogo receberá um conjunto de pontos selecionados pseudo-aleatoriamente em nenhuma ordem específica.
Os pontos são definidos como um par de x,y
coordenadas inteiras em uma grade cartesiana. A distância é medida usando Manhattan distância , |x1-x2| + |y1-y2|
. Todas as coordenadas estarão no [0..199]
intervalo.
Entrada
A entrada é fornecida com um argumento de cadeia única. Ele consistirá em 201 inteiros separados por vírgula, representando o número de jogadores atuais ( m
) e 100 pontos:
m,x0,y0,x1,y1,x2,y2,...,x99,y99
A ordem desses pontos é o caminho atual. A distância total é obtida adicionando a distância de cada ponto ao próximo ( dist(0,1) + dist(1,2) + ... + dist(99,0)
). Não se esqueça de voltar ao início ao calcular a distância total!
Note que m
é não o número de jogadores que iniciaram o jogo, é o número que ainda está dentro
Saída
A saída é dada da mesma maneira que a entrada, menos m
; uma única sequência contendo números inteiros separados por vírgula, representando os pontos em sua nova ordem.
x0,y0,x1,y1,x2,y2,...,x99,y99
O programa de controle aguardará a saída por apenas um minuto. Quando a saída é recebida, ele verifica se:
- a saída é bem formada
- a saída consiste em apenas e todos os 100 pontos presentes na entrada
>=75
pontos estão em suas posições originais- o comprimento do caminho é menor que o caminho anterior
Se alguma dessas verificações falhar (ou não houver saída), você estará fora e o jogo prosseguirá para o próximo jogador.
Programa de Controle
Você pode encontrar o programa de controle neste link . O programa de controle em si é determinístico e é lançado com uma semente fictícia de1
. A semente usada durante a pontuação será diferente, portanto, não se preocupe em tentar analisar a lista de pontos / ordem dos turnos que ela cospe.
A classe principal é Tourney
. Se isso acontecer, será realizado um torneio completo, com os participantes como argumentos. Ele cuspiu o vencedor de cada jogo e uma contagem no final. Um torneio de amostra com dois SwapBots é semelhante a:
Starting tournament with seed 1
(0) SwapBot wins a game! Current score: 1
(1) SwapBot wins a game! Current score: 1
(1) SwapBot wins a game! Current score: 2
(1) SwapBot wins a game! Current score: 3
(0) SwapBot wins a game! Current score: 2
(1) SwapBot wins a game! Current score: 4
(1) SwapBot wins a game! Current score: 5
(1) SwapBot wins a game! Current score: 6
(1) SwapBot wins a game! Current score: 7
(1) SwapBot wins a game! Current score: 8
Final Results:
Wins Contestant
2 (0) SwapBot
8 (1) SwapBot
Se você quiser testar apenas um jogo de cada vez, poderá executar a Game
aula. Isso executará um jogo com os jogadores na ordem dada como argumento. Por padrão, ele também imprimirá uma reprodução por reprodução, mostrando o player atual e o comprimento do caminho.
Também estão incluídos alguns jogadores de teste: SwapBot
, BlockPermuter
, e TwoSwapBot
. Os dois primeiros não serão incluídos nas execuções de pontuação; portanto, fique à vontade para usá-los e abusar deles durante o teste. TwoSwapBot
vai incluído no julgamento, e ele não é desleixado, então traga seu A-game.
Miscelânea
Você não pode salvar informações de estado e cada turno é uma execução separada do seu programa. A única informação que você receberá a cada turno é o conjunto de pontos.
Você não pode usar recursos externos. Isso inclui chamadas de rede e acesso a arquivos.
Você não pode usar as funções da biblioteca projetadas para resolver / ajudar com o problema do TSP ou suas variantes.
Você não pode manipular ou interferir com outros jogadores de forma alguma.
Você não pode manipular ou interferir no programa de controle ou em quaisquer classes ou arquivos incluídos de forma alguma.
Multi-threading é permitido.
Um envio por usuário. Se você enviar mais de uma entrada, inserirei apenas a primeira. Se você deseja alterar seu envio, edite / exclua o original.
O torneio será executado no Ubuntu 13.04, em um computador com um CPU i7-3770K e 16GB de RAM. Não será executado em uma VM. Qualquer coisa que eu considere maliciosa desqualificará imediatamente a entrada atual e futura que você enviar.
Todas as entradas devem ser executáveis na linha de comando com free ( como na cerveja ). Se eu tiver problemas para compilar / executar sua entrada, solicitarei ajuda nos comentários. Se você não responder ou se eu não conseguir colocá-lo em execução, ele será desqualificado.
Resultados (22 de maio de 2014)
Novos resultados estão chegando! O UntangleBot venceu bastante a concorrência. O TwoSwapBot conseguiu sete vitórias e o SANNbot também obteve uma vitória. Aqui está um placar e um link para a saída bruta :
Wins Contestant
22 (2) ./UntangleBot
7 (0) TwoSwapBot
1 (5) SANNbot.R
0 (1) BozoBot
0 (3) Threader
0 (4) DivideAndConquer
Como está agora , o UntangleBot ganhou a marca de seleção. Não deixe que isso o desanime de participar, pois eu vou disputar o torneio à medida que mais competidores aparecerem e mudar a resposta aceita de acordo.