Het complete algoritme
Leerdoel: je ziet alle bouwstenen samenkomen in één functie, en je tekent het resultaat op de graph.
Alles samen
def kies_volgende(afstanden, bezocht):
beste_node = None
kleinste = float('inf')
for node, d in afstanden.items():
if node in bezocht:
continue
if d < kleinste:
kleinste = d
beste_node = node
return beste_node
def dijkstra(graph, start):
afstanden = {}
for node in graph:
afstanden[node] = float('inf')
afstanden[start] = 0
bezocht = set()
while True:
huidige = kies_volgende(afstanden, bezocht)
if huidige is None:
break
bezocht.add(huidige)
for buur, gewicht in graph[huidige]:
nieuwe = afstanden[huidige] + gewicht
if nieuwe < afstanden[buur]:
afstanden[buur] = nieuwe
return afstanden
- Regel 1-10:
Bouwsteen 4 — de helper
kies_volgende: van alle onbezochte knopen die met de laagste afstand tot nu toe. Zijn ze allemaal bezocht, dan blijftbeste_nodeopNonestaan. - Regel 13:
Bouwsteen 1 komt binnen als
graph: de dict met per knoop zijn buren. - Regel 14-16:
Bouwsteen 2, stap 0 — elke knoop begint op oneindig: nog geen route bekend.
- Regel 17:
Behalve het startpunt: daar sta je al, afstand 0.
- Regel 18:
De lege set voor knopen die definitief af zijn.
- Regel 20-23:
Bouwsteen 6 — de hoofdlus: kies de volgende knoop, en stop zodra er geen onbezochte meer over is.
- Regel 24:
Bouwsteen 5 — markeer de gekozen knoop als af, vóór de volgende ronde kiest.
- Regel 25-28:
Bouwsteen 3 — relax de buren: is de route via
huidigekorter dan wat we voor de buur hadden, dan overschrijven we die afstand.
Voorspel
We draaien dijkstra(graph, 'A') op de kleine graph. Wat komt eruit?
Antwoord
{'A': 0, 'B': 4, 'C': 2, 'D': 5}
Wat je op papier en in de losse rondes ook kreeg.
Run
Visualiseer de afstanden
De graph, met op elke node zijn kortste afstand vanaf A:
Wat zie je?
Elke node toont zijn kortste afstand vanaf A; de startnode is groen.
B en C liggen direct aan A, op 4 en 2. D staat op 5, via B en
niet via C.
Onderzoek
kies_volgende en dijkstra van hierboven staan al klaar; in het veld
staat alleen de graph. Pas hem aan:
- Een andere startnode:
dijkstra(graph, 'D'). - Maak
A → Bveel duurder (bv. gewicht 100). Hoe verandert de afstand naarB? - Voeg een extra node
Etoe met een verbinding naarB. Welk gewicht mag die edge hoogstens hebben alsEop afstand 6 of minder moet liggen?
Wat zie je?
{'A': 5, 'B': 1, 'C': 7, 'D': 0}.Cligt nu op 7, viaBenA(1 + 4 + 2), en niet op 8 via de directe edge.Bkomt op 11 te staan, viaCenD(2 + 8 + 1).Dwordt 10: viaBkost hij nu 101.- Hoogstens 2:
Bligt op 4, dusEop 4 plus het gewicht. Zet de edge in beide lijsten,('E', 2)bijBen'E': [('B', 2)]. Staat hij alleen bijE, dan komt Dijkstra vanafAnooit bijEen blijft de afstandinf.
Door naar pad reconstrueren →.