Shortest-Path-Algorithmus und Python-Implementierung

Kürzeste-Wege-Problem

In der Graphentheorie bezieht sich das Problem des kürzesten Pfads auf das Finden des kürzesten Pfads von einem Ursprung zu einem Ende in einem gerichteten oder ungerichteten gewichteten Graphen. Dieses Problem ist ein klassisches Problem in der Informatik und die Grundlage vieler praktischer Probleme, wie z. B. der Routenplanung, des Entwurfs von Kommunikationsnetzen und der Optimierung des Verkehrsflusses. Bei diesem Problem hat jede Kante ein Gewicht, das die Kosten für das Passieren dieser Kante darstellt, z. B. Entfernung, Zeit oder Kosten. Das Ziel des Kürzeste-Wege-Problems besteht darin, einen Weg vom Startpunkt zum Endpunkt zu finden, der die Summe der Gewichte der durch den Weg verlaufenden Kanten minimiert.

mathematisches Modell

Das Finden des kürzesten Pfads kann mit linearer Programmierung oder ganzzahliger linearer Programmierung modelliert werden. Das Folgende ist ein mathematisches Modell der ganzzahligen linearen Programmierung:

x[ij] bezeichne, ob der Pfad von Knoten i zu Knoten j ausgewählt ist, falls ausgewählt, dann x[ij] = 1, andernfalls x[ij] = 0.

Dann kann das Kürzeste-Wege-Problem ausgedrückt werden als:

Darunter repräsentiert C[ij] die Gewichtung der Kante von Knoten i zu Knoten j, s und t repräsentieren Quellenknoten bzw. Senkenknoten.

Die erste Einschränkung bedeutet, dass x[ij] nur 0 oder 1 annehmen kann. Die zweite Einschränkung besagt, dass die Anzahl der Kanten, die einen Knoten verlassen, gleich der Anzahl der Kanten sein muss, die von diesem Knoten eintreten, es sei denn, der Knoten ist eine Quelle oder Senke.

Die Implikation dieses Modells ist, dass wir einen Pfad vom Quellenknoten zum Senkenknoten so wählen wollen, dass das Gesamtgewicht des Pfads am kleinsten ist. Da die Einschränkungen den Anfang und das Ende des Pfads garantieren, kann das Modell sicherstellen, dass die Lösung der kürzeste Pfad vom Quellenknoten zum Senkenknoten ist.

Algorithmus

Im Folgenden sind einige gängige Algorithmen für kürzeste Pfade in der Graphentheorie aufgeführt:

  • Dijkstra-Algorithmus: Der Dijkstra-Algorithmus ist ein Single-Source-Algorithmus für den kürzesten Weg, der verwendet wird, um den kürzesten Weg vom Startpunkt zu allen anderen Knoten zu berechnen. Die Grundidee des Algorithmus besteht darin, vom Ausgangspunkt aus zu beginnen, den kürzesten Weg von jedem Knoten zum Ausgangspunkt zu berechnen und dann den kürzesten Weg von jedem Knoten zum Ausgangspunkt zu berechnen, bis alle Knoten vorhanden sind berechnet. .

  • Bellman-Ford-Algorithmus: Der Bellman-Ford-Algorithmus ist ein dynamischer Programmieralgorithmus, der verwendet wird, um die kürzesten Pfade von einem Startpunkt zu allen anderen Knoten in einem gewichteten gerichteten Graphen zu finden. Der Algorithmus kann Graphen mit negativen Kantengewichten verarbeiten und kann auch negative Gewichtszyklen erkennen.

  • Floyd-Warshall-Algorithmus: Der Floyd-Warshall-Algorithmus ist ein dynamischer Programmieralgorithmus zum Finden des kürzesten Pfads zwischen zwei beliebigen Knoten in einem gewichteten gerichteten Graphen. Der Algorithmus kann Graphen mit negativen Kantengewichten verarbeiten und mehrere Sätze kürzester Pfade gleichzeitig berechnen.

Fall (Problem der Flugticketpreise zwischen Städten)

Fragen sind wie folgt:

 Wir lösen dieses Problem mit der NetworkX-Bibliothek von Python.

import networkx as nx

# 定义机票票价矩阵
costs = [[0, 50, 0, 40, 25, 10],
         [50, 0, 15, 20, 0, 25],
         [0, 15, 0, 10, 20, 0],
         [40, 20, 10, 0, 10, 25],
         [25, 0, 20, 10, 0, 55],
         [10, 25, 0, 25, 55, 0]]

# 将矩阵转换成带权有向图
G = nx.DiGraph()
for i in range(len(costs)):
    for j in range(len(costs[0])):
        if costs[i][j] != 0:
            G.add_edge(chr(65+i), chr(65+j), weight=costs[i][j])

# 计算城市A到其它城市的最短路径及票价
shortest_path = nx.shortest_path(G, source='A', weight='weight')
shortest_path_cost = nx.shortest_path_length(G, source='A', weight='weight')
for dest, cost in shortest_path_cost.items():
    print(f"从A到{dest}的最便宜路径为{shortest_path[dest]}, 票价为{cost}元")

 Das Ergebnis ist wie folgt:

从A到A的最便宜路径为['A'], 票价为0元
从A到F的最便宜路径为['A', 'F'], 票价为10元
从A到E的最便宜路径为['A', 'E'], 票价为25元
从A到B的最便宜路径为['A', 'F', 'B'], 票价为35元
从A到D的最便宜路径为['A', 'F', 'D'], 票价为35元
从A到C的最便宜路径为['A', 'E', 'C'], 票价为45元

Der Kerncode hier ist nx.shortest_patheine Funktion, in Pythons NetworkX-Bibliothek nx.shortest_path()eine Funktion zur Berechnung des kürzesten Pfads in einem gerichteten oder ungerichteten gewichteten Graphen. Seine Syntax ist wie folgt:

nx.shortest_path(G, source=None, target=None, weight=None, method='dijkstra')

Die Parameter dieser Funktion werden wie folgt erklärt:

  • G: Der Graph, für den der kürzeste Weg berechnet werden soll, kann gerichtet oder ungerichtet sein.

  • Quelle: Der Quellknoten, dh der Startknoten, der Standardwert ist None, was den kürzesten Pfad aller Knoten im Berechnungsdiagramm bedeutet.

  • target: Der Zielknoten, d. h. der Endknoten, der Standardwert ist None, was bedeutet, dass der kürzeste Pfad vom Quellknoten zu allen Knoten im Diagramm berechnet wird.

  • Gewicht: Das Gewicht der Kante, der Standardwert ist None, was bedeutet, dass das Gewicht aller Kanten 1 ist.

  • Methode: Die Berechnungsmethode für den kürzesten Weg, die Standardeinstellung ist Dijkstra, was bedeutet, dass der Dijkstra-Algorithmus verwendet wird. Andere Algorithmen wie der Bellman-Ford-Algorithmus und der Floyd-Warshall-Algorithmus können ebenfalls gewählt werden. Die Funktion gibt ein Wörterbuch zurück, wobei der Schlüssel der Zielknoten und der Wert der kürzeste Pfad vom Quellknoten zu diesem Zielknoten ist. Wenn ein Zielknoten angegeben ist, wird der kürzeste Pfad vom Quellknoten zum Zielknoten zurückgegeben. Gibt einen leeren Pfad zurück, wenn sich Quell- und Zielknoten nicht in derselben verbundenen Komponente befinden.

nx.shortest_path()Es wird nur der kürzeste Pfad zwischen Knoten berechnet, nicht die kürzeste Entfernung des Pfads. Wenn Sie die kürzeste Entfernung berechnen müssen, können Sie nx.shortest_path_length()eine Funktion verwenden.

Acho que você gosta

Origin blog.csdn.net/weixin_64338372/article/details/130020852
Recomendado
Clasificación