Theta*
Theta* är en vägplaneringsalgoritm för valfri vinkel som är baserad på A*-sökalgoritmen . Den kan hitta nästan optimala banor med körtider som är jämförbara med A*.
Beskrivning
För den enklaste versionen av Theta* är huvudslingan ungefär densamma som A*. Den enda skillnaden är funktionen. Jämfört med A* behöver inte föräldern till en nod i Theta* vara en granne till noden så länge det finns en siktlinje mellan de två noderna. [ citat behövs ]
Pseudokod
Anpassad från.
0
funktion theta * ( start , mål ) // Denna huvudslinga är densamma som A* gScore ( start ) := förälder ( start ) := start // Initiering av öppna och slutna set. Den öppna uppsättningen initieras // med startnoden och en initial kostnad öppen := {} öppen . infoga ( start , gScore ( start ) + heuristic ( start )) // gScore(nod) är det aktuella kortaste avståndet från startnoden till noden // heuristic(nod) är det uppskattade avståndet för noden från målnoden // där finns många alternativ för heuristiken som euklidisk eller Manhattan stängd := {} medan öppen inte är tom s := öppen . pop ( ) om s = målretur reconstruct_path ( s ) closed . push ( s ) för varje granne till s // Slinga genom varje omedelbar granne till s om granne inte är stängd om granne inte är öppen // Initiera värden för granne om det // inte redan finns i den öppna listan gScore ( granne ) : = oändligt förälder ( granne ) := Null uppdatering_vertex ( s , granne ) returnerar Null funktion update_vertex ( s , granne ) // Den här delen av algoritmen är den huvudsakliga skillnaden mellan A* och Theta * om linje_of_sight ( förälder , granne ) ) // Om det finns en siktlinje mellan förälder(ar) och granne // ignorera sedan s och använd sökvägen från förälder(ar) till granne om gScore ( förälder ( s )) + c ( parent ( s ) , granne ) < gScore ( granne ) // c(s, granne) är det euklidiska avståndet från s till granne gScore ( granne ) := gPoäng ( förälder ( ar )) + c ( förälder ( ar ) , granne ) förälder ( granne ) := förälder ( er ) om granne i öppet öppet . ta bort ( granne ) öppna . infoga ( granne , gScore ( granne ) + heuristisk ( granne )) else // Om längden på vägen från start till s och från s till // granne är kortare än det kortaste för närvarande kända avståndet // från start till granne, då uppdatera noden med det nya avståndet om gScore ( s ) + c ( s , granne ) < gScore ( granne ) gScore ( granne ) := gScore ( s ) + c ( s , granne ) förälder ( granne ) := s om granne i öppen öppen . ta bort ( granne ) öppna . infoga ( granne , gScore ( granne ) + heuristisk ( granne )) funktion reconstruct_path ( s ) total_path = {s} // Detta kommer rekursivt att rekonstruera sökvägen från målnoden // tills startnoden nås om förälder ( ar ) ! = s total_sökväg . push ( reconstruct_path ( parent ( s ))) annars returnerar total_path
Varianter
Följande varianter av algoritmen finns: [ citat behövs ]
- Lazy Theta* – Nodexpansionerna är försenade, vilket resulterar i färre siktlinjekontroller
- Incremental Phi* – En modifiering av Theta* som möjliggör dynamisk vägplanering liknande D*