Dijkstra lühim tee

Vaata, kuidas Dijkstra algoritm leiab lühima tee kaalutud graafis.

Interaktiivse simulatsiooni laadimine...

Relaksatsioon on kogu algoritm; prioriteetjärjekord on ainult kiirus 🖖

Dijkstra algoritm leiab lühima tee sõlmede vahel mitte-negatiivsete kaaludega graafis. See töötab ahnelt (greedy), uuendades kaugusehinnanguid relaksatsiooni kaudu: d(v) = min(d(v), d(u) + w(u,v)). Ajaline keerukus on optimeeritud tasemele O(E + V log V), kasutades Fibonacci kuhja prioriteedijärjekorda.

Miks lähim tipp on alati kindel 🖖

Dijkstra kasvatab alguspunktist väljapoole rinnet ja valib alati lähima veel külastamata tipu. Kuna kõik kaalud on mittenegatiivsed, ei suuda ükski hilisem ümbertee võita juba leitud lühemat teed — kui tipp on kord kinnitatud, on selle kaugus lõplik ja seda ei vaadata enam üle. Seetõttu toetuvad marsruudiplaneerijad ja võrguprotokollid nagu OSPF sellele usaldusväärsete lühimate teede arvutamiseks.

Välja mõeldud kahekümne minutiga kohvikus 🖖

Edsger Dijkstra mõtles algoritmi 1956. aastal välja umbes kahekümne minutiga, ilma pliiatsi ja paberita, puhates Amsterdami kohviku terrassil. Ta otsis näiteülesannet arvutile ARMAC ja valis lühima marsruudi kahe Hollandi linna, Rotterdami ja Groningeni vahel. Kolm aastat hiljem avaldas ta selle vaevalt kolmeleheküljelises artiklis — ühes informaatika enim tsiteeritud tulemuses.

Ülesanne täielikult lahendatud

  1. Sõlm 1 allikast ühe serva kaugusel hinnaga 4 5 sammu

    Tipp 1 on lähtetipust ühe serva kaugusel kaaluga 4 — ja algoritm teatab selle kauguseks 3. Käi läbi tippude fikseerimise järjekord ja leia, kust see 3 pärineb.

    1. Dijkstra algoritm fikseerib tippe kauguse järjekorras ega külasta neid kunagi uuesti. See järjekord ongi kogu algoritm ja kogu tõestus: kui tipp on fikseeritud, ei saa selleni eksisteerida odavamat teekonda, sest iga selline teekond peaks läbima mõnda fikseerimata tippu, mis on juba kaugemal.

    2. Lähtetipust annavad kaks otsest serva ajutisteks kaugusteks 4 ja 2. Kumbki pole veel lõplik — need on ülempiirid.

    3. Kõige lähemal on tipp 3 kaugusega 2, seega fikseeritakse see esimesena. Selle servade lõdvendamine leiab teekonna tipuni 1 maksumusega 2 + 1 = 3, mis on parem kui otsene serv kaaluga 4. See on samm, mis vastab küsimusele: odavaim tee naabertipuni ei pruugi olla vahetult selleni viiv serv.

    4. Tipp 1 fikseeritakse kaugusega 3 ning sealt servade lõdvendamine jõuab tipuni 2 kaugusega 8.

    5. Tipp 4 on kättesaadav kaugusega 8 läbi tipu 3 ning alternatiiv läbi tipu 2 maksab 8 + 3 = 11, seega jääb kehtima lühem teekond.

    Vastus

    Tööriist kuvab kaugusteks 3, 8, 2, 8 ja lühimaks teekonnaks 0 → 3 → 4. Õppetund peitub tipus 1: otsene serv ei ole lühim tee ja just ahne fikseerimine teeb selle teadasaamise odavaks, mitte eksponentsiaalseks. Tagatisel on siiski üks tingimus — mittenegatiivsed kaalud. Negatiivse serva korral saab varem fikseeritud tippu hiljem parandada ning sammu 1 tõestus kukub kokku. Klõpsa negatiivse serva eelseadistusel ja vaata, kuidas see ebaõnnestub korraga mõlemas suunas: tipp 3 tagastatakse kaugusega −1, mis pole kaugus, mida ükski teekond annaks, ja teekonna taastamine loobub täielikult teatega „tee puudub — eelkäijad moodustavad tsükli“. Valed arvud ja teekonna puudumine algoritmilt, mis on tõestatavalt korrektne kohe, kui iga kaal on mittenegatiivne.

Allikad (2)

Näiteülesanded