Top Qs
Tijdlijn
Chat
Perspectief
Kortstepad-algoritme
een graaf-algoritme beschreven door Edsger Dijkstra in 1959 Van Wikipedia, de vrije encyclopedie
Remove ads
Het kortstepad-algoritme, ook bekend als Dijkstra's algoritme, is een graaf-algoritme beschreven door Edsger Dijkstra in 1959.[1] Gegeven een gewogen graaf waarin de afstand tussen ieder tweetal verbonden punten van ten minste 0 bedraagt, rekent het algoritme voor een bepaalde beginknoop de kortste afstand uit tot alle punten van . Toepassingen van dit algoritme zijn onder meer bij verkeersmodellen, route-navigatiesystemen en telecommunicatie.
Remove ads
Basis

Het algoritme is gebaseerd op de opmerking dat de 'afstand', de lengte van het kortste pad, tussen ieder tweetal punten en van een gewogen graaf als volgt berekend kan worden:
- Zij de afstand tussen en , voor een punt van .
- Zij , de verzameling van punten die direct verbonden zijn met , via een tak van naar .
- Zij het gewicht van de tak tussen twee direct met elkaar verbonden knopen en .
- De afstand van naar is , het minimum van de som van de afstand van naar een punt plus de directe afstand van dat punt naar . Oftewel als de som van alle directe afstanden in een pad minimaal is, dan is de totale lengte van dat pad, die som dus, minimaal.
- Verder definiëren we , de verzameling van punten die direct verbonden zijn met , via een tak van naar .
Remove ads
Algoritme
Samenvatten
Perspectief
Het algoritme gaat verder door op de basis van hierboven. Het algoritme verdeelt de punten van in drie verzamelingen:
- : de verzameling van punten waarvan de kortste afstand tot berekend is
- : de verzameling van punten waarnaar er al wel een pad bekend is vanuit , maar niet het kortste, of dit is nog niet vastgesteld.
- : deze verzameling wordt in het algoritme niet bijgehouden
Hiervoor geldt uiteraard dat , en hebben geen punten gemeen.
Daarnaast bestaat er een array , geïndiceerd met de punten van . Voor elk punt wordt dit array door het algoritme dusdanig gevuld dat aan het eind geldt de lengte van het kortste pad van naar .
Initieel geldt
Het algoritme herhaalt nu de volgende stappen totdat de lege verzameling wordt (op dat moment zijn er geen bereikbare punten meer over), vanuit :
- Kies uit het punt met de minimale waarde van ; dit is de eindwaarde van voor dat punt. Immers, heeft de waarde van de lengte van het kortste pad naar vanuit dat we tot nu toe gezien hebben. Ieder ander pad naar moet over lopen en is dus langer, omdat alle kanten een positieve lengte hebben.
- Omdat definitief is, verplaatsen we van naar . Voor alle punten die bereikbaar zijn vanuit en die nog niet in zitten, doen we het volgende:
- Zit nog niet in , dan voegen we het punt aan toe. Onze eerste schatting voor de afstand tussen en is dan -- deze waarde plaatsen we in
- Zit al wel in , dan passen we de schatting in aan -- de nieuwe waarde is het minimum van de lengte van het nieuw-gevonden pad naar () en de lengte van het kortste pad naar dat we al gevonden hadden.
Zodra dit algoritme afloopt (en dat doet het, want is eindig en iedere stap verplaatst een element van naar ), dan is gevuld met de afstanden van naar alle punten die vanuit dit beginpunt bereikbaar zijn. Is oneindig voor een , dan is dat punt niet bereikbaar vanuit .
Remove ads
Algoritme in pseudocode
Samenvatten
Perspectief
In pseudocode ziet het algoritme er als volgt uit:
foreach do ; A := d(a) := 0 X := foreach z : z do X := X {z} d(z) := gew(,z); /* X en d zijn nu geïnitialiseerd */ while not(X = ) do /* X is nog niet leeg */ y : (y X) (d(y) = MIN {d(y')|y' X} /* y is dus het element van X met de laagste waarde van d(v) -- dit is de definitieve waarde van d(y) */ A := A {y} X := X{y} /* y is nu verplaatst van X naar A */ foreach z: z not (z A) do if not (z X) then X := X {z} d(z) := d(y) + gew(y,z) else /* dus z X */ d(z) := MIN{d(z), d(y) + gew(y,z)}
Remove ads
Bewijs
Samenvatten
Perspectief
De correctheid van het algoritme kan aangetoond worden aan de hand van wiskundige inductie. [2][3]
Concreet moet er aangetoond worden dat de afstanden die het algoritme berekent effectief de afstanden (volgens het kortste pad) zijn tussen het startknooppunt en de knoop . Die afstanden worden vastgelegd wanneer knoop aan de verzameling (de verzameling van punten waarvan de kortste afstand tot berekend is). Merk op dat, eens aan is toegevoegd, de afstand niet meer gewijzigd wordt en er ook geen kortere afstand meer gevonden kan worden binnen de beschouwde graaf. Dit laatste is een rechtstreeks gevolg van de manier waarop het algoritme opgebouwd is en omdat alle gewichten van takken tussen knopen en positief zijn (een van de basisaannames van het algoritme). Merk op dat de notatie verderop expliciet wordt ingevoerd om het onderscheid te maken met de finale (en correcte) afstand die het algoritme uiteindelijk zal uitvoeren.
Basisstap van de wiskundige inductie
Het bewijs wordt nu geleverd door wiskundige inductie. In het basisgeval wordt een graaf beschouwd met een enkele knoop . Door de opbouw van het algoritme zal deze knoop bij de eerste iteratie aan toegevoegd worden, met . In het basisgeval is het algoritme dus correct.
Inductiestap
Vermits het basisgeval correct is, kan nu aangenomen worden dat voor alle knopen die al in de verzameling zitten, de berekende afstand effectief overeenkomt met de gezochte kortste afstand (lengte van een kortste pad tussen en ). Er moet nu bewezen worden dat, wanneer een volgende knoop wordt toegevoegd aan de verzameling , de berekende afstand effectief de lengte is van een kortste pad. Anders gezegd: in deze inductiestap wordt bewezen dat het algoritme de correcte afstand berkend heeft op het moment dat die afstand finaal wordt vastgelegd (ofwel wanneer de knoop aan verzameling wordt toegevoegd).[3]
Beschouw nu een kortste pad van naar (nog steeds de volgende knoop die aan zal toegevoegd worden omdat die van alle knopen in het kleinste afstandslabel bezit). Beschouw op dit kortste pad de knoop die het dichtst bij ligt en waarvoor . Merk op dat sowieso gedefinieerd is (er zal namelijk altijd één knoop, zijnde bestaan waar de voorwaarde voldaan is). Beschouw nu twee gevallen.
Indien , dan is . Er geldt dan dat . Omdat nu wordt toegevoegd aan , terwijl , levert het algoritme een correcte uitkomst. In dit geval is de correcte werking van het algoritme dus bewezen.
In het logische geval is . Herinner dat en bovendien en ten derde de volgende knoop is die aan wordt toegevoegd door het algoritme. Indien , dan bestaat er nog een knoop die op het kortste pad ligt en daarop vlak na op het pad ligt. In dit geval beschouwen we dus een situatie waarbij , anders gezegd een situatie waarin het algoritme niet werkt. Merk op dat deelpaden van korste paden in de grafentheorie zelf ook kortste paden zijn. Het deel van tussen en bezit dus een gewicht . Omdat bovendien alle takken een positief gewicht hebben, moet bovendien gelden: . Door de constructie van het algoritme kan deze ongelijkheid bovendien uitgebreid worden tot . Het tweede luik van de ongelijkheid oogt triviaal, maar kan ook inductief bewezen worden.[3]
De vorige ongelijkheid kan terug opgesplitst worden in twee gevallen. In het eerste is . De ongelijkheden worden vervangen door gelijkheden, waardoor de correctheid van het algoritme terug bewezen is. Beschouw nu het geval waarin . Dit is dus het geval waarin een knoop aan zou toegevoegd worden met een verkeerd voorspelde afstand. Dit is niet mogelijk, zoals blijkt uit volgende contradictie. is gekozen als de knoop die als volgende aan toegevoegd wordt omdat het bijhorende afstandslabel het kleinst is van alle knopen in is. Uit die redenering volgt dus dat niet langer in kan zitten, omdat anders door het algoritme zou geselecteerd worden. Aangezien , is ook het afstandslabel in een vorige stap bijgewerkt volgens de logica van het algoritme. Derhalve geldt: . Omdat en op eenzelfde kortste pad liggen tussen en (en daardoor dus ook op een kortste pad tussen en ), moet . Dit is echter strijdig met de definitie van als de knoop die het dichtst bij ligt en voldoet aan . Dit impliceert dat de aanname niet correct was, en dat moet zijn. Hiermee is de correctheid van het algoritme finaal bewezen.
Remove ads
Hedendaagse toepassingen
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads