Trouvez l'itinéraire le plus court avec l'algorithme de Python Dijkstra

Problème d'itinéraire le plus court [méthode Dixtra](https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%82%AF%E3%82%B9%E3%83% 88% E3% 83% A9% E6% B3% 95).

(À propos de la méthode Dyxtra de Wikipedia)
Méthode Dyxtra (méthode Dyxtra, anglais: Dijkstra's) est en théorie des graphes
Il s'agit d'un algorithme basé sur la recherche de la meilleure priorité pour résoudre le problème du chemin le plus court au point de départ unique lorsque les pondérations latérales ne sont pas négatives.
Bellman si les poids latéraux contiennent des nombres négatifs-La méthode Ford, etc. peut être utilisée. Lorsque tous les poids latéraux ont le même nombre non négatif
La recherche de priorité de largeur est rapide et l'itinéraire le plus court peut être calculé en temps linéaire.
De plus, si le poids latéral est un entier positif dans un graphe non orienté, cela dépend de l'algorithme de Thorup.
Il est possible de calculer en temps linéaire, mais ce n'est pas très pratique.

La méthode Dyxtra recherche chaque nœud par ordre croissant de distance à partir du "Node 1" et recherche la distance la plus courte d'un nœud spécifique. En termes de réduction sensuelle des candidats, la méthode de limitation de branche utilisée dans Résoudre le problème du sac à dos Python avec la méthode de branche et de liaison J'avais un sentiment similaire.

Nous vous serions reconnaissants si vous pouviez nous faire savoir s'il y a des lacunes ou des suggestions d'amélioration concernant le code.

problème

Il existe les itinéraires suivants. Il y a 5 nœuds de 1 à 5, et le nombre sur l'itinéraire est le temps requis. Trouvez l'itinéraire le plus court entre «Node 1» et «Node 5».

dikstra.png

répondre

import math

route_list = [[0, 50, 80, 0, 0], [0, 0, 20, 15, 0 ], [0, 0, 0, 10, 15], [0, 0, 0, 0, 30], [0, 0, 0, 0, 0]] #Liste des distances entre les nœuds initiaux

node_num = len(route_list) #Nombre de nœuds

unsearched_nodes = list(range(node_num)) #Nœud non recherché
distance = [math.inf] * node_num #Liste des distances par nœud
previous_nodes = [-1] * node_num #Liste des nœuds qui atteignent le nœud précédent par la route la plus courte
distance[0] = 0 #La distance initiale des nœuds est de 0

# @Ajout de la fonction du commentaire de GDaigo 2017/03/18
def get_target_min_index(min_index, distance, unsearched_nodes):
    start = 0
    while True:
        index = distance.index(min_index, start)
        found = index in unsearched_nodes
        if found:
            return index
        else:
            start = index + 1

while(len(unsearched_nodes) != 0): #Répétez jusqu'à ce qu'il n'y ait plus de nœuds non recherchés
    #Tout d'abord, sélectionnez le nœud non recherché avec la plus petite distance.
    posible_min_distance = math.inf #Distance temporaire pour trouver la plus petite distance. La valeur initiale est définie sur inf.
    for node_index in unsearched_nodes: #Boucle de nœuds inexplorés
        if posible_min_distance > distance[node_index]: 
            posible_min_distance = distance[node_index] #Mettre à jour si une valeur plus petite est trouvée
    target_min_index = get_target_min_index(posible_min_distance, distance, unsearched_nodes) #Obtenez le numéro d'index le plus bas parmi les nœuds non recherchés
    unsearched_nodes.remove(target_min_index) #Supprimé de la liste non recherchée car il sera recherché ici

    target_edge = route_list[target_min_index] #Liste des arêtes s'étendant à partir du nœud cible
    for index, route_dis in enumerate(target_edge):
        if route_dis != 0:
            if distance[index] > (distance[ target_min_index] + route_dis):
                distance[index] = distance[ target_min_index] + route_dis #Mettre à jour la distance si elle est inférieure à la distance précédemment définie
                previous_nodes[index] =  target_min_index #Également mis à jour la liste des nœuds arrivés immédiatement avant

#Voir les résultats ci-dessous

print("-----Route-----")
previous_node = node_num - 1
while previous_node != -1:
    if previous_node !=0:
        print(str(previous_node + 1) + " <- ", end='')
    else:
        print(str(previous_node + 1))
    previous_node = previous_nodes[previous_node]

print("-----distance-----")
print(distance[node_num - 1])

résultat

-----Route-----
5 <- 3 <- 2 <- 1
-----distance-----
85

Recommended Posts

Trouvez l'itinéraire le plus court avec l'algorithme de Python Dijkstra
[Introduction à l'algorithme] Trouvez l'itinéraire le plus court [Python3]
[Python3] Méthode Dikstra avec 14 lignes
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Trouvez la distance d'édition (distance de Levenshtein) avec python
Implémentation de la méthode Dyxtra par python
Rechercher le labyrinthe avec l'algorithme python A *
Essayez de résoudre l'itinéraire le plus court avec les données sociales Python + NetworkX +
Trouvez le maximum de Python
Trouvez la valeur de l'humeur avec python (Rike Koi)
Résoudre avec Python [100 questions passées que les débutants et les intermédiaires devraient résoudre] (056 --059 Problème de l'itinéraire le plus court: méthode Dyxtra)
Algorithme en Python (Dijkstra)
Résolvez le problème du sac à dos Python avec l'algorithme glouton
Trouver des erreurs en Python
Implémenter l'algorithme de Dijkstra en python
Appelez l'API avec python3.
Trouvez la valeur maximale python (amélioré)
Résolvez le livre en spirale (algorithme et structure de données) avec python!
[Python] Récupère le répertoire d'exécution du script avec un chemin absolu
Extraire le fichier xz avec python
[Python] Trouvez la deuxième plus petite valeur.
Obtenez le chemin du bureau en Python
Obtenez la météo avec les requêtes Python
Obtenez la météo avec les requêtes Python 2
Obtenez le chemin du script en Python
OSMnx pour la première fois ~ Avec la recherche d'itinéraire la plus courte ~
Installer le plug-in Python avec Netbeans 8.0.2
J'ai aimé le tweet avec python. ..
Obtenez le chemin du bureau en Python
Maîtriser le type avec Python [compatible Python 3.9]
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
[ffmpeg] Si vous ffmpeg en utilisant le sous-processus Python, le système ne peut pas trouver le chemin spécifié.
Rendre la console Python couverte d'UNKO
Trouvons la valeur maximale python (correction ver)
[Python] Définissez la plage du graphique avec matplotlib
Mettre en œuvre la recherche de chemin le plus court pour le labyrinthe
Derrière le flyer: utiliser Docker avec Python
Livre Ali en python: méthode Dyxtra Sec.2-5
Passez le chemin du module python importé
Essayez l'algorithme Variational-Quantum-Eigensolver (VQE) avec Blueqat
Vérifier l'existence du fichier avec python
Trouvez la valeur SHA256 avec R (avec bonus)
[Python] Récupère le nom de la variable avec str
[Python] Arrondissez avec juste l'opérateur
Afficher Python 3 dans le navigateur avec MAMP
Algorithme Python
Lisons le fichier RINEX avec Python ①
Travailler avec OpenStack à l'aide du SDK Python
Télécharger des fichiers sur le Web avec Python
Vérifiez le chemin du module importé Python
Retrouvez les termes généraux de la séquence de Tribonacci en algèbre linéaire et Python