Dato un elenco di punti, trova il percorso più breve che visita tutti i punti e ritorna al punto di partenza.
Il problema del commesso viaggiatore è ben noto nel campo dell'informatica, così come molti modi per calcolarlo / approssimarlo. È stato risolto per gruppi di punti molto grandi, ma alcuni dei più grandi impiegano molti anni CPU per finire.
Non farti bruciare dalla patata.
Hot Potato è un gioco in cui 2+ giocatori passano in circolo una "patata" mentre suona la musica. L'obiettivo è di passarlo rapidamente al giocatore successivo. Se tieni la patata quando la musica si ferma, sei fuori.
L'oggetto di Hot Potato Salesman è:
Dato un insieme di 100 punti unici , restituisci quei punti in un ordine migliore ( distanza totale più corta come definita più in basso ). Questo "passerà" il problema al giocatore successivo. Devono migliorarlo e passarlo al successivo, ecc. Se un giocatore non può migliorarlo, sono fuori e il gioco continua fino a quando rimane un giocatore.
Per evitare che si tratti di una competizione "forza-bruta-me-a-path", ci sono queste clausole:
Non puoi impiegare più di un minuto per passare la patata. Se non hai trovato e superato una soluzione più breve al termine di un minuto, sei fuori.
Non è possibile modificare la posizione di oltre 25 punti. Per l'esattezza, i
>= 75
punti devono trovarsi nella stessa posizione in cui li hai ricevuti. Non importa quali decidi di cambiare, ma solo l' importo che cambi.
Quando rimane un solo giocatore, è il vincitore di quel gioco e riceve un punto. Un torneo è costituito da 5*n
giochi, in cui n
è il numero di giocatori. Ogni partita, il giocatore iniziale verrà ruotato e l'ordine del giocatore rimanente verrà mischiato . Il giocatore con il maggior numero di punti alla fine è il vincitore del torneo. Se il torneo termina con un pareggio per il primo posto, un nuovo torneo verrà giocato solo con quei concorrenti. Questo continuerà fino a quando non vi sarà alcun pareggio.
Il giocatore iniziale per ogni partita riceverà una serie di punti selezionati in modo pseudocasuale in nessun ordine particolare.
I punti sono definiti come una coppia di x,y
coordinate intere su una griglia cartesiana. La distanza è misurata utilizzando Manhattan distanza , |x1-x2| + |y1-y2|
. Tutte le coordinate saranno [0..199]
comprese nell'intervallo.
Ingresso
L'input viene fornito con un singolo argomento stringa. Sarà composto da 201 numeri interi separati da virgola che rappresentano il numero di giocatori attuali ( m
) e 100 punti:
m,x0,y0,x1,y1,x2,y2,...,x99,y99
L'ordine di questi punti è il percorso corrente. La distanza totale si ottiene aggiungendo la distanza da ciascun punto al successivo ( dist(0,1) + dist(1,2) + ... + dist(99,0)
). Non dimenticare di tornare all'inizio per calcolare la distanza totale!
Nota che non lom
è il numero di giocatori che hanno iniziato il gioco, è il numero che è ancora presente.
Produzione
L'output è dato allo stesso modo dell'input, meno m
; una singola stringa contenente numeri interi separati da virgola che rappresentano i punti nel loro nuovo ordine.
x0,y0,x1,y1,x2,y2,...,x99,y99
Il programma di controllo attenderà l'output solo per un minuto. Alla ricezione dell'output, verificherà che:
- l'output è ben formato
- l'uscita consiste di soli e tutti i punti 100 presente in ingresso
>=75
i punti sono nelle loro posizioni originali- la lunghezza del percorso è inferiore al percorso precedente
Se uno di questi controlli fallisce (o non c'è output), sei fuori e il gioco passerà al giocatore successivo.
Programma di controllo
Puoi trovare il programma di controllo a questo link . Il programma di controllo stesso è deterministico ed è pubblicato con un seme fittizio di1
. Il seme utilizzato durante il punteggio sarà diverso, quindi non preoccuparti di cercare di analizzare l'ordine dei turni / gli elenchi di punti che sputa.
La classe principale è Tourney
. Correre in questo modo farà un torneo completo con i concorrenti indicati come argomenti. Sputa il vincitore di ogni partita e un conteggio alla fine. Un torneo di esempio con due SwapBot è simile:
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 vuoi provare solo un gioco alla volta, puoi eseguire la Game
classe. Questo eseguirà una partita con i giocatori nell'ordine indicato come argomenti. Per impostazione predefinita, stamperà anche un play-by-play che mostra il giocatore attuale e la lunghezza del percorso.
Sono inclusi anche un paio di giocatori di prova: SwapBot
, BlockPermuter
, e TwoSwapBot
. I primi due non saranno inclusi nelle sessioni di punteggio, quindi sentitevi liberi di usarli e abusarli durante i test. TwoSwapBot
volontà incluso nel giudicare, e non è sciatto, quindi porta il tuo A-game.
Miscellanea
Non è possibile salvare le informazioni sullo stato e ogni turno è un'esecuzione separata del programma. L'unica informazione che riceverai ad ogni turno è l'insieme di punti.
Non è possibile utilizzare risorse esterne. Ciò include le chiamate di rete e l'accesso ai file.
Non è possibile utilizzare le funzioni di libreria progettate per risolvere / assistere con il problema TSP o le sue varianti.
Non puoi manipolare o interferire con altri giocatori in alcun modo.
Non è possibile manipolare o interferire con il programma di controllo o eventuali classi o file inclusi in alcun modo.
Il multithreading è consentito.
Un invio per utente. Se invii più di una voce, inserirò solo la prima inviata. Se si desidera modificare l'invio, modificare / eliminare l'originale.
Il torneo si svolgerà su Ubuntu 13.04, su un computer con una CPU i7-3770K e 16 GB di RAM. Non verrà eseguito in una macchina virtuale. Qualunque cosa che percepisca come dannosa squalificherà immediatamente la voce corrente e quella futura che invii.
Tutte le voci devono essere eseguibili dalla riga di comando con software gratuito ( come nella birra ). In caso di problemi durante la compilazione / esecuzione della voce, chiederò aiuto nei commenti. Se non rispondi o alla fine non riesco a farlo funzionare, verrà squalificato.
Risultati (22 maggio 2014)
Nuovi risultati sono arrivati! UntangleBot ha battuto la concorrenza abbastanza profondamente. TwoSwapBot ha registrato sette vittorie e SANNbot ha anche conquistato una vittoria. Ecco un quadro di valutazione e un collegamento all'output non elaborato :
Wins Contestant
22 (2) ./UntangleBot
7 (0) TwoSwapBot
1 (5) SANNbot.R
0 (1) BozoBot
0 (3) Threader
0 (4) DivideAndConquer
Così com'è ora , UntangleBot ha vinto il segno di spunta. Non lasciarti scoraggiare dall'entrare, però, dato che gestirò il torneo quando compaiono più concorrenti e cambierò la risposta accettata di conseguenza.