[PYTHON] Ich habe Paizas Kampagnenproblem ausprobiert. (Rundschreiben Verkäufer Problem)

Es scheint, dass Sie Fleisch oder Amazon Geschenkgutschein per Lotterie bekommen können, also habe ich es dieses Mal mit Python3 versucht. https://paiza.jp/poh/phantom_thief

Problemzusammenfassung

N Schatz x,Die y-Koordinate ist angegeben.
Bewegen Sie sich in einer geraden Linie zwischen den einzelnen Koordinaten.
0,Starten Sie von Position 0.
Geben Sie die Route aus, um jeden Schatz mit der kürzest möglichen Route zu erhalten.
Es muss nicht die kürzeste Entfernung sein.

Wert eingegeben werden
N (N ist die Gesamtzahl der Schätze)
x_1 y_1 (x_1 ist die x-Koordinate des Ortes des ersten Schatzes, y_1 ist die y-Koordinate des Ortes des ersten Schatzes)
x_1 y_1 (x_2 ist die x-Koordinate des Ortes des zweiten Schatzes, y_2 ist die y-Koordinate des Ortes des zweiten Schatzes)
・ ・ ・
x_N y_N (x_N ist die x-Koordinate des N-ten Schatzortes y_N ist die y-Koordinate des N-ten Schatzortes)

・ Alle Werte sind Ganzzahlen
・ 1 ≤ N ≤ 100
・ 1 ≤ x_i, y_i ≦ 1000000 (1 ≦ i ≦ N) 

Erwartete Ausgabe
Bitte geben Sie die Route aus, auf der Sie alle Schätze erhalten können.
Beginnen Sie am Ende eine neue Zeile und fügen Sie keine zusätzlichen Zeichen oder Leerzeilen hinzu.

Beispiel
Eingabebeispiel 1
3
90 100
40 15
30 30

Ausgabebeispiel 1
90 100
40 15
30 30

Eingabebeispiel 2
5
1 1
40 120
199 256
10 30
50 5

Ausgabebeispiel 2
1 1
40 120
199 256
10 30
50 5

Der Code, den ich geschrieben habe.

import math

def cal_distance(current_point, point):
    """Finden Sie den Abstand zwischen zwei Punkten"""
    x1 = current_point[0]
    y1 = current_point[1]
    x2 = point[0]
    y2 = point[1]
    distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
    return distance

def make_distance_list(current_point, position_list):
    """Erstellen Sie eine Liste mit Abständen zwischen zwei Punkten"""
    distance_list = [(i, cal_distance(current_point, x)) for (i, x) in enumerate(position_list)]
    return distance_list

#Eingabewert abrufen
list_len = int(input())
position_list = []
for i in range(list_len):
    position_list.append(list(map(int,input().split())))

#Gehen Sie näher an die aktuelle Position
current_point = [0, 0]
while len(position_list) > 0:
    distance_list = make_distance_list(current_point, position_list)
    sorted_distance_list = [x[0] for x in sorted(distance_list, key=lambda d: d[1])]
    print('{0} {1}'.format(position_list[sorted_distance_list[0]][0],
                             position_list[sorted_distance_list[0]][1]))
    current_point = position_list.pop(sorted_distance_list[0])

Ausführungsergebnis (Es ist etwas schwierig, die Grenze zwischen Eingabe und Ausgabe zu verstehen)

$ python PaizaRouteSearch.py
5
1 2
4 2
10 40
3 2
1 1
1 1
1 2
3 2
4 2
10 40

Ich schrieb es mit einer einfachen Idee, dass ich dem Schatz, der mir am nächsten ist, von meiner aktuellen Position aus folgen sollte. Nach dem, was ich gehört habe, ist der kürzeste Weg die Lösung mit einem Algorithmus namens "Circular Salesman Problem".

Ich würde es gerne untersuchen und überprüfen, wenn ich Zeit habe.

Nachtrag: In Paizas Blog gab es einen Artikel, in dem das Problem erklärt wurde. [http://paiza.hatenablog.com/entry/2017/09/26/ [Erklärung des Problems] Wie man das Rätsel des Phantomdiebs 813 löst und den Schatz erhält](http://paiza.hatenablog.com/entry/ 2017/09/26 /% E3% 80% 90% E5% 95% 8F% E9% A1% 8C% E8% A7% A3% E8% AA% AC% E3% 80% 91% E6% 80% AA% E7 % 9B% 97913% E3% 81% 8B% E3% 82% 89% E3% 81% AE% E8% AC% 8E% E3% 82% 92% E8% A7% A3% E3% 81% 84% E3% 81 % A6% E3% 80% 81% E3% 81% 8A% E5% AE% 9D% E3% 82% B2% E3% 83% 83% E3% 83% 88)

Es scheint, dass meine Lösung eine gierige Methode ist, und ich habe dieselbe Lösung in Paizas Blog vorgestellt. Zusätzlich "Brennmethode", "Strahlensuche", "2-opt", "genetischer Algorithmus", Es scheint, dass es verschiedene Dinge gibt, wie "Christofeeds Algorithmus", "Gesamtflächenbaum", "Sukkulentenpilz-Algorithmus". Bei Wikipedia lautet die Formel ... Ich habe Kopfschmerzen, weil ich seit meiner Studienzeit keine Mathematik mehr habe.

Über Geschenke Es scheint, dass der Versand an die Gewinner bereits begonnen hat, und ich habe mich nicht kontaktiert, so dass ich es anscheinend verpasst habe. Es tut uns leid.

Das Folgende war übrigens falsch. Es scheint ein Problem zu geben und es gibt verschiedene Algorithmen, um es zu lösen.

Nach der Geschichte, die ich gehört habe, scheint der kürzeste Weg darin zu bestehen, mit einem Algorithmus namens "Circular Salesman Problem" zu lösen.

Nachtrag 2: Über Geschenke Etwa anderthalb Monate später, als ich es vergaß, erhielt ich einen Amazon-Geschenkgutschein (im Wert von 1000 Yen)! Ich bin froh, dass ich es nicht erwartet habe! Es scheint unerwartet ein Hit zu sein, also würde ich gerne das nächste Mal wieder teilnehmen!

Recommended Posts

Ich habe Paizas Kampagnenproblem ausprobiert. (Rundschreiben Verkäufer Problem)
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Über das Problem der reisenden Verkäufer
Brennmethode und Problem mit reisenden Verkäufern
Über das bestellte Patrouillenverkäuferproblem
Ich habe versucht, "einen genetischen Algorithmus (GA) in Python zu implementieren, um das Problem des Handlungsreisenden (TSP) zu lösen".
Lösen Sie das Problem des Handlungsreisenden mit OR-Tools
Ich habe versucht zu kratzen
Ich habe PyQ ausprobiert
Ich habe AutoKeras ausprobiert
Ich habe es mit Papiermühle versucht
Ich habe versucht, Django-Slack
Ich habe es mit Django versucht
Ich habe es mit Spleeter versucht
Ich habe es mit cgo versucht
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, Pymc auszuführen
Ich habe ARP-Spoofing ausprobiert
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe Python> autopep8 ausprobiert
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe PyCaret2.0 (pycaret-nightly) ausprobiert.
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, tief zu lernen
Ich habe AWS CDK ausprobiert!
Ich habe versucht, Ipython zu verwenden
Ich habe versucht zu debuggen.
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe Kivys Kartenansicht ausprobiert
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, EfficientDet zu verschieben
Ich habe versucht, Shell zu programmieren
Ich habe versucht, doctest zu verwenden
Ich habe Python> Decorator ausprobiert
Ich habe versucht, TensorFlow auszuführen
Ich habe Auto Gluon ausprobiert
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe AWS Iot ausprobiert
Ich habe die Bayes'sche Optimierung ausprobiert!
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht, das Lachproblem mit Keras zu erkennen.