Bouwsteen 4 — kies de volgende node
Hier bouw je op verder
- Python Functies
- Python Itereren over dictionaries
- Python Continue
Leerdoel: je vertaalt stap A van het papier naar Python: vind de node met de laagste afstand die nog niet bezocht is.
Wat we willen
Op papier pakte je de laagste afstand onder de rijen die nog niet
bekend waren. In Python loop je over afstanden, slaat over wie al in
bezocht zit, en onthoudt wie de laagste heeft.
Het patroon — lineair zoeken naar minimum
Dit is vind-maximum, maar dan het minimum, en met een filter.
beste_node = None
kleinste_afstand = float('inf')
for node, d in afstanden.items():
if node in bezocht:
continue # sla bezochten over
if d < kleinste_afstand:
kleinste_afstand = d
beste_node = node
Drie regels doen het werk. if node in bezocht: continue slaat een
node over die al klaar is. d < kleinste_afstand vervangt alleen bij
echt kleiner. En beste_node begint op None: is alles bezocht, dan
komt niemand door het filter en blijft het None. Dat is ons signaal
dat we klaar zijn.
Voorspel
Wat denk je dat dit print?
afstanden = {'A': 0, 'B': 4, 'C': 2, 'D': float('inf')}
bezocht = {'A'}
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
print(beste_node)
Antwoord
C
A wordt overgeslagen, die is al bezocht. Bij B is 4 kleiner dan
oneindig, dus B wordt de beste met 4. Bij C is 2 kleiner dan 4, dus
C neemt het over. Bij D is oneindig niet kleiner dan 2, dus er
verandert niets. Het eind is C.
Run
In een functie
Dit gebeurt elke ronde opnieuw, dus het wordt een functie:
Verwachte uitvoer
A
C
B
None
Zonder bezochte nodes wint A met 0. Met A bezocht is C de laagste
die overblijft, met A en C bezocht wint B, en met alles bezocht
komt niemand door het filter: None, ons stopsignaal.
Wat nu nog mist
De graph (bouwsteen 1), de tabel (2), relax (3) en kies volgende (4) staan er nu elk apart. Samen vormen ze één ronde van Dijkstra, één rij van je papieren tabel.
Door naar bouwsteen 5: doe één ronde →.