Algorithme A * (édition Python)

Contexte

code

# coding: utf-8
import heapq
import itertools


def astar(init_pos, goal):
    #Liste des itinéraires pour stocker les coordonnées recherchées
    passed_list = [init_pos]
    #Score initial
    init_score = distance(passed_list) + heuristic(init_pos)
    #Stocke les coordonnées recherchées et le score de l'itinéraire ayant atteint ces coordonnées
    checked = {init_pos: init_score}
    #Rechercher dans le tas pour stocker la liste des itinéraires et son score
    searching_heap = []
    #Stocker la liste des itinéraires dans le tas de recherche
    heapq.heappush(searching_heap, (init_score, passed_list))
    #Jusqu'à ce qu'il devienne impossible de chercher
    while len(searching_heap) > 0:
        #Le score est le plus bas parmi les itinéraires recherchés jusqu'à présent
        #Obtenez le score et la liste des itinéraires lorsque
        score, passed_list = heapq.heappop(searching_heap)
        #Dernières coordonnées recherchées
        last_passed_pos = passed_list[-1]
        #Renvoie le tas de recherche si la dernière coordonnée recherchée est la destination
        if last_passed_pos == goal:
            return passed_list
        #Rechercher toutes les directions des dernières coordonnées recherchées
        for pos in nexts(last_passed_pos):
            #Créer une liste temporaire avec les coordonnées recherchées ajoutées à la liste des itinéraires
            new_passed_list = passed_list + [pos]
            #Calculez le score de la liste temporaire
            pos_score = distance(new_passed_list) + heuristic(pos)
            #Vérifiez si les coordonnées recherchées ont été recherchées par un autre itinéraire
            #Si déjà recherché, comparez le score précédent avec le score actuel
            #Si le score cette fois est plus élevé, allez chercher les coordonnées dans la direction suivante
            if pos in checked and checked[pos] <= pos_score:
                continue
            #Si le score cette fois est plus petit, enregistrez-le dans la liste cochée
            #Stocker le score et la liste des itinéraires dans le tas de recherche
            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)
    #début
    init = find_ch("S")
    #objectif
    goal = find_ch("G")

    def nexts(pos):
        '''Générateur qui calcule les coordonnées dans toutes les directions à partir des coordonnées recherchées'''
        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):
        '''Score de la distance la plus courte entre la coordonnée recherchée et l'objectif'''
        return ((pos[0] - goal[0]) ** 2 + (pos[1] - goal[1]) ** 2) ** 0.5

    def distance(path):
        '''Score de la distance entre le début et les coordonnées recherchées'''
        return len(path)

    def render_path(path):
        '''Sortie de résultat'''
        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')

référence

Algorithme A * (A-Star) en Python - Blog de Pashango Écrivez ceci pour vous-même --A * avec python --Rashiura

Recommended Posts

Algorithme A * (édition Python)
Algorithme Python
Ecrire des algorithmes A * (A-star) en Python
Implémentation d'un algorithme simple en Python 2
Exécutez un algorithme simple en Python
Mémorandum Python (algorithme)
Rechercher le labyrinthe avec l'algorithme python A *
Ecrire une méthode de cupidité simple en Python
Exécutez le code Python sur A2019 Community Edition
[Python] Prenez une capture d'écran
Première 3e édition de Python
Créer un module Python
expression lambda de python ...
Algorithme génétique en python
Démoniser un processus Python
Algorithme en Python (méthode Bellman-Ford, Bellman-Ford)
Réapprendre Python (algorithme I)
Créer un environnement Python
Python3> rond (a --b, 7)
Algorithme en Python (Dijkstra)
AtCoder ABC 177 Python (A ~ E)
Prendre une capture d'écran en Python
Créer un plugin Wox (Python)
Série Python 2 et série 3 (édition Anaconda)
Créer une fonction en Python
Créer un dictionnaire en Python
PyTorch C ++ VS Python (édition 2019)
AtCoder ABC 178 Python (A ~ E)
Une route vers Python intermédiaire
Un commentaire sur l'algorithme de Boruta
Algorithme en Python (jugement premier)
[Python] Utiliser une séquence de chaînes
Construction de l'environnement CI ~ Édition Python ~
AtCoder ABC 176 Python (A ~ E)
Installation de Python (édition Mac) (ancienne)
Algorithme de recherche utilisant word2vec [python]
Reproduire la méthode de division mutuelle euclidienne en Python
Algorithme en Python (dichotomie)
La liste Python n'est pas une liste
Mémorandum sur la corrélation [Python]
Créer un bookmarklet en Python
Construire un environnement virtuel Python
Créer un tableau numpy python
Faites une loterie avec Python
[Python3] Méthode Dikstra avec 14 lignes
J'ai fait un texte Python
Un mémorandum sur le simulacre de Python
Implémenter l'algorithme de Dijkstra en python
AtCoder ABC 182 Python (A ~ D)
Créer un environnement Python hors ligne
Dessinez un cœur en Python
Créer un répertoire avec python
Construire un environnement virtuel Python
Une note sur [python] __debug__
[Python] Essayez d'optimiser les paramètres de systole FX avec un algorithme génétique
Acquisition d'informations sur la carte Édition Python 3 (Un ensemble de niveau de rang supérieur)
Créer une interface graphique aussi facilement que possible avec python [édition tkinter]
Construire un environnement Python sur Mac