Veröffentlicht · wird verbessert
Kürzeste Wege und minimale Spannbäume-Anleitung · 6/6
Dieses Kapitel ist vorerst nur auf Englisch verfügbar.
Shortest paths and spanning trees are among the most widely deployed graph algorithms. This chapter shows where they run in practice, which libraries to reach for, and the mistakes that most often cause wrong answers.
-log(rate), a negative cycle found by Bellman-Ford corresponds to a currency arbitrage loop.In Python, NetworkX is convenient for prototypes and graphs up to roughly a few hundred thousand edges.
import networkx as nx
G = nx.Graph()
G.add_weighted_edges_from([("A", "B", 1), ("B", "C", 2), ("A", "C", 3), ("C", "D", 4), ("B", "D", 5)])
print(nx.dijkstra_path(G, "A", "D")) # ['A', 'B', 'D']
print(nx.dijkstra_path_length(G, "A", "D")) # 6
mst = nx.minimum_spanning_tree(G, algorithm="kruskal")
print(sorted(mst.edges(data="weight"))) # [('A', 'B', 1), ('B', 'C', 2), ('C', 'D', 4)]For large numeric graphs, SciPy's scipy.sparse.csgraph works on sparse matrices and runs in compiled code.
import numpy as np
from scipy.sparse import csr_matrix
from scipy.sparse.csgraph import dijkstra, minimum_spanning_tree
m = csr_matrix(np.array([
[0, 1, 3, 0],
[1, 0, 2, 5],
[3, 2, 0, 4],
[0, 5, 4, 0],
]))
dist = dijkstra(m, directed=False, indices=0)
print(dist) # [0. 1. 3. 6.]
print(minimum_spanning_tree(m).sum()) # 7.0In C++, the Boost Graph Library provides dijkstra_shortest_paths, bellman_ford_shortest_paths, kruskal_minimum_spanning_tree and prim_minimum_spanning_tree. In databases, Neo4j's Graph Data Science library and PostgreSQL's pgRouting extension run these algorithms close to the data.
if d > dist[u]. Results stay correct, but the run can slow down sharply on dense graphs.INF + w wraps around. Never relax from a vertex whose distance is still infinite, and use 64-bit integers.heappush raises TypeError. Add a counter as a tie-breaker.import heapq
from itertools import count
tie = count()
heap = []
heapq.heappush(heap, (5, next(tie), {"name": "warehouse"}))
heapq.heappush(heap, (5, next(tie), {"name": "store"})) # no TypeError: the counter decides
print(heapq.heappop(heap)[2]) # {'name': 'warehouse'}V - 1 edges. Check the count before treating it as a tree.
0 Kommentare
Anmelden · Melde dich an, um einen Kommentar zu schreiben.
Schreib den ersten Kommentar.