8.9 Bouwsteen 6 — herhaal tot klaar
Leerdoel: je zet één enkele regel rondom je ronde-blok zodat hij zichzelf herhaalt tot alle nodes bezocht zijn.
Wat we willen
We willen zeggen: "blijf rondes doen, tot er geen nog-niet-bezochte node meer is."
In Python: een while-lus met een stop-conditie.
Wanneer stoppen?
Onze kies_volgende returnt None als alles bezocht is. Dat is dus
ons stop-signaal:
while True:
huidige = kies_volgende(afstanden, bezocht)
if huidige is None:
break # niemand meer over → klaar
bezocht.add(huidige)
for buur, gewicht in graph[huidige]:
nieuwe = afstanden[huidige] + gewicht
if nieuwe < afstanden[buur]:
afstanden[buur] = nieuwe
while True zegt: "blijf maar bezig". De if ... break is de
uitgang.
Waarom geen "for node in graph"?
Op het eerste gezicht lijkt het verleidelijk:
for node in graph:
# doe een ronde voor node
Maar dat klopt niet. We willen elke ronde de node met de laagste
afstand kiezen — niet gewoon in alfabetische volgorde. kies_volgende
doet die slimme keuze.
Stopt deze lus altijd?
Ja — gegarandeerd. Elke ronde voegen we precies één node aan
bezocht toe. Na maximaal len(graph) rondes is iedereen erin.
kies_volgende returnt dan None, en break springt eruit.
Geen risico op een oneindige lus. Belangrijk: vergeet bezocht.add()
niet — anders blijf je dezelfde node steeds opnieuw kiezen. Daarom
zetten we dat altijd direct na de kies-stap.
Voorspel
Wat denk je dat de eindafstanden zijn voor onze mini-graph, start A?
Antwoord
{'A': 0, 'B': 4, 'C': 2, 'D': 5}
Exact wat je op papier kreeg.
Run
Verwachte uitvoer
Ronde — bezoek A (afstand 0)
Ronde — bezoek C (afstand 2)
Ronde — bezoek B (afstand 4)
Ronde — bezoek D (afstand 5)
Klaar! Afstanden vanaf A: {'A': 0, 'B': 4, 'C': 2, 'D': 5}
Vier rondes, één per node. Vergelijk met je pen-en-papier — exact dezelfde volgorde van "klaar" verklaren.
Wat nu nog mist
Niks — we hebben Dijkstra werkend. In de volgende stap zetten we alles netjes in één functie en zien we het hele algoritme tegelijk.
Door naar stap 10: het complete algoritme →.