[Einführung in den Algorithmus] Finden Sie den kürzesten Weg [Python3]

Thema

Suchen Sie auf einer Karte, die Geländekosten als Information enthält, eine Route, die den Startpunkt und den Zielpunkt zu den niedrigsten Kosten verbindet. (In SRPG-Spielen werden beispielsweise Geländekosten berücksichtigt, wenn Sie in Flachland, Häuser, Wälder und Berge ziehen.)

Algorithmus

  1. Bereiten Sie ein Array vor, das den Koordinaten und Geländekosten entspricht (cost_map)
  2. Ermitteln Sie die Kosten für den Wechsel vom Zielpunkt zu jedem Punkt und erstellen Sie ein Array (rout_cost).
  3. Folgen Sie basierend auf den Bewegungskosten (rout_cost) jedes Punkts dem Punkt mit den niedrigsten Kosten vom Startpunkt aus

Hinweis) Ergänzung (Technik, die beim Schreiben eines Programms verwendet wird) Verwenden Sie eine rekursive Funktion.

Trainieren

  1. Betrachten Sie beispielsweise die kürzeste Route vom Start (x3, y0) bis zum Ziel (x1, y6) auf einer Karte mit den folgenden Geländekosten.
y0 y1 y2 y3 y4 y5 y6
x0 4 3 1 1 1 2 3
x1 3 2 1 2 1 1 1
x2 2 1 3 3 2 3 2
x3 2 3 5 3 2 4 3

Bereiten Sie ein Array cost_map mit Geländekosten als Element und ein Array rout_cost mit einem unendlichen Wert als Element vor.

alg_01.py


s = [3,0]; g = [1,6]  ## start and goal position
cost_map = [[4,3,1,1,1,2,3],\
            [3,2,1,2,1,1,1],\
            [2,1,3,3,2,3,2],\
            [2,3,5,3,2,4,3]]
m = len(cost_map)
n = len(cost_map[0])
rout_cost = [[float("inf") for j in range(n)] for i in range(m)]
  1. Berechnen Sie die Bewegungskosten für jeden Punkt ab dem Zielpunkt und aktualisieren Sie die oben vorbereiteten rout_cost basierend auf dem Berechnungsergebnis.

alg_02.py


def calc_rout_cost(x,y,cost_tmp):
    cost_tmp += cost_map[x][y]
    if cost_tmp < rout_cost[x][y]:
        rout_cost[x][y] = cost_tmp
        if y < n-1:
            calc_rout_cost(x,y+1,cost_tmp)
        if y > 0:
            calc_rout_cost(x,y-1,cost_tmp)
        if x < m-1:
            calc_rout_cost(x+1,y,cost_tmp)
        if x > 0:
            calc_rout_cost(x-1,y,cost_tmp)
calc_rout_cost(g[0],g[1],-cost_map[g[0]][g[1]])

Die abgeschlossenen rout_cost lauten wie folgt. Beachten Sie, dass der Zielpunkt (x6, y1) Null ist.

x0 x1 x2 x3 x4 x5 x6
y0 12 8 5 4 3 3 3
y1 10 7 5 4 2 1 0
y2 10 8 8 7 4 4 2
y3 12 11 13 9 6 8 5
  1. Finden Sie schließlich den kürzesten Weg vom Start bis zum Ziel.

alg_03.py


def search_rout(x,y):
    tmp = rout_cost[x][y]
    tmp_x, tmp_y = x, y
    if x > 0 and rout_cost[x-1][y] < tmp :
        tmp_x, tmp_y = x-1, y
        tmp = rout_cost[tmp_x][tmp_y]
    if x < m-1 and rout_cost[x+1][y] < tmp :
        tmp_x, tmp_y = x+1, y
        tmp = rout_cost[tmp_x][tmp_y]
    if y > 0 and rout_cost[x][y-1] < tmp :
        tmp_x, tmp_y = x, y-1
        tmp = rout_cost[tmp_x][tmp_y]
    if y < n-1 and rout_cost[x][y+1] < tmp :
        tmp_x, tmp_y = x, y+1
        tmp = rout_cost[tmp_x][tmp_y]
    if rout_cost[x][y] == 0: return;
    rout_list.append([tmp_x,tmp_y])
    search_rout(tmp_x,tmp_y)

rout_list = []
rout_list.append(s)
search_rout(s[0],s[1])

Der kürzeste Weg ist

result.py


print(rout_list)
## [[3, 0], [2, 0], [2, 1], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6]]

Wird sein.

Verweise

Masakazu Yanai "Code Puzzle für Programmierer" Technical Review (2014) Eine ausführliche Erklärung finden Sie in der Literatur. Es ist in Javascript geschrieben.

Recommended Posts

[Einführung in den Algorithmus] Finden Sie den kürzesten Weg [Python3]
Finden Sie den kürzesten Weg mit dem Python Dijkstra-Algorithmus
Versuchen Sie, den kürzesten Weg mit Python + NetworkX + Social Data zu lösen
Was ist ein Algorithmus? Einführung in den Suchalgorithmus] ~ Python ~
Finden Sie das maximale Python
Einführung in Python Bereiten wir die Entwicklungsumgebung vor
Einführung in die Python-Sprache
Einführung in OpenCV (Python) - (2)
[Einführung in Python3 Tag 20] Kapitel 9 Enträtseln des Webs (9.1-9.4)
[Algorithmus x Python] Verwendung der Liste
Einführung in Python mit Atom (unterwegs)
[Einführung in Python] Wie iteriere ich mit der Bereichsfunktion?
[Einführung in die Udemy Python3 + -Anwendung] 27. Verwendung des Wörterbuchs
[Einführung in die Udemy Python3 + -Anwendung] 30. Verwendung des Sets
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib
Einführung in den Wörterbuch-Suchalgorithmus
Einführung in Python Django (2) Win
Finde Fehler in Python
Einführung in die serielle Kommunikation [Python]
[Einführung in Python] <Liste> [Bearbeiten: 22.02.2020]
Einführung in Python (Python-Version APG4b)
Eine Einführung in die Python-Programmierung
Einführung in Python For, While
Finden Sie den Maximalwert Python (verbessert)
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Schreiben Sie ein Python-Programm, um die Bearbeitungsentfernung [Python] [Levenshtein-Entfernung] zu ermitteln.
Einführung in Python Scikit-Learn, Matplotlib, Single-Layer-Algorithmus (~ in Richtung B3 ~ Teil3)
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
[Einführung in die Udemy Python3 + -Anwendung] 58. Lambda
[Einführung in die Udemy Python3 + -Anwendung] 31. Kommentar
Überlassen Sie die mühsame Verarbeitung Python
[Python] Finden Sie den zweitkleinsten Wert.
Einführung in die Python Numerical Calculation Library NumPy
Trainieren! !! Einführung in Python Type (Type Hints)
[Einführung in Python3 Tag 1] Programmierung und Python
[Einführung in Python] <numpy ndarray> [edit: 2020/02/22]
Einführung in Python Hands On Teil 1
Holen Sie sich den Desktop-Pfad in Python
[Einführung in Python] So analysieren Sie JSON
[Einführung in die Udemy Python3 + -Anwendung] 56. Abschluss
Holen Sie sich den Skriptpfad in Python
[Einführung in Python3 Tag 14] Kapitel 7 Zeichenfolgen (7.1.1.1 bis 7.1.1.4)
So erhalten Sie die Python-Version
Einführung in Protobuf-c (C-Sprache ⇔ Python)
[Einführung in die Udemy Python3 + -Anwendung] 59. Generator
[Einführung in Python3 Tag 15] Kapitel 7 Zeichenfolgen (7.1.2-7.1.2.2)
Redis ist nicht nur die kürzeste Einführung (4), Redis
Holen Sie sich den Desktop-Pfad in Python
[Einführung in Python] Verwenden wir Pandas
Probieren Sie Cython in kürzester Zeit aus
[Einführung in die Udemy Python3 + -Anwendung] Zusammenfassung
Einführung in die Bildanalyse opencv python
[Einführung in Python] Verwenden wir Pandas
Erste Schritte mit Python für Nicht-Ingenieure
Python-Anfänger versuchten es herauszufinden
Einführung in Python Django (2) Mac Edition
[AWS SAM] Einführung in die Python-Version
[Einführung in Python3 Tag 21] Kapitel 10 System (10.1 bis 10.5)
[Python] Ändere das Alphabet in eine Zahl