Suchen Sie anhand einer Liste von Punkten den kürzesten Pfad, der alle Punkte aufruft und zum Ausgangspunkt zurückkehrt.
Das Problem des Handlungsreisenden ist auf dem Gebiet der Informatik bekannt, da es viele Möglichkeiten gibt, es zu berechnen / zu approximieren. Es wurde für sehr große Punktegruppen gelöst, aber einige der größten benötigen viele CPU-Jahre, um fertig zu werden.
Lass dich nicht von der Kartoffel verbrennen.
Hot Potato ist ein Spiel, bei dem 2+ Spieler eine "Kartoffel" im Kreis herumreichen, während Musik spielt. Das Ziel ist, es schnell an den nächsten Spieler weiterzugeben. Wenn Sie die Kartoffel halten, während die Musik aufhört, sind Sie draußen.
Gegenstand des Hot Potato Salesman ist:
Bei einer Menge von 100 eindeutigen Punkten geben Sie diese Punkte in einer besseren Reihenfolge zurück ( kürzere Gesamtentfernung, wie weiter unten definiert ). Dadurch wird das Problem an den nächsten Spieler "weitergegeben". Sie müssen es verbessern und an die nächste weitergeben usw. Wenn ein Spieler es nicht verbessern kann, sind sie aus und spielen weiter, bis ein Spieler übrig ist.
Damit dies kein "Brute-Force-Me-A-Path" -Wettbewerb ist, gelten folgende Bestimmungen:
Sie können nicht länger als eine Minute brauchen , um die Kartoffel zu überholen. Wenn Sie bis zum Ablauf einer Minute keine kürzere Lösung gefunden und verabschiedet haben, sind Sie unterwegs.
Sie können die Position von mehr als 25 Punkten nicht ändern . Um genau zu sein,
>= 75
müssen sich die Punkte an derselben Position befinden, an der Sie sie erhalten haben. Es spielt keine Rolle, welche Sie ändern möchten, sondern nur den Betrag, den Sie ändern.
Wenn nur noch ein Spieler übrig ist, ist er der Gewinner dieses Spiels und erhält einen Punkt. Ein Turnier besteht aus 5*n
Spielen, wobei n
die Anzahl der Spieler ist. Bei jedem Spiel wird der Startspieler gedreht und die verbleibende Spielerreihenfolge wird gemischt . Der Spieler mit den meisten Punkten am Ende ist der Gewinner des Turniers. Wenn das Turnier mit einem Unentschieden um den ersten Platz endet, wird ein neues Turnier nur mit diesen Teilnehmern gespielt. Dies wird so lange fortgesetzt, bis es kein Unentschieden mehr gibt.
Der Startspieler für jedes Spiel erhält eine Reihe von pseudozufällig ausgewählten Punkten in keiner bestimmten Reihenfolge.
Punkte werden als ein Paar ganzzahliger x,y
Koordinaten in einem kartesischen Gitter definiert. Die Entfernung wird gemessen mit Manhattan - Distanz , |x1-x2| + |y1-y2|
. Alle Koordinaten liegen im [0..199]
Bereich.
Eingang
Die Eingabe erfolgt mit einem einzelnen String-Argument. Es besteht aus 201 durch Kommas getrennten ganzen Zahlen, die die Anzahl der aktuellen Spieler ( m
) und 100 Punkte darstellen:
m,x0,y0,x1,y1,x2,y2,...,x99,y99
Die Reihenfolge dieser Punkte ist der aktuelle Pfad. Die Gesamtentfernung ergibt sich durch Addition der Entfernung von jedem Punkt zum nächsten ( dist(0,1) + dist(1,2) + ... + dist(99,0)
). Vergessen Sie nicht, zurückzukehren, um die Gesamtstrecke zu berechnen!
Beachten Sie, dass m
ist nicht die Anzahl der Spieler, die das Spiel gestartet wird , ist es die Zahl , die noch in sind.
Ausgabe
Die Ausgabe erfolgt wie die Eingabe minus m
; Eine einzelne Zeichenfolge mit durch Kommas getrennten Ganzzahlen, die die Punkte in ihrer neuen Reihenfolge darstellen.
x0,y0,x1,y1,x2,y2,...,x99,y99
Das Steuerungsprogramm wartet nur eine Minute auf die Ausgabe. Beim Empfang der Ausgabe wird Folgendes überprüft:
- der ausgang ist wohlgeformt
- Die Ausgabe besteht aus nur und all den 100 Punkten in dem Eingang
>=75
Die Punkte befinden sich an ihren ursprünglichen Positionen- Die Pfadlänge ist kürzer als der vorherige Pfad
Wenn eine dieser Prüfungen fehlschlägt (oder keine Ausgabe erfolgt), sind Sie aus und das Spiel wird zum nächsten Spieler fortgesetzt.
Steuerungsprogramm
Das Steuerungsprogramm finden Sie unter diesem Link . Das Steuerungsprogramm selbst ist deterministisch und wird mit einem Dummy-Startwert von gebucht 1
. Die Samen, die während der Wertung verwendet werden, sind unterschiedlich. Versuchen Sie also nicht, die Reihenfolge der Züge und die Punktelisten zu analysieren, die sie ausspucken.
Die Hauptklasse ist Tourney
. Wenn Sie dies ausführen, wird ein vollständiges Turnier mit Teilnehmern durchgeführt, die als Argumente angegeben wurden. Es spuckt den Sieger jedes Spiels und eine Bilanz am Ende aus. Ein Beispielturnier mit zwei SwapBots sieht folgendermaßen aus:
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
Wenn Sie jeweils nur ein Spiel testen möchten, können Sie Game
stattdessen die Klasse ausführen . Dies wird ein Spiel mit Spielern in der angegebenen Reihenfolge als Argument ausführen. Standardmäßig wird auch ein Play-by-Play mit dem aktuellen Player und der Pfadlänge gedruckt.
Ebenfalls enthalten sind ein paar Testspieler: SwapBot
, BlockPermuter
, und TwoSwapBot
. Die ersten beiden werden nicht in die Wertungsläufe einbezogen. Sie können sie also während des Tests verwenden und missbrauchen. TwoSwapBot
wird in die Bewertung mit einbezogen, und er ist kein Trottel, also bring dein A-Game mit.
Verschiedenes
Sie können keine Statusinformationen speichern, und jede Runde ist eine separate Ausführung Ihres Programms. Die einzigen Informationen, die Sie in jeder Runde erhalten, sind die Punkte.
Sie können keine externen Ressourcen verwenden. Dies beinhaltet Netzwerkanrufe und Dateizugriff.
Sie können keine Bibliotheksfunktionen verwenden, die zur Lösung / Unterstützung des TSP-Problems oder seiner Varianten entwickelt wurden.
Sie können andere Spieler in keiner Weise manipulieren oder stören.
Sie können das Steuerprogramm oder eingeschlossene Klassen oder Dateien in keiner Weise manipulieren oder stören.
Multithreading ist zulässig.
Eine Einreichung pro Benutzer. Wenn Sie mehr als einen Beitrag einreichen, gebe ich nur den ersten Beitrag ein. Wenn Sie Ihren Beitrag ändern möchten, bearbeiten / löschen Sie das Original.
Das Turnier läuft unter Ubuntu 13.04 auf einem Computer mit einer i7-3770K-CPU und 16 GB RAM. Es wird nicht in einer VM ausgeführt. Alles, was ich als böswillig empfinde, disqualifiziert sofort den aktuellen und jeden zukünftigen Beitrag, den Sie einreichen.
Alle Eingaben müssen über die Kommandozeile mit kostenloser ( wie in Bier ) Software ausgeführt werden können. Wenn ich Probleme beim Kompilieren / Ausführen Ihres Eintrags habe, bitte ich um Hilfe in den Kommentaren. Wenn Sie nicht antworten oder ich es letztendlich nicht zum Laufen bringen kann, wird es disqualifiziert.
Ergebnisse (22 Mai 2014)
Neue Ergebnisse liegen vor! UntangleBot hat die Konkurrenz ziemlich gut geschlagen. TwoSwapBot schaffte sieben Siege und SANNbot erzielte ebenfalls einen Sieg. Hier ist ein Anzeiger und ein Link zur Rohausgabe :
Wins Contestant
22 (2) ./UntangleBot
7 (0) TwoSwapBot
1 (5) SANNbot.R
0 (1) BozoBot
0 (3) Threader
0 (4) DivideAndConquer
Wie steht es nun , UntangleBot hat das Häkchen gewonnen. Lassen Sie sich davon jedoch nicht entmutigen, da ich das Turnier mit mehr Teilnehmern leiten und die akzeptierte Antwort entsprechend ändern werde.