[Introduction à l'algorithme] Trouvez l'itinéraire le plus court [Python3]

thème

Trouvez un itinéraire qui relie le point de départ et le point de but au coût le plus bas sur une carte qui a le coût du terrain comme information. (Par exemple, dans les jeux SRPG, les coûts du terrain sont pris en compte lors du déplacement vers les plaines, les maisons, les forêts et les montagnes.)

algorithme

  1. Préparez un tableau correspondant aux coordonnées et au coût du terrain (cost_map)
  2. Trouvez le coût du déplacement du point de but vers chaque point et créez un tableau (rout_cost)
  3. En fonction du coût de déplacement (rout_cost) de chaque point, suivez le point avec le coût le plus bas à partir du point de départ

Note) Supplément (Technique utilisée lors de l'écriture d'un programme) Utilisez une fonction récursive.

Entraine toi

  1. Par exemple, considérez l'itinéraire le plus court entre le début (x3, y0) et l'objectif (x1, y6) sur une carte avec le coût de terrain suivant.
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

Préparez un tableau cost_map qui a le coût du terrain comme élément et un tableau rout_cost qui a une valeur infinie comme élément.

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. Calculez le coût du mouvement vers chaque point à partir du point de but, et mettez à jour le coût_outu préparé ci-dessus en fonction du résultat du calcul.

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

Le rout_cost terminé est le suivant. Notez que le point de but (x6, y1) sera zéro.

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. Enfin, trouvez le chemin le plus court du départ au but.

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

Le trajet le plus court est

result.py


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

Sera.

Les références

Revue technique de Masakazu Yanai "Code Puzzle for Programmers" (2014) Veuillez vous référer à la documentation pour une explication détaillée. Il est écrit en Javascript.

Recommended Posts

[Introduction à l'algorithme] Trouvez l'itinéraire le plus court [Python3]
Trouvez l'itinéraire le plus court avec l'algorithme de Python Dijkstra
Essayez de résoudre l'itinéraire le plus court avec les données sociales Python + NetworkX +
Qu'est-ce qu'un algorithme? Introduction à l'algorithme de recherche] ~ Python ~
Trouvez le maximum de Python
Introduction à Python Préparons l'environnement de développement
Introduction au langage Python
Introduction à OpenCV (python) - (2)
[Introduction à Python3 Jour 20] Chapitre 9 Démêler le Web (9.1-9.4)
[Algorithm x Python] Comment utiliser la liste
Introduction à Python avec Atom (en route)
[Introduction à Python] Comment itérer avec la fonction range?
[Introduction à Udemy Python3 + Application] 27. Comment utiliser le dictionnaire
[Introduction à Udemy Python3 + Application] 30. Comment utiliser l'ensemble
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib
Introduction à l'algorithme de recherche de dictionnaire
Introduction à Python Django (2) Win
Trouver des erreurs en Python
Introduction à la communication série [Python]
[Introduction à Python] <liste> [modifier le 22/02/2020]
Introduction à Python (version Python APG4b)
Une introduction à la programmation Python
Introduction à Python pour, pendant
Trouvez la valeur maximale python (amélioré)
J'ai essayé de trouver l'entropie de l'image avec python
Ecrire un programme python pour trouver la distance d'édition [python] [distance Levenshtein]
Introduction à Python scikit-learn, matplotlib, algorithme monocouche (~ vers B3 ~ part3)
[Introduction à Python] Comment obtenir des données avec la fonction listdir
[Présentation de l'application Udemy Python3 +] 58. Lambda
[Présentation de l'application Udemy Python3 +] 31. Commentaire
Laissez le traitement gênant à Python
[Python] Trouvez la deuxième plus petite valeur.
Introduction à la bibliothèque de calcul numérique Python NumPy
Entraine toi! !! Introduction au type Python (conseils de type)
[Introduction à Python3 Jour 1] Programmation et Python
[Introduction à Python] <numpy ndarray> [modifier le 22/02/2020]
Introduction à Python Hands On Partie 1
Obtenez le chemin du bureau en Python
[Introduction à Python] Comment analyser JSON
[Présentation de l'application Udemy Python3 +] 56. Clôture
Obtenez le chemin du script en Python
[Introduction à Python3 Jour 14] Chapitre 7 Chaînes de caractères (7.1.1.1 à 7.1.1.4)
Comment obtenir la version Python
Introduction à Protobuf-c (langage C ⇔ Python)
[Présentation de l'application Udemy Python3 +] 59. Générateur
[Introduction à Python3 Jour 15] Chapitre 7 Chaînes de caractères (7.1.2-7.1.2.2)
Redis n'est pas seulement la plus courte introduction (4), Redis
Obtenez le chemin du bureau en Python
[Introduction à Python] Utilisons les pandas
Essayez Cython dans les plus brefs délais
[Introduction à l'application Udemy Python3 +] Résumé
Introduction à l'analyse d'image opencv python
[Introduction à Python] Utilisons les pandas
Premiers pas avec Python pour les non-ingénieurs
les débutants en python ont essayé de le découvrir
Introduction à Python Django (2) Édition Mac
[AWS SAM] Présentation de la version Python
[Introduction à Python3 Day 21] Chapitre 10 Système (10.1 à 10.5)
[Python] Changer l'alphabet en nombre