Durchsuche das Labyrinth mit dem Python A * -Algorithmus

Was ist der A * -Algorithmus?

qiita Algorithm.py



import heapq

class CalculationAStarAlgorithm():
    def __init__(self, dungeon, start_charactor, goal_charactor):
        self.dungeon = dungeon
        self.start_charactor_position = self.getCharacotorCoordinates(start_charactor)
        self.goal_charactor_position = self.getCharacotorCoordinates(goal_charactor)

    def getCharacotorCoordinates(self, search_criteria_charactor):
        for index_height, line in enumerate(self.dungeon):
            for index_wedth, charactor in enumerate(line):
                if charactor == search_criteria_charactor:
                    return (index_height, index_wedth)

    def heuristic(self, position):
        return ((position[0] - self.goal_charactor_position[0]) ** 2 + (position[1] - self.goal_charactor_position[1]) ** 2) ** 0.5

    def distance(self, path):
        return len(path)

    def nextCandidatePosition(self, last_passed_position):
        wall = "*"
        vertical_axis, horizontal_axis = last_passed_position
        for next_vertical, next_horizontal in zip((vertical_axis + 1, vertical_axis - 1, vertical_axis, vertical_axis), (horizontal_axis, horizontal_axis, horizontal_axis + 1, horizontal_axis - 1)):
            if self.dungeon[next_vertical][next_horizontal] != wall:
                yield (next_vertical, next_horizontal)

    def aStarAlgorithm(self):
        passed_list = [self.start_charactor_position]
        init_score = self.distance(passed_list) + self.heuristic(self.start_charactor_position)
        checked = {self.start_charactor_position: init_score}
        searching_heap = []
        heapq.heappush(searching_heap, (init_score, passed_list))

        while len(searching_heap) > 0:
            score, passed_list = heapq.heappop(searching_heap)
            last_passed_position = passed_list[-1]
            
            if last_passed_position == self.goal_charactor_position:
                return passed_list
            for position in self.nextCandidatePosition(last_passed_position):
                new_passed_list = passed_list + [position]
                position_score = self.distance(new_passed_list) + self.heuristic(position)
                if position in checked and checked[position] <= position_score:
                    continue
                checked[position] = position_score
                heapq.heappush(searching_heap, (position_score, new_passed_list))
        return []

    def renderPath(self, path):
        structure = [[dungeon_dot for dungeon_dot in element] for element in self.dungeon]
        for dot in path[1:-1]:
            structure[dot[0]][dot[1]] = "$"
        structure[path[0][0]][path[0][1]] = "S"
        structure[path[-1][0]][path[-1][1]] = "G"
        return ["".join(l) for l in structure]

if __name__ == '__main__': 

    dungeon = [
        '**************************',
        '*S* *                    *',
        '* * *  *  *************  *',
        '* *   *    ************  *',
        '*    *                   *',
        '************** ***********',
        '*                        *',
        '** ***********************',
        '*      *              G  *',
        '*  *      *********** *  *',
        '*    *        ******* *  *',
        '*       *                *',
        '**************************',
        ]

    calculation = CalculationAStarAlgorithm(dungeon, "S", "G")
    path = calculation.aStarAlgorithm()

    if len(path) > 0:
        print("\n".join(calculation.renderPath(path)))
    else:
        print('failed')

Referenz

https://qiita.com/masashi127/items/0c794e28f4b295ad82c6

Recommended Posts

Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Lösen Sie Teilsummenprobleme mit der vollständigen Suche in Python
Ein * Algorithmus (Python Edition)
Sequentielle Suche mit Python
Dichotomie mit Python
Dichotomie mit Python 3
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Finden Sie den kürzesten Weg mit dem Python Dijkstra-Algorithmus
Lösen Sie das Python-Rucksackproblem mit dem Greedy-Algorithmus
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus (Python-Code) zu lösen.
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Suchalgorithmus mit word2vec [Python]
Algorithmus in Python (Dichotomie)
Füllen Sie den Hintergrund mit einer einzigen Farbe mit OpenCV2 + Python
Vollbit-Suche mit Python
Machen Sie eine Lotterie mit Python
[Python3] Dikstra-Methode mit 14 Zeilen
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Rufen Sie die API mit python3 auf.
Suchmaschinen arbeiten mit Python
Suche nach Twitter-Tweets mit Python
Erstellen Sie ein Verzeichnis mit Python
Optimieren Sie die Websuche mit Python
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
[Python] Versuchen Sie, die FX-Systolenparameter mit einem genetischen Algorithmus zu optimieren
Probieren Sie die ähnliche Suche von Image Search mit Python SDK [Search] aus.
Löse das Spiralbuch (Algorithmus und Datenstruktur) mit Python!
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (1)
Algorithmus in Python (Breitenprioritätssuche, bfs)
[Python] Was ist eine with-Anweisung?
Schreiben Sie eine Dichotomie in Python
Löse ABC163 A ~ C mit Python
Extrahieren Sie die xz-Datei mit Python
Bedienen Sie den Belegdrucker mit Python
Python-Grafikhandbuch mit Matplotlib.
Lassen Sie uns eine GUI mit Python erstellen.
Löse ABC166 A ~ D mit Python
Holen Sie sich das Wetter mit Python-Anfragen
Erstellen Sie eine virtuelle Umgebung mit Python!
Schreiben Sie A * (A-Stern) -Algorithmen in Python
Holen Sie sich das Wetter mit Python-Anfragen 2
Ich habe mit Python eine Lotterie gemacht.
Algorithmus in Python (Tiefenprioritätssuche, dfs)
Finden Sie die Bearbeitungsentfernung (Levenshtein-Entfernung) mit Python
Entdecken Sie das Labyrinth mit erweitertem Lernen
Erstellen einer virtuellen Umgebung mit Python 3
Klicken Sie mit Python auf die Etherpad-Lite-API
Installieren Sie das Python-Plug-In mit Netbeans 8.0.2
Löse ABC168 A ~ C mit Python
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Erstellen Sie ein Empfehlungssystem mit Python