Rechercher le labyrinthe avec l'algorithme python A *

Qu'est-ce que l'algorithme A *?

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')

référence

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

Recommended Posts

Rechercher le labyrinthe avec l'algorithme python A *
Résolvez les problèmes de somme partielle avec une recherche complète en Python
Algorithme A * (édition Python)
Recherche séquentielle avec Python
Dichotomie avec python
Dichotomie avec Python 3
[Python] Récupérez les fichiers dans le dossier avec Python
Trouvez l'itinéraire le plus court avec l'algorithme de Python Dijkstra
Résolvez le problème du sac à dos Python avec l'algorithme glouton
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
Faire un point d'arrêt sur la couche c avec python
Algorithme de recherche utilisant word2vec [python]
Algorithme en Python (dichotomie)
Remplissez l'arrière-plan d'une seule couleur avec OpenCV2 + Python
Recherche de bits complète avec Python
Faites une loterie avec Python
[Python3] Méthode Dikstra avec 14 lignes
Un mémo que j'ai touché au magasin de données avec python
Appelez l'API avec python3.
Les moteurs de recherche fonctionnent avec python
Rechercher des tweets Twitter avec Python
Créer un répertoire avec python
Rationalisez la recherche Web avec Python
Une note sur l'utilisation de l'API Facebook avec le SDK Python
Probablement le moyen le plus simple de créer un pdf avec Python 3
[Python] Essayez d'optimiser les paramètres de systole FX avec un algorithme génétique
Essayez une recherche similaire de recherche d'images à l'aide du SDK Python [Recherche]
Résolvez le livre en spirale (algorithme et structure de données) avec python!
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
Trouver une solution au problème N-Queen avec un algorithme génétique (1)
Algorithme en Python (recherche de priorité de largeur, bfs)
[Python] Qu'est-ce qu'une instruction with?
Ecrire une dichotomie en Python
Résoudre ABC163 A ~ C avec Python
Extraire le fichier xz avec python
Faites fonctionner l'imprimante de reçus avec python
Manuel de graphisme Python avec Matplotlib.
Faisons une interface graphique avec python.
Résoudre ABC166 A ~ D avec Python
Obtenez la météo avec les requêtes Python
Créez un environnement virtuel avec Python!
Ecrire des algorithmes A * (A-star) en Python
Obtenez la météo avec les requêtes Python 2
J'ai fait une loterie avec Python.
Algorithme en Python (recherche de priorité en profondeur, dfs)
Trouvez la distance d'édition (distance de Levenshtein) avec python
Explorez le labyrinthe avec l'apprentissage augmenté
Créer un environnement virtuel avec Python 3
Accédez à l'API Etherpad-lite avec Python
Installer le plug-in Python avec Netbeans 8.0.2
Résoudre ABC168 A ~ C avec Python
[Python] Faire de la fonction une fonction lambda
Créer un système de recommandation avec python