Livre Ali en python: méthode Dyxtra Sec.2-5

La méthode Dyxtra est une solution au problème de trouver la distance minimale entre deux points sur un graphe non orienté pondéré donné, et est correcte sauf s'il y a un bord pondéré négatif.

J'avais peur en lisant l'explication, mais après avoir pensé à une autre implémentation qui crée un graphique comme indiqué ci-dessous, j'en suis tombée amoureuse.

Pour l'implémentation, la méthode suivante a été ajoutée à la classe de graphes pondérés. En tant qu'opération

  1. Supprimez l'arête de from_node à to_node
  2. Si from_node flotte à 1, supprimez from_node du graphique

    def remove_wo_weight(self, from_node, to_node):

        if from_node in self:
            count = 0
            for [node, weight] in self[from_node]:
                if node == to_node:
                    self[from_node].pop(count)
                count += 1

            if self[from_node] == []:

                self.pop(from_node)

Le code de la méthode Dyxtra est ci-dessous.


import mygraph

print("number of nodes")
N = int(input())

print("input graph")
graph = mygraph.WeightedGraph()

while 1:

    inputline = input()

    if inputline == "":
        break

    inputline = list(map(int, inputline.split()))

    graph.join(inputline[0], inputline[1], inputline[2])

graph = graph.undirected()


for node in graph:
    if not isinstance(graph[node][0], list):
        graph[node] = [graph[node]]

print("Start?")
startpos = int(input())
print("Goal?")
goalpos = int(input())


dp = N * [float("INF")]

minlength_graph = mygraph.WeightedGraph()

minlength_graph.join(startpos, startpos, 0)


while 1:

    shortest_comb = [0, 0, float("INF")]

    for min_node in minlength_graph:

        for [to_node, to_weight] in graph[min_node]:

            if shortest_comb[2] > minlength_graph.weight(startpos, min_node) + to_weight:

                shortest_comb = [min_node, to_node, minlength_graph.weight(
                    startpos, min_node) + to_weight]

    minlength_graph.join(startpos, shortest_comb[1], shortest_comb[2])

    for fixed_nodes in minlength_graph:

        graph.remove_wo_weight(fixed_nodes, shortest_comb[1])

        graph.remove_wo_weight(shortest_comb[1], fixed_nodes)

    if shortest_comb[1] == goalpos:

        print(shortest_comb[2])

        break

    minlength_graph = minlength_graph.undirected()


Entrée et sortie omises (comme à Bellmanford)

Créez un graphe = minlength_graph qui relie les points où la position initiale et la distance sont fixées avec la distance à ce point comme poids, et supprimez l'arête entre les nœuds inclus dans le minlength_graph du graphe d'origine avec graph.remove_wo_weight (). J'irai.

En bref, cela fait juste que minlength_graph agisse comme une liste de dp, mais j'ai l'impression que c'est devenu plus facile à comprendre visuellement (?) (Ci-après gif).

graph.gif

Postscript) Compte tenu de la quantité de calcul, il est préférable d'enregistrer non seulement le nœud avec la distance la plus courte mais également le nœud le plus proche du second. Ensuite, à l'étape suivante, seule la distance au point adjacent au point nouvellement déterminé et la distance au deuxième point le plus court de l'étape précédente doivent être comparées, de sorte qu'il n'y ait pas de gaspillage.

Recommended Posts

Livre Ali en python: méthode Dyxtra Sec.2-5
Livre Ali en python: Graphique Sec.2 à 5
Algorithme en Python (Dijkstra)
Livre Ali en python: Sec.2-4, structure de données
Livre Ali en python: Sec.2 à 5 Graph (préparation)
Livre Ali en python: Sec.2-3, Dynamic Planning (DP)
Implémenter l'algorithme de Dijkstra en python
Livre Ali en python: page 42 numéros
Livre Ali en python: Auto-implémentation de la file d'attente prioritaire
Livre Ali en python: page 43 Planification des sections
Livre de fourmis en python: page 49 Réparation de clôture
Algorithme génétique en python
Algorithme en Python (méthode Bellman-Ford, Bellman-Ford)
Livre de fourmis en python: page 47 Armée de Saroumane (POJ 3069)
Algorithme en Python (jugement premier)
Reproduire la méthode de division mutuelle euclidienne en Python
Algorithme en Python (dichotomie)
[Python3] Méthode Dikstra avec 14 lignes
Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)
Implémentation de l'algorithme de "Algorithm Picture Book" en Python3 (Bubble Sort)
Livre Ali en python: page 45 Le plus petit problème dans l'ordre lexical (POJ3617)
Implémentation de l'algorithme «Algorithm Picture Book» en Python3 (tri sélectif)
Algorithme en Python (recherche de priorité de largeur, bfs)
Algorithme de tri et implémentation en Python
Ecrire des algorithmes A * (A-star) en Python
Développons un algorithme d'investissement avec Python 2
Algorithme en Python (recherche de priorité en profondeur, dfs)
Implémentation d'un algorithme simple en Python 2
Algorithme de structure de données de livre d'images Python
Implémentation de la méthode Dyxtra par python
Algorithme (arborescence de segments) en Python (s'entraîner)
Exécutez un algorithme simple en Python
Algorithme Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Algorithme en Python (ABC 146 C Dichotomy
Livre de fourmis avec python (Chapter3 édition intermédiaire ~)
Ecrire une méthode de cupidité simple en Python
Algorithme d'alignement par méthode d'insertion en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python