Route planning in wegen netwerken Snelweg hiërarchieën voor het versnellen van route queries Bart Jansen
Overzicht Achtergrond Technieken Conclusie Opbouw Zoekmethode Praktisch probleem Theoretische resultaten Doel van versnellings methoden Technieken Dijkstra and uitbreidingen Highway hierarchies Opbouw Zoekmethode Conclusie 20-11-2018 Bart Jansen
Praktisch probleem Zoek een kortste pad van a naar b in een gerichte graaf (“single pair”) We behandelen niet: Single source shortest paths All-pairs shortest paths Negatieve gewichten 20-11-2018 Bart Jansen
De theorie Dijkstra’s algoritme (1959) Voor een gerichte graaf met n knopen en m kanten: O(n log n + m) time, O(n) ruimte met Fibonnaci heaps Te langzaam voor grote netwerken 18 miljoen knopen, 23 miljoen kanten voor een volledige beschrijving van West-Europa Voor mobiele apparaten is zelfs O(n + m) te langzaam 20-11-2018 Bart Jansen
Slechts 3 miljoen van de in totaal 23 miljoen kanten 20-11-2018 Bart Jansen
Preprocessing Bij route planning worden meerdere queries gedaan op dezelfde graaf Gebruik preprocessing om toekomstige queries te versnellen Algoritme voor all-pairs kortste paden Na preprocessen: optimale afstand in O(1) tijd bekend Opslaan van alle paden kost O(n2) geheugen Niet haalbaar op mobiele apparaten 20-11-2018 Bart Jansen
Ontwerpdoelen Snelheidswinst voor queries Geheugengebruik moet praktisch blijven (linear) Exacte berekening van kortste paden, geen benaderingen Maak gebruik van de karakteristieken van wegennetwerken Hierarchische structuur; sommige wegen zijn belangrijk, anderen niet Netwerken zijn dunne grafen: m is Θ(n) 20-11-2018 Bart Jansen
Dijkstra’s algoritme Query vanaf een startpunt s Houd een afstands bovengrens d[v] bij voor iedere knoop v Status voor iedere knoop: voorlopig of definitief Aan het begin: d[v] = ∞, voor alle v ≠ s d[s] = 0 Alle knopen zijn voorlopig Herhaal: Kies voorlopige knoop v met laagste d[v] waarde Maak v definitief Relaxeer uitgaande kanten (v,u) naar voorlopige knopen d[u] min (d[u]), d[v] + w[u] ) 20-11-2018 Bart Jansen
Eigenschappen van Dijkstra Invariant: als v definitief wordt, is d[v] de lengte van een kortste s-v pad Algoritme kan stoppen als t definitief wordt gemaakt Implementatie met een priority queue om efficient te bepalen welke voorlopige knoop definitief moet worden 20-11-2018 Bart Jansen
Dijkstra: Wolk van definitieve knopen Knopen worden definitief in volgorde van oplopende afstand Algoritme maakt een wolk van definitieve knopen rondom het startpunt Terminatie als de wolk het eindpunt raakt Tijd die wordt gebruikt afhankelijk van hoeveelheid knopen waar naar gerelaxeerd wordt (“ontdekte knopen”) 20-11-2018 Bart Jansen
Bi-directioneel zoeken Zoek in 2 richtingen Voorwaarts vanaf s Achterwaarts vanaf t Stop met zoeken zodra 1 knoop van beide kanten definitief is Oppervlakte van twee wolken r=(d/2) kleiner dan een schijf r=d Geeft ongeveer een factor 2 snelheidswinst s t s t 20-11-2018 Bart Jansen
Uni- vs. bi-directioneel zoeken Achterwaarts Voorwaarts s 20-11-2018 Bart Jansen
Een heuristiek voor route planning Voor route planning van s naar t: Bepaal snelweg oprit s’ dichtbij s Bepaal snelweg afrit t’ dichtbij t Rest van de query in drie delen Eerst een kortste pad s s’ naar de oprit Dan een kortste pad s’ t’ over de snelweg Tot slot een pad t’ t van de afrit naar je doel Waarom is dit sneller? Oprit en afrit zijn dichtbij het start- en eindpunt – worden dus snel bereikt door Dijkstra’s algoritme Het netwerk van snelwegen is relatief klein, dus zoeken naar paden over snelwegen is veel sneller omdat er minder wegen hoeven worden getest 20-11-2018 Bart Jansen
Verfijning van de heuristiek Uitbreidbaar naar meerdere typen wegen Kies een categorie op basis van de afstand tot s en t Kwaliteit van de gevonden routes hangt af van de wegen classificatie (handmatig bijstellen!) Dit is gebruikt in route planners voor auto’s 20-11-2018 Bart Jansen
Highway hierarchies Dominik Schultes & Peter Sanders, University of Karlsruhe Eerste versie gemaakt in 2005 Technieken ervan zijn gebruikt voor het winnen van de 9e DIMACS implementatie challenge (2006) 20-11-2018 Bart Jansen
Kenmerken van snelweg hiërarchieën Slim preprocessen om een classificatie van wegen te verkrijgen Zoekopdrachten worden op dezelfde manier uitgevoerd als door de heuristiek Minder belangrijke wegen zijn niet relevant als je ver weg bent van je start en eind Zoeken met een bidirectionele versie van Dijkstra’s algoritme De zorgvuldige classificatie verzekert optimaliteit 20-11-2018 Bart Jansen
Definitie van snelweg hiërarchieën Snelweg hiërarchie voor graaf G bestaat uit niveaus N0, N1, .. , NL voor bepaalde L Elk niveau Nl heeft een snelweg netwerk Gl en een kern netwerk G’l Inductieve definitie: G0 = G’0 = G Snelweg netwerk Gl+1 afgeleid van kern G’l Kern G’l afgeleid van snelweg netwerk Gl Transformatie van kern l naar snelweg netwerk l+1: verwijder kanten Transformatie van snelweg netwerk l naar kern l: verwijder knopen (toevoegen shortcuts) 20-11-2018 Bart Jansen
Snelweg netwerk Gl+1 = (Vl+1, El+1) Afgeleid van kern G’l = (V’l, E’l) Kies een buurt-straal rl(u) voor iedere knoop u op niveau l Voorwaarts-buurt van knoop u bevat alle knopen met afstand ≤ rl(u) vanaf u Achterwaarts-buurt van knoop u bevat alle knopen met afstand ≤ rl(u) naar u Een kant (u,v) uit E’l zit alleen in het snelweg netwerk als er een kortste pad is <s,..,u,v,..,t> tussen 2 willekeurige knopen in V’l zodat: v niet in de voorwaarts-buurt van s zit u niet in de achterwaarts-buurt van t zit Knopen zonder aangrenzende kanten worden verwijderd In de praktijk: kies een buurt-straal zodat de buurten een bepaalde grootte krijgen 20-11-2018 Bart Jansen
Voorbeeld van snelweg kanten Een kant (u,v) uit E’l zit alleen in het snelweg netwerk als er een kortste pad is <s , .. , u, v, .., t> tussen 2 willekeurige knopen in V’l zodat: v niet in de voorwaarts-buurt van s zit u niet in de achterwaarts-buurt van t zit 6 2 1 3 5 7 8 4 20-11-2018 Bart Jansen
Voorbeeld van snelweg kanten Kortste pad <2, 3, 4> Alle knopen liggen zowel in de voorwaarts- als in de achterwaarts buurten van s=2 en t=4 Dus geen snelweg kanten 6 2 1 3 5 7 8 4 20-11-2018 Bart Jansen
Voorbeeld van snelweg kanten Kortste pad <1, 3, 5, 7> Kijk naar kant <3, 5> Knoop 5 ligt niet in de voorwaarts-buurt van 1 Knoop 3 ligt niet in de achterwaarts-buurt van 7 Dus kant <3,5> is een snelweg kant! 6 2 1 3 5 7 8 4 20-11-2018 Bart Jansen
Voorbeeld van snelweg kanten Kortste pad <1, 3, 5, 7> Kijk naar kant <3, 5> Knoop 5 ligt niet in de voorwaarts-buurt van 1 Knoop 3 ligt niet in de achterwaarts-buurt van 7 Dus kant <3,5> is een snelweg kant! 6 2 1 3 5 7 8 4 20-11-2018 Bart Jansen
Voorbeeld van snelweg kanten Kortste pad <1, 3, 5, 7> Kijk naar kant <3, 5> Knoop 5 ligt niet in de voorwaarts-buurt van 1 Knoop 3 ligt niet in de achterwaarts-buurt van 7 Dus kant <3,5> is een snelweg kant! 3 5 20-11-2018 Bart Jansen
Algoritme voor selecteren snelweg kanten Doe voor iedere knoop u: Voer Dijkstra uit met knoop u als startpunt, en houd alle kortste paden (via predecessor waarden) bij Bij meerdere paden met minimum kosten, worden deze dus allemaal bewaard (een knoop heeft meerdere predecessors) Stop Dijkstra zodra de knopen aan een stopcriterium voldoen Evalueer de kortste paden om snelweg kanten te vinden Het stopcriterium is heel belangrijk! Dit voorkomt dat iedere keer de hele graaf doorzocht wordt Preprocessen voor heel West-Europa kan in 16 minuten Het idee achter het stop criterium: Stop met zoeken vanuit u zodra we zeker weten dat alle snelweg kanten die nog niet gevonden zijn, wel gevonden moeten worden bij het zoeken vanuit een andere knoop (“delegeer” de rest van het werk aan de Dijkstra opdrachten vanuit andere knopen) 20-11-2018 Bart Jansen
Het overzicht Snelweg hierarchie bestaat uit L niveaus Ieder niveau l bevat 2 grafen: een snelweg netwerk Gl en een kern G’l We hebben net gezien hoe het snelweg netwerk Gl ontstaat uit de kern G’l-1 Snelweg netwerk ontstaat door het verwijderen van kanten Nu: hoe de kern G’l ontstaat uit het snelweg netwerk Gl (verwijderen van knopen) 20-11-2018 Bart Jansen
De kern (G’l = V’l, E’l) Afgeleid van snelweg netwerk Gl = (Vl, El) Bepaal een verzameling Ol Vl overbodige knopen Alle knopen uit Vl die niet overbodig zijn, komen in de kern V’l Alle kanten uit El tussen knopen die niet overbodig zijn, worden overgenomen En we voegen extra kanten als shortcuts toe Als er een u-v pad bestaat dat (op u en v na) helemaal bestaat uit overbodige knopen, voegen we een directe kant toe van u naar v Gewicht van de shortcut-kant wordt gelijk aan de lengte van het pad 20-11-2018 Bart Jansen
Voorbeeld van shortcuts Als er een u-v pad bestaat dat (op u en v na) helemaal bestaat uit overbodige knopen, voegen we een directe kant toe van u naar v Kies Ol = {1, 2} 1 2 20-11-2018 Bart Jansen
Voorbeeld van shortcuts Als er een u-v pad bestaat dat (op u en v na) helemaal bestaat uit overbodige knopen, voegen we een directe kant toe van u naar v Kies Ol = {1, 2} 1 2 20-11-2018 Bart Jansen
Voorbeeld van shortcuts Als er een u-v pad bestaat dat (op u en v na) helemaal bestaat uit overbodige knopen, voegen we een directe kant toe van u naar v Kies Ol = {1, 2} 20-11-2018 Bart Jansen
Details van reductie tot de kern Kortste paden tussen knopen in de kern blijven behouden Herinner dat G0 = G’0 = G Het 0e niveau bevat alle knopen De voorwaartse en achterwaartste zoekopdrachten starten in niveau 0 Query algoritme zorgt voor correctheid voor hogere niveaus Knoop u is overbodig als: # shortcuts ≤ c (graadin(u) + graaduit(u)) Verzekert dat |E’l| is O(|Vl| + |El|) als c < 2 Simpel iteratief algoritme met een stack volstaat voor vinden van overbodige knopen 20-11-2018 Bart Jansen
Samenvatting van constructie stappen Afwisselen tussen reduceren van kanten, en reduceren van knopen In ieder niveau dalen |V| en |E| ruw weg met een constante factor Geobserveerd tijdens experimenten Constructie kan efficient gedaan worden Geheugengebruik is beperkt tot O(L) extra informatie per knoop of kant Buurt grootte, niveaus waarin het object voorkomt, of de knoop overbodig is 20-11-2018 Bart Jansen
Zoeken in een snelweg hiërarchie Beschouw een s-t query De query start in niveau 0 Bezoek alle knopen in de voortwaarts buurt van s, en achterwaarts buurt van t Kijk naar een kant (u,v) zodat v buiten de voorwaarts-buurt van s ligt, en u buiten de achterwaarts-buurt van t Als (u,v) geen snelweg kant is, dan ligt hij niet op een kortste s-t pad (via definitie van de snelweg) Dus buiten de buurten van s en t zijn alleen snelweg kanten relevant Andere kanten hoeven niet te worden gerelaxeerd 20-11-2018 Bart Jansen
Zoeken - vervolgd Beschouw de eerste knoop u die definitief wordt, en die buiten de buurt van s ligt Stel dat er een kortste s-t pad P is, dat u bevat Dus P = <s, .. , u , .. , t > Het subpad <u , .. , t> moet een kortste pad zijn, en moet (buiten de buurt van t) alleen snelweg-kanten bevatten Pas hetzelfde idee opnieuw toe, en zoek verder naar een u-t path in G1 Gebruik de buurt van u en het snelweg netwerk om dit zoeken te versnellen 20-11-2018 Bart Jansen
Queries in de praktijk In de praktijk: meerdere gelijktijdige zoekfronten, op verschillende niveaus Ieder zoekfront zit als entry in de priority queue van het Dijkstra algoritme Een key voor knoop u bevat: een afstands label d(s,u) (zoals normaal) het niveau van dat zoekfront het gat van het zoekfront: de afstand tot de rand van de buurt Query algoritme gebruikt classificatie van kanten voor versnelling, en classificatie van overbodige knopen Details zijn complex 20-11-2018 Bart Jansen
Terminatie criterium In normaal bi-directioneel zoeken, stoppen we zodra 1 knoop van beide kanten definitief is Dit werkt niet meer in een snelweg hiërarchie Zoekfronten kunnen in verschillende niveaus bezig zijn, en elkaar missen Simpele oplossing Zodra een knoop van 2 kanten definitief is, kennen we een (mogelijk niet optimaal) s-t pad Stop met het behandelen van knopen als die een afstand hebben die groter is dan de lengte van het bekende pad Dit is correct omdat de afstands-waarden monotoon stijgen Blijkt erg goed te werken; minder dan 1% van de zoekruimte bestaat uit knopen die zijn behandeld nadat de 2 zoekfronten elkaar hebben gevonden 20-11-2018 Bart Jansen
Voorbeeld van een query Voorbeeld van een query nabij Karlsruhe Verschillende niveaus in verschillende kleuren 20-11-2018 Bart Jansen
20-11-2018 Bart Jansen
20-11-2018 Bart Jansen
20-11-2018 Bart Jansen
20-11-2018 Bart Jansen
20-11-2018 Bart Jansen
20-11-2018 Bart Jansen
20-11-2018 Bart Jansen
Experimentele evaluatie Netwerk van West-Europa (n = 18 * 106, m = 23 * 106) Preprocessen in 16 minuten 27 bytes geheugen per knoop Totaal 486 MB geheugen gebruik Query tijden zijn gemeten voor random gekozen paren knopen Gemiddelde versnelling ivm. Dijkstra: factor 4002 Enkele milliseconden per query 20-11-2018 Bart Jansen
Voor- en nadelen Voordelen Nadelen Snel preprocessen Weinig extra geheugen nodig Goede versnelling (4002 x) Kan worden gecombineerd met doel-gericht zoeken (8320 x) Simpel concept Nadelen Statische hiërarchie die niet inspeelt op wijzigingen (aanpassen van de graaf of gewichtsfunctie) Er zijn snellere methoden (versnelling > 1 000 000 x) 20-11-2018 Bart Jansen
Conclusie Snelweg hiërarchieën reduceren de graaf recursief Knoop reductie (shortcuts) Kant reductie (snelweg kanten) Query gebaseerd op bidirectionele versie van Dijkstra’s algoritme Kan worden geimplementeerd met beperkt geheugengebruik Orden van grootte sneller dan Dijkstra 20-11-2018 Bart Jansen
Correctheid van bi-directioneel zoeken Stel er is een knoop u van beide kanten definitief Claim: er is een kortste pad over over die allemaal van minstens 1 kant definitief zijn Bewijs: Stel er is een knoop v op een s-t pad, van beide kanten niet definitief d[s,u] ≤ d [s,v] (want u is eerder definitief van s) d[u,t] ≤ d [v,t] (want u is eerder definitief naar t) d[s,u] + d [u,t] ≤ d [s,v] + d [v,t] Dus het pad over u is minstens zo kort als een pad over v 20-11-2018 Bart Jansen