Ymmärtää kaikki parit lyhyin polku ongelma

Kaikki parit lyhin polku (APSP) ongelma pyrkii lyhyin etäisyys jokaisen parin vertices painotettu kaavio. Se on perushaaste kaavio teorian suoria vaikutuksia verkon suunnitteluun, liikenteen virtauksen optimointi, sosiaalinen verkostoanalyysi, ja logistiikka. Toisin kuin yhden lähdekoodin lyhin polku ongelmia, ratkaiseminen APSP vaatii laskenta etäisyydet kunkin huippupiste kaikille muille, joka asteikot quadratically kanssa määrä solmuja.

Yhteiset lähestymistavat käsittelevät tätä ongelmaa, mutta vastakkaisiin kauppoihin. Floyd-Warshall, dynaaminen ohjelmointialgoritmi, toimii tiheillä kaavioilla, mutta toimii [O(V[]3[[[]])[[[[]]] aikaa eikä pysty käsittelemään negatiivisia painojaksoja. Dijkstra... Kun ajaa jokaisesta huippupisteestä, saavuttaa []O(V (E + V log V)) [[[] binäärinen kasa, mutta se ei onnistu kaavioita negatiivisilla reunapainoilla. Harvaan kuvaajiin Johnson.S algoritmi siltoja tämä ero yhdistämällä paras molempien menetelmien samalla käsitellä negatiivisia painoja.

Yhteisten algoritmejen vertailu

Arvosttaa Johnson... algoritmi, se auttaa kontrastia yleisimmin käytetyt APSP ratkaisijat:

  • Floyd-Warshall[ . ... ... ...............................................................................................................................................................................................................................
  • Repeated Dijkstra[ . Runs Dijkstra jokaisesta huippupisteestä. Nopeasti harvaan kaavioihin ([]O(V E log V)[ käyttäen Fibonacci kasoja), mutta rajoitettu ei-negatiivisiin painoihin.
  • Bellman-Ford (toistuva) ... ..................................................................................................................................................................................................................................
  • Johnsonin algoritmi[ . ... ....................................................................................................................................................................................................................................

Miten Johnsoni Algoritmi toimii

Johnson.S-algoritmi muuttaa fiksusti graafin, joka sisältää negatiiviset reunat yhdeksi ainoaksi ei-negatiiviseksi reunapainoksi, säilyttäen lyhimpien polkujen rakenteen. Tämä transformaatio perustuu []potentiaaliseen toimintoon[], joka on johdettu yhdestä Bellman-Ford-ajosta. Kun algoritmia on painotettu uudelleen, Dijkstra. Algoritmi voidaan käyttää turvallisesti jokaisesta solmusta. Algoritmi koostuu neljästä vaiheesta.

Vaihe 1: Superlähdesolmupisteen lisääminen

Uusi huippupiste s[] lisätään kaavioon, joka on liitetty jokaiseen olemassa olevaan huippupisteeseen, jonka paino on 0. Tämä lisäsolmu ei muuta lyhyimpiä polkuväliä, koska kaikki polkuja käyttävät s[] voidaan liittää ilman kustannuksia.

Vaihe 2: Mahdollisten toimintojen laskenta Bellman-Fordilla

Suorita Bellman-Ford-algoritmi superlähteestä s[]. Koska [s[[] on nollapainon reunoja kaikkiin vertices, algoritmi laskee lyhyimmän etäisyyden []h(v)[[]] [[[]] jokaiseen vertexiin []v[]. Tämä etäisyys toimii mahdollisena toimintona. Jos negatiivinen sykli havaitaan tämän ajon aikana, alkuperäinen kaavio sisältää negatiivisen syklin ja Johnson.

Vaihe 3: Kaavion uudelleenpainottaminen

Potentiaalien h(v) avulla jokainen reuna (u, v)[, jonka alkuperäinen paino w(u, v)[], on painotettu uudelleen seuraavasti:

w'(u, v) = w(u, v) + h(u) . h(v) [

Tämä muutos takaa, että jokainen uudelleenpainotettu reunapaino on ei-negatiivinen. Todisteet perustuvat kolmion epätasa-arvoon: koska h(v) ≤ h(u) + w(u, v)[] (Bellman-Ford.s:n tulosteesta), se seuraa, että [w'(u, v) ≥ 0. Lisäksi polkujen tilaus on säilynyt: lyhin polku kahden vertices alkuperäisen kaavion välillä on edelleen lyhin polku painotetun kaavion.

Vaihe 4: Running Dijkstra...

Kun uudelleenpainotettu kaavio sisältää vain ei-negatiivisia reunoja, Dijkstra. Algoritmi ajetaan kerran jokaisesta huippupisteestä. Jokainen ajo laskee lyhyimmät etäisyydet kaikkiin muihin vertices. Tuloksena etäisyydet muunnetaan sitten takaisin alkuperäisiä reunapainoja käyttäen kaavaa:

]dist[ariginal(u, v) = distrepainotettu (u, v) .

Tämä viimeinen vaihe varmistaa, että ilmoitetut etäisyydet ovat oikeita alkuperäistä kuvaajaa varten.

Monimutkaisuus ja suorituskyvyn analyysi

Johnsonin algoritmi tuottaa kokonaisajan monimutkaisuuden O(V E + V[2[[ log V)[[], kun se toteutetaan binäärisellä roukkiolla prioriteettijonolla. Bellman-Ford-vaihe kulkee [] O(V E:[[] ja sitä seuraava [] V:[] Dijkstra ajaa jokaista ottoa [] O(E + V log V:1]]]]], kompleksiset lähestymistavat ]]][[[FLT:]]]]]]], ja sen jälkeen ]] [[[[FLT]]]]] [[[[FLT:]]

Fibonacci-kasan käyttö voi vähentää Dijkstra.n osan O(V E + V2[ log V)[] kuoletettu, vaikka käytännössä binäärikasojen ovat yksinkertaisempia ja usein tarpeeksi nopeita. Muistin jalanjälki on []O(V[]]2[[]] etäisyysmatriisin osalta, mutta tätä voidaan parantaa tallentamalla tuloksia implisiittisesti.

Käytännön sovellukset

Johnson-algoritmia käytetään aloilla, joilla graafinen reuna voi aiheuttaa negatiivisia kustannuksia ja kaikki parit lyhimmät etäisyydet ovat tarpeen.

  • Verkkoreititys:[ Internet-palvelujen tarjoajat ja televiestintäverkot käyttävät hajautettuja reititysprotokollia, joiden on laskettava edullisin reitti kahden reitittimen välillä, vaikka linkkikustannukset vaihtelisivat tai muuttuisivat negatiivisiksi (esim. ruuhkautumisen tai politiikkaalennusten vuoksi).
  • Kaupunkiliikenteen suunnittelu:[ Kartoitus- ja logistiikkayritykset (esim., Google Maps, OpenStreetMapin reititysmoottorit) laskevat lyhimmät polut monien alkuperä-määräparien välillä laivaston optimointiin. Negatiivisilla painoilla voidaan mallintaa tukia tai aikapohjaisia alennuksia.
  • Ketjukustannusten alittaminen:[] Monivaiheisissa tuotantoverkoissa kustannukset solmusta toiseen saattavat olla negatiivisia (esim. hyvitykset). Johnsonin algoritmi löytää kannattavimmat reitit koko toimitusketjussa.
  • Sosiaaliverkkoanalyysi:[ Läheisyyskeskittymän mittaaminen tai nimettömyyskeskittyminen vaatii kaikki parivälit. Negatiiviset reunat voivat edustaa ystävää tai ystävää.
  • Taloudelliset panos-tuotosmallit:[ Leontiefin malleihin ja virtausanalyyseihin liittyy usein negatiivisia kertoimia; Johnsonin algoritmi laskee toisiinsa yhteydessä olevan talouden kautta tapahtuvien muutosten nettovaikutuksen.

Lisätietoja matemaattisista perustoista on Wikipedia. Yksityiskohtaiset tiedot [ ja Donald B. Johnsonin alkuperäinen paperi (1977). Käytännön toteutus Pythonissa löytyy NetworkX.s GitHub-arkistosta, johon sisältyy Johnsonin algoritmi vakiotoiminnona. Jotta voitaisiin ymmärtää tarkemmin uudelleenpainotustekniikkaa, CP-Algoritmitmit tarjoavat selkeän askel-askeleelta-opetusohjelman [.

Päätelmät

Johnson-Fordin algoritmi erottuu eleganttina ja käytännöllisenä ratkaisuna kaikkien parien lyhintä polkuongelmaa, kun negatiiviset reunapainot ovat läsnä. Yhdistämällä Bellman-Ford-mallin (negatiivisten syklien havaitsemiseen ja laskentapotentiaalien) nopeuden Dijkstra-malliin (ei-negatiivisten kaavioiden osalta), se saavuttaa erinomaisen suorituskyvyn harvassa verkossa. Uudelleenpainotustekniikka itsessään on kaunis sovellusten mahdollinen toiminta.

Kun kyseessä on todellinen APSP-ongelma, jossa graafit ovat harvassa ja saattavat sisältää negatiivisia reunoja, Johnson-algoritmin tulisi olla ensimmäinen näkökohta. Sen teoreettiset takeet ja laajalle levinnyt toteutus kirjastoissa (esim. ]NetworkX[], []Boost Graafinen kirjasto[) tekevät sen käyttökelpoiseksi.