Vyhledávací algoritmus D*

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 25. září 2021; ověření vyžaduje 1 úpravu .

Vyhledávací algoritmus D* (vyslovuje se "De Star" ) je kterýkoli ze tří souvisejících přírůstkových vyhledávacích algoritmů :

Všechny tři vyhledávací algoritmy řeší stejné problémy s předpoklady plánování cesty , včetně plánování s předpoklady volného prostoru [7] , kdy musí robot navigovat na dané cílové souřadnice v neznámém terénu. Vytváří předpoklady o neznámé části terénu (např. že na něm nejsou žádné překážky) a za těchto předpokladů najde nejkratší cestu ze svých aktuálních souřadnic k souřadnicím cíle. Robot pak sleduje cestu. Když na mapě zpozoruje nové informace (například dosud neznámé překážky), doplní si tyto informace do své mapy a v případě potřeby přeplánuje novou nejkratší cestu z aktuálních souřadnic na zadané cílové souřadnice. Opakuje proces, dokud nedosáhne cílových souřadnic nebo nezjistí, že cílové souřadnice nelze dosáhnout. Při přejezdu neznámým terénem lze často objevit nové překážky, takže toto přeplánování musí být rychlé. Inkrementální (heuristické) vyhledávací algoritmy urychlují vyhledávání sekvencí podobných vyhledávacích problémů a využívají zkušenosti z řešení předchozích problémů k urychlení vyhledávání aktuálního. Za předpokladu, že se cílové souřadnice nemění, jsou všechny tři vyhledávací algoritmy efektivnější než opakované A* vyhledávání .

D* a jeho varianty byly široce používány pro mobilní roboty a autonomní navigační vozidla . Moderní systémy jsou obvykle založeny na lehkých , spíše než na původním nebo zaměřeném D* . Ve skutečnosti dokonce i Stenzova laboratoř v některých implementacích používá spíše odlehčenou konstrukci než původní D* [8] . Mezi takové navigační systémy patří prototyp systému testovaný na Mars roverech Opportunity a Spirit a navigační systém vítěze DARPA Urban Challenge , oba vyvinuté na Carnegie Mellon University .

Původní D* byl představen v roce 1994 Anthonym Stentzem . Název D* pochází z výrazu „ Dynamic A * “ , protože algoritmus se chová jako A * [ 2] , kromě toho, že cena oblouku se může během běhu algoritmu měnit .

Operace

Hlavní operace D* jsou popsány níže.

Stejně jako Dijkstrův algoritmus a A * udržuje D* seznam uzlů k vyhodnocení, známý jako OPEN list . Uzly jsou označeny jako mající jeden z několika stavů:

Rozšíření

Algoritmus funguje tak, že iterativně vybere uzel ze seznamu OPEN a vyhodnotí jej. Poté šíří změny uzlu do všech sousedních uzlů a umístí je do seznamu OPEN . Tento distribuční proces se nazývá „expanze“ . Na rozdíl od kanonické A* , která sleduje cestu od začátku do konce, D* začne hledat zpětně od cílového uzlu. Každý rozšířený uzel má zpětný ukazatel, který odkazuje na další uzel vedoucí k cíli, a každý uzel zná přesné náklady na cíl. Když je počáteční uzel dalším uzlem, který se rozšíří, algoritmus je hotov a cestu k cíli lze najít jednoduchým sledováním zpětných značek.

Překonávání překážek

Když je na dané cestě nalezena překážka, všechny dotčené body jsou opět umístěny na seznam OPEN , tentokrát označený UP . Před zvýšením nákladů na uzel BOOSTER však algoritmus zkontroluje své sousedy a prozkoumá, zda může snížit náklady na uzel. V opačném případě se stav UP šíří na všechny potomky uzlů, tj. na uzly, které mají zpětné ukazatele. Tyto uzly jsou poté vyhodnoceny a je přenášen stav UP , tvořící vlnu. Když lze zmenšit uzel UP , jeho backpointer se aktualizuje a předá stav DOWN svým sousedům. Tyto vlny NAHORU a DOLŮ jsou srdcem D* .

V tomto bodě se vlny nemohou dotknout řady dalších bodů. Algoritmus tedy pracoval pouze s body, které jsou ovlivněny změnou hodnoty.

Další slepá ulička

Tentokrát je nemožné prolomit patovou situaci tak elegantně. Žádný z bodů nemůže najít novou trasu přes souseda do cíle. Takže dál propagují své uznání. Mimo kanál můžete najít pouze body, které mohou vést k cíli podél schůdné trasy. Takto se vyvíjejí dvě vlny BOTTOM , které se rozšíří do bodů označených jako nedosažitelné s novými informacemi o trase.

Pseudokód

while ( ! openList . isEmpty ()) { point = openList . getFirst (); rozšířit ( bod ); }

Rozbalit

void expand ( currentPoint ) { boolean isRaise = isRaise ( currentPoint ); dvojité náklady ; pro každého ( soused v aktuálnímbodu . getNeighbors ()) { if ( isRaise ) { if ( soused . nextPoint == currentPoint ) { sousední . setNextPointAndUpdateCost ( currentPoint ); openList . přidat ( soused ); } else { cena = soused . vypočítatCostVia ( currentPoint ); if ( cena < soused . getCost ()) { currentPoint . setMinimumCostToCurrentCost (); openList . přidat ( aktuální bod ); } } } else { cena = soused . vypočítatCostVia ( currentPoint ); if ( cena < soused . getCost ()) { soused . setNextPointAndUpdateCost ( currentPoint ); openList . přidat ( soused ); } } } }

Zkontrolujte zdvih

boolean isRaise ( bod ) { double cost ; if ( point . getCurrentCost () > point . getMinimumCost ()) { for every ( soused in point . getNeighbors ()) { cost = point . vypočítatCostVia ( soused ); if ( cena < bod . getCurrentCost ()) { bod . setNextPointAndUpdateCost ( soused ); } } } návratový bod . getCurrentCost () > bod . getMinimumCost (); }

Možnosti

Zaostřeno D*

Jak název napovídá, focus D* je rozšířením D* , které využívá heuristiku k zaměření šíření UP a DOWN ve směru robota. Aktualizují se tedy pouze důležité stavy, stejně jako A* počítá pouze náklady pro některé uzly.

Lehký D*

Lightweight D* není založen na původním nebo zaměřeném D* , ale implementuje stejné chování. Je to snazší na pochopení a lze to provést na méně řádcích kódu, proto název Lightweight D* . Funguje stejně dobře jako soustředěný D* . Lightweight D* je založen na LPA* [5] , kterou představili König a Likhachev o několik let dříve. Světlé D*

Minimální náklady ve srovnání se současnými náklady

Pro D* je důležité rozlišovat mezi běžnými a minimálními náklady. První jsou důležité pouze při sběru, zatímco druhé jsou rozhodující, protože třídí seznam OPEN . Funkce, která vrací minimální cenu, je vždy nejnižší cenou pro aktuální bod, protože je to první položka v seznamu OPEN .

Poznámky

  1. Anthony Stentz (1994). „ Optimální a efektivní plánování cesty pro částečně známá prostředí “. Sborník příspěvků z mezinárodní konference o robotice a automatizaci : 3310-3317. CiteSeerX  10.1.1.15.3683 .
  2. 1 2 E. Stentz (1995). “ Algoritmus zaměřený D* pro přeplánování v reálném čase “. Sborník příspěvků z mezinárodní společné konference o umělé inteligenci : 1652-1659. CiteSeerX  10.1.1.41.8257 .
  3. Peter Elliot Hart, Niels John Nilsson, Bertram Raphael (1968). " Formální rámec pro heuristické stanovení tras minimálních nákladů ." IEEE Transactions on Systems Science and Kybernetika . SSC-4(2): 100-107. DOI : 10.1109/TSSC.1968.300136 .
  4. Sven Koenig, Maxim Lichačev (2005). „ Rychlé přeplánování navigace v neznámé oblasti “. Transakce v robotice . 21 (3): 354-363. CiteSeerX  10.1.1.65.5979 . DOI : 10.1109/tro.2004.838026 .
  5. 1 2 Sven Koenig, Maxim Likhachev, David Fursey (2004). „ Celoživotní plánování A* “. Umělá inteligence . 155 (1-2): 93-146. DOI : 10.1016/j.artint.2003.12.001 .
  6. G. Ramalingam, Thomas W. Reps (1996). „ Inkrementální algoritmus pro zobecnění problému hledání nejkratší cesty “. Journal of Algorithms . 21 (2): 267-305. CiteSeerX  10.1.1.3.7926 . DOI : 10.1006/jagm.1996.0046 .
  7. Sven Koenig, Yuri Smirnov, Craig Tovey (2003). „ Hranice výkonnosti pro plánování v neznámém terénu “. Umělá inteligence . 147 (1-2): 253-279. DOI : 10.1016/s0004-3702(03)00062-6 .
  8. D. Dřevěná (2006).Plánování cest pro mobilní roboty založené na grafu(teze). Gruzínský technologický institut .

Odkazy