Ein * Algorithmus (Python Edition)

Hintergrund

Code

# coding: utf-8
import heapq
import itertools


def astar(init_pos, goal):
    #Routenliste zum Speichern der gesuchten Koordinaten
    passed_list = [init_pos]
    #Erste Punktzahl
    init_score = distance(passed_list) + heuristic(init_pos)
    #Speichert die gesuchten Koordinaten und die Punktzahl der Route, die diese Koordinaten erreicht hat
    checked = {init_pos: init_score}
    #Durchsuchen Sie den Heap, um die Routenliste und ihre Punktzahl zu speichern
    searching_heap = []
    #Routenliste im Suchhaufen speichern
    heapq.heappush(searching_heap, (init_score, passed_list))
    #Bis es unmöglich wird zu suchen
    while len(searching_heap) > 0:
        #Die Punktzahl ist die niedrigste unter den bisher gesuchten Routen
        #Holen Sie sich die Punktzahl und Routenliste wann
        score, passed_list = heapq.heappop(searching_heap)
        #Zuletzt gesuchte Koordinaten
        last_passed_pos = passed_list[-1]
        #Gibt den Suchheap zurück, wenn die zuletzt gesuchte Koordinate das Ziel ist
        if last_passed_pos == goal:
            return passed_list
        #Durchsuchen Sie alle Richtungen der zuletzt gesuchten Koordinaten
        for pos in nexts(last_passed_pos):
            #Erstellen Sie eine temporäre Liste, in der die gesuchten Koordinaten zur Routenliste hinzugefügt werden
            new_passed_list = passed_list + [pos]
            #Berechnen Sie die Punktzahl der temporären Liste
            pos_score = distance(new_passed_list) + heuristic(pos)
            #Überprüfen Sie, ob die gesuchten Koordinaten auf einer anderen Route gesucht wurden
            #Wenn bereits gesucht, vergleichen Sie die vorherige Punktzahl mit der aktuellen Punktzahl
            #Wenn die Punktzahl diesmal höher ist, suchen Sie nach Koordinaten in der nächsten Richtung
            if pos in checked and checked[pos] <= pos_score:
                continue
            #Wenn die Punktzahl diesmal kleiner ist, speichern Sie sie in der Checkliste
            #Speichern Sie die Punktzahl und die Routenliste im Suchhaufen
            checked[pos] = pos_score
            heapq.heappush(searching_heap, (pos_score, new_passed_list))

    return []

if __name__ == "__main__":
    dungeon = [
        'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO',
        'OS  O     O     O         O          O',
        'O   O  O  O  O            O    OOOO GO',
        'O      O     O  O   OOOO  O    O  OOOO',
        'OOOOOOOOOOOOOOOOOO  O     O    O     O',
        'O                O  O     O          O',
        'O        OOO     O  O     OOOOOOOOO  O',
        'O  OO    O    OOOO  O     O      OO  O',
        'O   O    O          O     O  O   O   O',
        'O   OOO  O          O        O   O   O',
        'O        O          O        O       O',
        'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO',
        ]

    def find_ch(ch):
        for i, l in enumerate(dungeon):

            for j, c in enumerate(l):

                if c == ch:
                    return (i, j)
    #Start
    init = find_ch("S")
    #Tor
    goal = find_ch("G")

    def nexts(pos):
        '''Generator, der die Koordinaten in alle Richtungen aus den gesuchten Koordinaten berechnet'''
        wall = "O"

        for a, b in itertools.product([' + 1', ' - 1', ''], repeat=2):

            if a or b:

                if dungeon[eval('pos[0]' + a)][eval('pos[1]' + b)] != wall:
                    yield (eval('pos[0]' + a), eval('pos[1]' + b))

    def heuristic(pos):
        '''Ergebnis der kürzesten Entfernung von der gesuchten Koordinate zum Ziel'''
        return ((pos[0] - goal[0]) ** 2 + (pos[1] - goal[1]) ** 2) ** 0.5

    def distance(path):
        '''Punktzahl der Entfernung vom Start zu den gesuchten Koordinaten'''
        return len(path)

    def render_path(path):
        '''Ergebnisausgabe'''
        buf = [[ch for ch in l] for l in dungeon]

        for pos in path[1:-1]:
            buf[pos[0]][pos[1]] = "*"

        buf[path[0][0]][path[0][1]] = "s"
        buf[path[-1][0]][path[-1][1]] = "g"
        return ["".join(l) for l in buf]

    path = astar(init, goal)

    if len(path) > 0:
        print("\n".join(render_path(path)))

    else:
        print('failed')

Referenz

A * (A-Star) -Algorithmus in Python - Pashangos Blog Schreiben Sie dies selbst - A * mit Python - Rashiura

Recommended Posts

Ein * Algorithmus (Python Edition)
Python-Algorithmus
Schreiben Sie A * (A-Stern) -Algorithmen in Python
Implementierung eines einfachen Algorithmus in Python 2
Führen Sie einen einfachen Algorithmus in Python aus
Python-Memorandum (Algorithmus)
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Schreiben Sie eine einfache Giermethode in Python
Führen Sie Python-Code in der A2019 Community Edition aus
[Python] Machen Sie einen Screenshot
Erste Python 3rd Edition
Erstellen Sie ein Python-Modul
Pythons Lambda-Ausdruck ...
Genetischer Algorithmus in Python
Dämonisiere einen Python-Prozess
Algorithmus in Python (Bellman-Ford-Methode, Bellman-Ford)
Python neu lernen (Algorithmus I)
Erstellen Sie eine Python-Umgebung
Python3> rund (a - b, 7)
Algorithmus in Python (Dijkstra)
AtCoder ABC 177 Python (A ~ E)
Machen Sie einen Screenshot in Python
Erstellen Sie ein Wox-Plugin (Python)
Python 2-Serie und 3-Serie (Anaconda Edition)
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
PyTorch C ++ VS Python (Ausgabe 2019)
AtCoder ABC 178 Python (A ~ E)
Ein Weg zum mittleren Python
Ein Kommentar zum Boruta-Algorithmus
Algorithmus in Python (Haupturteil)
[Python] Verwenden Sie eine Zeichenfolgenfolge
CI-Umgebungskonstruktion ~ Python Edition ~
AtCoder ABC 176 Python (A ~ E)
Python-Installation (Mac Edition) (alt)
Suchalgorithmus mit word2vec [Python]
Reproduzieren Sie die euklidische Methode der gegenseitigen Teilung in Python
Algorithmus in Python (Dichotomie)
Memorandum über Korrelation [Python]
Erstellen Sie ein Lesezeichen in Python
Erstellen einer virtuellen Python-Umgebung
Erstellen Sie ein Python-Numpy-Array
Machen Sie eine Lotterie mit Python
[Python3] Dikstra-Methode mit 14 Zeilen
Ich habe einen Python-Text gemacht
Ein Memorandum über den Python-Mock
Implementieren Sie den Dijkstra-Algorithmus in Python
AtCoder ABC 182 Python (A ~ D)
Erstellen Sie die Python-Umgebung offline
Zeichne ein Herz in Python
Erstellen Sie ein Verzeichnis mit Python
Erstellen einer virtuellen Python-Umgebung
Ein Hinweis zu [Python] __debug__
[Python] Versuchen Sie, die FX-Systolenparameter mit einem genetischen Algorithmus zu optimieren
Erfassung von Board-Informationen Python 3 Edition (Ein Rang-Up-Set)
So einfach wie möglich eine GUI mit Python erstellen [tkinter edition]
Erstellen einer Python-Umgebung auf einem Mac