Univerzita Karlova v Praze Matematicko-fyzik´aln´ı fakulta
´ RSK ˇ ´ PRACE ´ BAKALA A
Luk´aˇs Bajer Pohyb v projektu ENTI Katedra software a v´ yuky informatiky
Vedouc´ı bakal´aˇrsk´e pr´ace: Mgr. Cyril Brom Studijn´ı program: Informatika, Programov´an´ı
2007
Velk´ y d´ık za veden´ı pr´ace, podnˇetn´e pˇripom´ınky i trpˇelivost patˇr´ı Mgr. Cyrilu Bromovi. Za pomoc pˇri ˇreˇsen´ı poˇc´ateˇcn´ıch probl´em˚ u v orientaci ve vnitˇrnostech projektu ENTI bych r´ad podˇekoval i RNDr. Ondˇreji Bojarovi a Mgr. Milanu Hlad´ıkovi. Tˇret´ı podˇekov´an´ı pak smˇeˇruje knihovnick´emu person´alu Mˇestsk´e knihovny v Nov´em Boru, d´ıky jehoˇz ochotˇe vznikla nemal´a ˇc´ast t´eto pr´ace i v ˇcervenci 2007.
Prohlaˇsuji, ˇze jsem svou bakal´aˇrskou pr´aci napsal samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. Souhlas´ım se zap˚ ujˇcov´an´ım pr´ace a jej´ım zveˇrejˇ nov´an´ım. V Praze dne 10. srpna 2007
Luk´aˇs Bajer
2
Obsah ´ 1 Uvod
6
1.1
C´ıl pr´ace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
1.2
Struktura dokumentu . . . . . . . . . . . . . . . . . . . . . . . . .
7
2 Algoritmy pro pathfinding
9
2.1
Algoritmus A* . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.2
Hierarchical Pathfinding A* . . . . . . . . . . . . . . . . . . . . .
11
2.3
Partial-Refinement A* . . . . . . . . . . . . . . . . . . . . . . . .
13
2.4
Dalˇs´ı metody . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3 Projekt ENTI
17
3.1
Struktura projektu ENTI . . . . . . . . . . . . . . . . . . . . . . .
17
3.2
Svˇet ent˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
3.3
Programov´an´ı ent˚ u . . . . . . . . . . . . . . . . . . . . . . . . . .
19
3.4
Pohybov´e skripty . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
4 Pouˇ zit´ e postupy a algoritmy
22
4.1
Hierarchick´e hled´an´ı cest . . . . . . . . . . . . . . . . . . . . . . .
22
4.2
Bagrov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
4.3
Pron´asledov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
4.4
Vyh´ yb´an´ı se ostatn´ım ent˚ um . . . . . . . . . . . . . . . . . . . . .
30
4.5
On-line hled´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
3
5 Implementace a modelov´ e situace
32
5.1
Hierarchick´e hled´an´ı cest . . . . . . . . . . . . . . . . . . . . . . .
32
5.2
Bagrov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
5.3
Pron´asledov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
5.4
Vyh´ yb´an´ı se ostatn´ım ent˚ um . . . . . . . . . . . . . . . . . . . . .
39
5.5
On-line hled´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
6 Z´ avˇ er
41
6.1
Budouc´ı pr´ace . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
6.2
Dalˇs´ı aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
6.3
Shrnut´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
Literatura
45
Pˇ r´ıloha: Obsah CD
47
4
N´azev pr´ace: Pohyb v projektu ENTI Autor: Luk´aˇs Bajer Katedra (´ ustav): Katedra software a v´ yuky informatiky Vedouc´ı bakal´aˇrsk´e pr´ace: Mgr. Cyril Brom e-mail vedouc´ıho:
[email protected] Abstrakt: Projekt ENTI je simul´ator prostˇred´ı, kter´e je podobn´e lidsk´emu svˇetu. ˇ ı v nˇem autonomn´ı agenti naz´ Zij´ yvan´ı enti, kteˇr´ı se o svˇet staraj´ı. K naplˇ nov´an´ı sv´ ych u ´kol˚ u a ˇzivotn´ıch potˇreb potˇrebuj´ı ˇcasto hledat po sv´em svˇetˇe cestu. Tato pr´ace je zamˇeˇrena na skripty, kter´e toto hled´an´ı a n´asledn´e proch´azen´ı cest ˇr´ıd´ı. Pohyb ent˚ u mezi m´ıstnostmi vylepˇsuje hierarchickou verz´ı algoritmu A*, ˇc´ımˇz sniˇzuje n´aroky na procesor pˇri hled´an´ı delˇs´ıch cest. D´ale pak rozˇsiˇruje skripty pro pohyb po m´ıstnosti, sledov´an´ı a vyh´ yb´an´ı se ciz´ım ent˚ um a hled´an´ı pˇredmˇet˚ u. Kl´ıˇcov´a slova: umˇel´a inteligence, hled´an´ı cest, grafov´e algoritmy, hierarchick´ y A*
Title: Movement in The Ents Project Author: Luk´aˇs Bajer Department: Department of Software and Computer Science Education Supervisor: Mgr. Cyril Brom Supervisor’s e-mail address:
[email protected] Abstract: The ENTS project is a simulator of an environment which is similar to our common world. In this environment, there live autonomous agents called ents. They take care of their world. To fulfil their goals and satisfy their daily needs, they often have to look for a path around the world. This work is focused on scripts which are responsible for this pathfinding. The ents’ movements are improved by hierarchical version of the A* algorithm. Thanks to this, demands on CPU during looking for longer paths are considerably decreased. In addition, ents’ scripts are enhanced by better movement around a room, other ents following and avoiding, and “lazy” picking up objects. Keywords: artificial intelligence, pathfinding, graph algorithms, hierarchical A*
5
Kapitola 1 ´ Uvod Snahy napodobit nebo modelovat lidsk´e myˇslen´ı existuj´ı jiˇz pomˇernˇe dlouho. Praktick´e realizace vznikaly nejprve jen pomoc´ı podvod˚ u (napˇr´ıklad zn´am´ y ˇsachov´ y automat Wolfganga Kempelena [13]) nebo v d´ılech liter´arn´ıch autor˚ u (viz napˇr. [3]), ale ve druh´e p˚ uli dvac´at´eho stolet´ı jiˇz technick´e podm´ınky umoˇznily tento obor rozvinout i ve skuteˇcnosti. Postupnˇe se rod´ı poˇc´ıtaˇcov´e programy, kter´e jsou schopny se na z´akladˇe sloˇzitˇejˇs´ıch vstupn´ıch informac´ı samy rozhodovat. S rostouc´ı v´ ypoˇcetn´ı silou poˇc´ıtaˇc˚ u lze konstruovat sloˇzitˇejˇs´ı a propracovanˇejˇs´ı rozhodovac´ı syst´emy a autonomn´ı agenti, jak se tyto programy naz´ yvaj´ı, nach´azej´ı uplatnˇen´ı nejen ve vˇedeck´ ych laboratoˇr´ıch, ale i v pr˚ umyslu nebo z´abavˇe. Projekt ENTI je pˇr´ıkladem platformy pro pr´aci s autonomn´ımi agenty. I kdyˇz n´as projekt po spuˇstˇen´ı pˇriv´ıt´a pˇekn´ ym uˇzivatelsk´ ym rozhran´ım, patˇr´ı sp´ıˇse k projekt˚ um vˇedeck´ ym. Je to diskr´etn´ı kolov´a simulace, kter´a si klade za c´ıl zjistit, do jak´e m´ıry a za jakou cenu lze simulovat prostˇred´ı podobn´e lidsk´emu svˇetu (v´ıce viz [1]). Ve zjednoduˇsen´em modelu rodinn´eho domku ˇzij´ı postavy, kter´e se naz´ yvaj´ı enti. Jsou ˇr´ızeni poˇc´ıtaˇcov´ ymi programy napsan´ ymi pˇrev´aˇznˇe ve speci´aln´ım jazyce E. Element´arn´ımi u ´koly, tzv atomick´ ymi instrukcemi1 , jsou schopni ovlivˇ novat svˇet kolem nich, ale umˇej´ı ˇreˇsit i komplexnˇejˇs´ı u ´lohy2 nebo obstar´avat sv´e ˇzivotn´ı potˇreby. Uˇzivatel do svˇeta vstupuje v roli jednoho z ent˚ u, kter´ y m´a stejn´a pr´ava i omezen´ı jako enti strojov´ı. M˚ uˇze tak stejnˇe jako ostatn´ı enti br´at pˇredmˇety, zav´ırat dveˇre nebo chodit na z´achod. Tento druh pr´ace nebo z´abavy by n´as 1 2
napˇr. udˇelej krok, otevˇri dveˇre, seber pˇredmˇet pˇred sebou napˇr. zalej kvˇetiny na zahradˇe
6
ale pravdˇepodobnˇe po ˇcase pˇrestal bavit. Moˇznosti projektu vˇsak t´ımto nekonˇc´ı: zkuˇsenˇejˇs´ı uˇzivatel´e mohou vytv´aˇret sv´e vlastn´ı skripty, podle kter´ ych se pak budou jejich enti chovat.
1.1
C´ıl pr´ ace
Autor˚ um nov´ ych ent˚ u se nab´ız´ı pomˇernˇe ˇsirok´a nab´ıdka pˇredpˇripraven´ ych funkc´ı a skript˚ u, kter´e mohou pouˇz´ıt. Tato pr´ace se zab´ yv´a skripty, kter´e souvis´ı s jejich pohybem. Vylepˇsuje a opravuje nˇekter´e st´avaj´ıc´ı a doplˇ nuje nov´e. Konkr´etn´ı c´ıle jsou n´asleduj´ıc´ı: ˇ v projektu ENTI bˇeˇz´ı po kolech, Zrychlen´ı prohled´ avac´ıch algoritm˚ u. Cas kter´a trvaj´ı, dokud vˇsichni enti nepoˇslou atomickou instrukci. Na v´ ypoˇcty tedy maj´ı enti ˇcasu teoreticky neomezenˇe, uˇzivatel ho vˇsak vn´ım´a. Prvn´ım c´ılem je zmenˇsen´ı ˇcasov´e n´aroˇcnosti prohled´av´an´ı mezi r˚ uzn´ ymi m´ıstnostmi aplikac´ı hierarchick´e formy algoritmu A*. Vˇ erohodnˇ ejˇ s´ı chov´ an´ı ent˚ u. Pohyb ent˚ u se v nˇekter´ ych pˇr´ıpadech znaˇcnˇe liˇs´ı od toho, jak by se chovali lid´e. Druh´ ym c´ılem je nˇekter´e nedostatky odstranit, konkr´etnˇe nauˇcit“ enty proj´ıt zatarasenou cestou (tzv. bagrovat“), ” ” l´epe pron´asledovat a vyh´ ybat se ostatn´ım ent˚ um a hledat pˇredmˇety i pˇri jin´ ych ˇcinnostech.
1.2
Struktura dokumentu
Pr´ace je rozdˇelena do sedmi kapitol. Prvn´ı z nich pr´avˇe ˇctete. Uv´ad´ı do probl´emu a vytyˇcuje z´akladn´ı c´ıle, kter´ ych pr´ace dos´ahla. V kapitole 2 najdete struˇcn´ y a ponˇekud teoretick´ y popis algoritm˚ u pro hled´an´ı cest, mezi kter´ ymi jsme pˇred jejich implementac´ı volili. Kapitola 3 hloubˇeji popisuje projekt ENTI, zejm´ena pak vlastnosti a specifika, kter´e bylo nutn´e vz´ıt v u ´vahu pˇri v´ ybˇeru algoritm˚ u i bˇehem jejich aplikace. Kapitola 4 je vedle softwarov´eho d´ıla vlastn´ım j´adrem pr´ace, nebot’ nab´ız´ı popis konkr´etnˇe pouˇzit´ ych algoritm˚ u i s d˚ uvody, proˇc bylo nebo nebylo vhodn´e je pouˇz´ıt. Kapitola 5 je zamˇeˇrena pˇr´ımo na zmˇenˇen´e nebo nov´e skripty a nab´ız´ı bliˇzˇs´ı popis vlastn´ı implementace a jej´ıch probl´em˚ u, stejnˇe jako pˇr´ıklady jejich pouˇzit´ı. Kapitola 6 nab´ız´ı dalˇs´ı pokraˇcov´an´ı pr´ace, kr´atce diskutuje v´ yhody a nev´ yhody pouˇzit´ ych ˇreˇsen´ı a shrnuje dosaˇzen´e v´ ysledky. 7
Ned´ılnou souˇc´ast´ı pr´ace jsou kromˇe tohoto textu i zdrojov´e soubory, kter´ ymi je potˇreba pˇred kompilac´ı projektu ENTI nahradit soubory p˚ uvodn´ı. V´ıce viz Instalaˇcn´ı pˇr´ıruˇcka“ um´ıstˇen´a na pˇriloˇzen´em CD. ”
8
Kapitola 2 Algoritmy pro pathfinding Standardem dneˇsn´ıch algoritm˚ u na prohled´av´an´ı dlaˇzdicov´eho prostoru je jistˇe algoritmus A* [5]. Pro jedno nalezen´ı skuteˇcnˇe nejkratˇs´ı cesty je se spr´avnou heuristikou dokonce nejlepˇs´ı moˇzn´ y. Aby vˇsak ve sv´e klasick´e podobˇe naˇsel s jistotou cestu mezi startovn´ı a c´ılovou pozic´ı, mus´ı pˇri hled´an´ı zpracovat alespoˇ n vˇsechny dlaˇzdice na dan´e cestˇe, sp´ıˇse vˇsak (vlivem pˇrek´aˇzek) jeˇstˇe o pozn´an´ı v´ıce. To m˚ uˇze vyˇzadovat pˇr´ıliˇs mnoho ˇcasu a pamˇeti. Vznikly sice mnoh´e zrychlen´ı pouˇzit´ım lepˇs´ıch datov´ ych struktur nebo oˇrez´av´an´ım prohled´avan´eho stromu (viz napˇr. [7]), v´ yrazn´eho zlepˇsen´ı vˇsak dos´ahneme aˇz pouˇzit´ım nˇejak´eho systematick´eho pˇr´ıstupu. Po kr´atk´em nahl´ednut´ı do klasick´eho algoritmu A* se zamˇeˇr´ıme na metody, kter´e v´ ymˇenou za zaruˇcen´ı optimality ˇreˇsen´ı z´ıskaj´ı podstatn´e zrychlen´ı a zmenˇsen´ı pamˇet’ov´ ych n´arok˚ u. D´ale n´as budou zaj´ımat pouze algoritmy pracuj´ıc´ı nad dlaˇzdicov´ ymi mapami a naopak aˇz na v´ yjimky se nebudeme zab´ yvat technikami steeringov´ ymi (viz napˇr. [12]). V podstatˇe mimo n´aˇs z´ajem stoj´ı tak´e pˇr´ıstupy, kter´e zaˇc´ınaj´ı s dopˇredu nezn´am´ ym ter´enem a aˇz cestou zjiˇst’uj´ı topologii prostoru – enti znaj´ı design m´ıstnost´ı i pˇredmˇet˚ u v nich po startu dokonale, staˇc´ı pouze reagovat na zmˇeny. Tato kapitola si nebere za c´ıl pˇredv´est vyˇcerp´avaj´ıc´ı pˇrehled vˇsech algoritm˚ u a technik, kter´e spadaj´ı do vymezen´eho prostoru. Popisuje pouze ty, kter´e n´as nˇejak´ ym zp˚ usobem zaujaly a u kter´ ych se zd´alo, ˇze budou v dosti specifick´em prostˇred´ı neprocedur´aln´ıch jazyk˚ u projektu ENTI relativnˇe snadno implementovateln´e.
9
2.1
Algoritmus A*
A* patˇr´ı do skupiny algoritm˚ u, kter´e hledaj´ı optim´aln´ı cestu v ohodnocen´ ych grafech. Vyznaˇcuje se pouˇzit´ım heuristiky, kterou usmˇerˇ nuje hled´an´ı v nejslibnˇejˇs´ım smˇeru. Jeho jednoduchost o nˇem umoˇznila za urˇcit´ ych podm´ınek dok´azat vˇsechny podstatn´e vlastnosti jako spr´avnost, koneˇcnost nebo optimalitu. Algoritmus po kroc´ıch prohled´av´a zadan´ y graf. Zaˇc´ın´a startovn´ım vrcholem s, kter´ y oznaˇc´ı jako navˇst´ıven´y, tj. um´ıst´ı ho do seznamu open. V kaˇzd´em kroku jeden z navˇst´ıven´ ych vybere, prohl´as´ı za probran´y, tj. um´ıst´ı ho do seznamu closed, a zpracuje jeho sousedy. Algoritmus konˇc´ı v okamˇziku, kdy je do seznamu open um´ıstˇen c´ılov´ y vrchol c (pseudok´od viz obr´azek 2.1). Aby mohl algoritmus co nejrychleji nal´ezt nejkratˇs´ı cestu k c´ıli, mus´ı spr´avnˇe vybrat, kter´ y z vrchol˚ u v seznamu open v dan´em kole zpracovat. Algoritmus A* vyb´ır´a vrchol n, kter´ y m´a nejniˇzˇs´ı hodnotu ohodnocovac´ı funkce f (n). Jej´ı hodnota se spoˇc´ıt´a jako souˇcet f (n) = g(n) + h(n), kde • g(n) je nejkratˇs´ı vzd´alenost ze startovn´ıho vrcholu s do n pˇres doposud probran´e vrcholy a • h(n) oznaˇcuje odhad nejkratˇs´ı moˇzn´e vzd´alenosti z n do c´ılov´eho vrcholu c. Tento odhad nesm´ı b´ yt vˇetˇs´ı neˇz skuteˇcn´a nejkratˇs´ı vzd´alenost z n do c´ıle.
A*(start, c´ıl ) { pˇridej (start, 0) do open while open nepr´azdn´ y vezmi n nejlepˇs´ı z open if (n == c´ıl ) return u ´spˇech“ ” pˇridej n do closed for (all x ∈ Succ(n) and x ∈ / closed ) if (x ∈ / open) pˇridej (x, f (x)) do open else aktualizuj (x, f (x)) v open, pokud je tˇreba return ne´ uspˇech“ ” }
Obr´azek 2.1: Pseudok´od jednoduch´e varianty algoritmu A*
10
Pro kaˇzd´eho souseda n0 ∈ Succ(n) takto vybran´eho vrcholu je spoˇctena hodnota f (n0 ) = g(n0 ) + h(n0 ). Pokud n0 jeˇstˇe nen´ı v closed, pˇrid´a se s hodnotou f (n0 ) do seznamu open 1 . Jestliˇze jiˇz v closed je, pˇreˇrad´ı se do open jenom v pˇr´ıpadˇe, ˇze je jeho nov´a hodnota f (n0 ) niˇzˇs´ı neˇz p˚ uvodn´ı2 . Po dosaˇzen´ı c´ılov´eho vrcholu c se vlastn´ı cesta z´ısk´a postupnˇe pomoc´ı zpˇetn´ ych ukazatel˚ u na pˇredka, tj. ukazatel˚ u na ten vrchol, ze kter´eho byl dan´ y naposledy pˇrid´an do seznamu open. ´ ech algoritmu je silnˇe z´avisl´ Uspˇ y na pˇresnosti odhadu vzd´alenosti do c´ıle h(n). Podhodnocen´ı vede ke zbyteˇcn´emu prob´ır´an´ı vrchol˚ u nav´ıc, je-li vˇsak odhad vˇetˇs´ı neˇz skuteˇcnost, nalezen´ı nejkratˇs´ı cesty nen´ı zaruˇceno. V porovn´an´ı s algoritmy, kter´e heuristiku nepouˇz´ıvaj´ı (napˇr´ıklad s Dijkstrov´ ym algoritmem [4]) sice A* pˇrin´aˇs´ı znaˇcn´e zlepˇsen´ı, ale zejm´ena na delˇs´ıch vzd´alenostech m˚ uˇze zpracov´avat vrchol˚ u st´ale velmi mnoho.
2.2
Hierarchical Pathfinding A*
Jak jiˇz s´am n´azev napov´ıd´a, Hierarchical Pathfinding A* (d´ale HPA*) je typick´ ym z´astupcem hierarchick´ ych pl´anovac´ıch metod. Pomˇernˇe jednoduch´ ym zp˚ usobem rozdˇel´ı prohled´avan´ y prostor a postav´ı jednoduˇsˇs´ı graf (ve smyslu poˇctu vrchol˚ u), ve kter´em lze hledat podstatnˇe rychleji neˇz v p˚ uvodn´ım pl´anu. Tato abstraktn´ı ” cesta“ se pak podle potˇreby zjemn´ı“ na konkr´etn´ı sled dlaˇzdic. ” Algoritmus si v iniciaˇcn´ı f´azi rozdˇel´ı danou mapu na tzv. klastry, coˇz jsou pravideln´e ˇctvercov´e oblasti. Praktick´e testy uk´azaly (viz [2], str. 19), ˇze vhodnou velikost´ı pro standardn´ı mapy je 10 × 10 pol´ıˇcek. Vybran´a pol´ıˇcka, kter´a bezprostˇrednˇe soused´ı s voln´ ymi pol´ıˇcky sousedn´ıch klastr˚ u, pak urˇc´ı za tzv. pr˚ uchody. Tyto pr˚ uchody se spoj´ı jednak se sousedn´ımi pr˚ uchody z jin´ ych klastr˚ u, jednak navz´ajem v r´amci jednoho klastru, pokud mezi nimi existuje cesta (viz obr´azek 2.2). D´elky cest v r´amci jednoho klastru se ukl´adaj´ı. T´ımto zp˚ usobem se vytvoˇr´ı tzv. abstraktn´ı graf. Postup vytv´aˇren´ı klastr˚ u a abstraktn´ıho grafu lze iterovat a vytv´aˇret tak zmiˇ novanou hierarchii. Lze tedy poodstoupit“ v´ yˇs a budovat nad klastry do” savadn´ımi klastry vˇetˇs´ı (cca dvojn´asobn´e) velikosti. T´ım se jeˇstˇe zmenˇs´ı velikost abstraktn´ıho grafu a hled´an´ı v´ıce urychl´ı. M´ısto pˇrid´ an´ı jiˇz zaˇrazen´eho vrcholu lze pouze aktualizovat hodnotu f (n0 ) Pˇri pouˇzit´ı tzv. monot´ onn´ı metriky, coˇz je pˇr´ıpad vˇetˇsiny praktick´ ych aplikac´ı, se vrcholy v closed jiˇz nepˇrehodnocuj´ı. 1
2
11
Pˇri hled´an´ı urˇcit´e cesty se s rostouc´ımi klastry st´av´a n´aroˇcnˇejˇs´ı operace zaˇclenˇen´ı startovn´ıho a c´ılov´eho pol´ıˇcka dan´e cesty do abstraktn´ıho grafu, zvˇetˇsov´an´ı klastr˚ u tedy nen´ı vhodn´e dˇelat do nekoneˇcna (pro mapy velikosti cca 100 × 100 jsou vhodn´e 2–3 vrstvy hierarchie). Vlastn´ı nalezen´ı cesty v takto doplnˇen´em abstraktn´ım grafu je naopak jednoduch´e a rychl´e, pouˇzije se standardn´ıho algoritmu A* na graf, kter´ y m´a cca setinov´ y poˇcet vrchol˚ u oproti p˚ uvodn´ı mapˇe. Abychom z´ıskali seznam pol´ıˇcek, kudy skuteˇcnˇe povede cesta po mapˇe, je nutn´e prov´est tzv. path refinement, neboli zjemnˇen´ı cesty. Tato operace se s v´ yhodou m˚ uˇze prov´adˇet postupnˇe aˇz kdyˇz je potˇreba konkr´etn´ı u ´sek cesty. Pˇri programov´an´ı umˇel´ ych bytost´ı se totiˇz m˚ uˇze snadno st´at, ˇze se ˇr´ızen´ı pˇred´a jin´e ˇc´asti programu, nebo ˇze napl´anovan´a cesta selˇze, takˇze poˇc´ıt´an´ı cel´e cesty dopˇredu m˚ uˇze b´ yt ˇcasto zbyteˇcn´e. Posledn´ı, nepovinnou f´az´ı je tzv. vyhlazen´ı cesty. Protoˇze je poˇcet pr˚ uchod˚ u mezi klastry omezen, mezi m´ısty, kter´e by se daly spojit pˇr´ımou ˇc´arou, m˚ uˇze v´est cesta zbyteˇcnˇe klikatˇe. Vyhlazen´ı tedy postupuje po spoˇcten´e cestˇe jeˇstˇe jednou a kontroluje, zda-li nelze dlaˇzdice pr˚ uchod˚ u v n´asleduj´ıc´ım klastru spojit pˇr´ımou ˇc´arou. V kladn´em pˇr´ıpadˇe p˚ uvodn´ı cestu nahrad´ı cestou jednoduˇsˇs´ı a kratˇs´ı. Autoˇri v [2] uv´adˇej´ı, ˇze praktick´e testy uk´azaly aˇz desetin´asobn´e zrychlen´ı oproti optimalizovan´emu A*. HPA* spotˇrebov´av´a na sv˚ uj OpenList pˇribliˇznˇe tˇretinu pamˇeti oproti bˇeˇzn´emu A*, poˇcet navˇst´ıven´ ych dlaˇzdic je aˇz desetkr´at menˇs´ı. Produkuje o cca 6 % delˇs´ı cestu neˇz A*, kdyˇz se vˇsak zaˇrad´ı postprocessing (smoothing), jeho chyba je kolem 0,5 %. V uveden´em ˇcl´anku pouˇz´ıvaj´ı autoˇri osmismˇern´e dlaˇzdice, ale nenaˇsli jsme d˚ uvod, proˇc by algoritmus nemˇel stejnˇe dobˇre fungovat i s dlaˇzdicemi ˇctyˇrsmˇern´ ymi, kter´e pouˇz´ıv´a projekt ENTI. Dopˇredu nebylo jasn´e, do jak´e m´ıry budou moci enti ukl´adat informace o abstraktn´ım grafu, celkovˇe se ale HPA* uk´azal jako dobr´ y kandid´at. Za zm´ınku stoj´ı i to, ˇze se na algoritmu d´ale pracuje, coˇz dokl´adaj´ı drobn´a zlepˇsen´ı uveden´a v [8].
Obr´azek 2.2: Klastry a pr˚ uchody algoritmu HPA*
12
2.3
Partial-Refinement A*
Podobnˇe jako v pˇredchoz´ım pˇr´ıpadˇe, i tento algoritmus pouˇz´ıv´a hierarchii abstraktn´ıch graf˚ u, jej´ı struktura i pr´ace s n´ı je ale odliˇsn´a. Algoritmus se uˇz na z´akladn´ı mapu d´ıv´a jako na graf: vrcholy odpov´ıdaj´ı dlaˇzdic´ım a hrana mezi nimi vede v pˇr´ıpadˇe, ˇze spolu odpov´ıdaj´ıc´ı dlaˇzdice soused´ı. Berou se pˇri tom v u ´vahu mimo ˇctyˇr z´akladn´ıch smˇer˚ u i ˇctyˇri smˇery diagon´aln´ı. Na rozd´ıl od HPA*, kter´ y pˇrekr´ yv´a p˚ uvodn´ı mapu strukturou shora, Partial-Refinement A* (d´ale PRA*) sluˇcuje vrcholy na z´akladˇe lok´aln´ıch vlastnost´ı grafu. Algoritmus hled´a ve zpracov´avan´em grafu kliky, kter´e nahrazuje v budovan´e (vyˇsˇs´ı) vrstvˇe jedin´ ymi stavy. Spojov´an´ım klik je zaruˇceno, ˇze vˇsechny p˚ uvodn´ı vrcholy n´aleˇz´ıc´ı k nov´emu stavu jsou od sebe vzd´aleny jeden krok. Tedy t´emˇeˇr: ke klik´am se do jednoho stavu pˇrid´avaj´ı tak´e pˇrilehl´ı sirotci, coˇz jsou vrcholy pˇripojen´e k dan´e klice pouze/pr´avˇe jednou hranou (viz obr´azek 2.3). Cel´ y algoritmus zpracov´an´ı grafu je urˇcen k iteraci, dokonce jeˇstˇe v´ıce neˇz u HPA* – abstrakce konˇc´ı v momentˇe, kdyˇz uˇz zbyde jenom jeden vrchol. Cel´a sada vrstev tvoˇr´ı jak´ ysi strom, kter´ y PRA* vyuˇz´ıv´a. PRA* pro poˇc´ateˇcn´ı (start) a koncov´ y (goal ) vrchol nejdˇr´ıve zkonstruuje takovou ˇc´ast stromu, aby start a goal byly v listech a aby mˇely jedin´eho spoleˇcn´eho pˇredka. Pot´e urˇc´ı hladinu, od kter´e zaˇcne iterovanˇe vylepˇsovat cestu – nesm´ı b´ yt ani moc hluboko (algoritmus by provedl pˇr´ıliˇs mnoho krok˚ u) ani moc mˇelko (v´ ysledn´a cesta by se mohla od optim´aln´ı hodnˇe liˇsit). V kaˇzd´e iteraci vezme v aktu´aln´ı hladinˇe cestu z vrcholu obsahuj´ıc´ı“ start do vrcholu, kter´ y vznikl abs” trakc´ı vrcholu goal, rozbal´ı jednu u ´roveˇ n n´ıˇz a v tomto p´asu“ najde nejkratˇs´ı ” cestu pomoc´ı A* (pseudok´od viz obr´azek 2.4). Tak´e PRA* umoˇzn ˇuje vylepˇsovat cestu postupnˇe (tj. jaksi cestou), dokonce ho lze pˇr´ımo parametrizovat, kolik dlaˇzdic dopˇredu m´a poˇc´ıtat – na tuto vlastnost je
Obr´azek 2.3: Konstrukce abstraktn´ıho grafu PRA* (zdroj: [14])
13
pˇripraven l´epe neˇz HPA*. Autoˇri v [14] nab´ız´ı rychlostn´ı srovn´an´ı s m´ırnˇe optimaˇ lizovan´ ym A*. Casov´ au ´spora oproti A* rychle roste s d´elkou hledan´e cesty: cestu d´elky 400 dlaˇzdic PRA* najde aˇz desetkr´at rychleji, naopak na mal´ ych map´ach (cesty d´elky cca 50 a m´enˇe) m˚ uˇze PRA* dokonce m´ırnˇe ztr´acet. D´elka nalezen´e cesty na testovan´ ych map´ach se v˚ uˇci cestˇe A* neliˇs´ı o v´ıce neˇz 5 %, v 95 procentech pˇr´ıpad˚ u je pak delˇs´ı o m´enˇe neˇz 0,5 %. V ˇcl´anku [14] autoˇri popisuj´ı algoritmus s osmismˇern´ ymi dlaˇzdicemi, coˇz je dle naˇseho soudu pomˇernˇe kl´ıˇcov´a podm´ınka: v grafu ze ˇctyˇrsmˇern´ ych dlaˇzdic maj´ı kliky velikost nejv´ yˇse 2. Na druhou stranu t´ım, ˇze PRA* pˇri stavbˇe abstraktn´ıho grafu vych´az´ı jen z pˇr´ıstupn´ ych dlaˇzdic, m˚ uˇze b´ yt napˇr´ıklad pro ˇr´ıdk´e mapy efektivnˇejˇs´ı, nav´ıc striktnˇe nevyˇzaduje celou mapu v jedn´e ˇctvercov´e s´ıti, coˇz by se mohlo v prostˇred´ı projektu ENTI uk´azat jako v´ yhoda.
PRA*(abstraktn´ıGraf, start, goal ) { PostavHierarchiiAbstrakc´ı(start, goal ) ´ s = VyberStartovn´ıUroveˇ n(start, goal ) vypr´ azdni cestu for kaˇzdou u ´roveˇ n i = s to 1 cesta = ZjemniCestu(cesta, start[i], ocas(cesty)) return cesta } ZjemniCestu(cesta, start, goal ) { return aStar(start, goal ) omezen´ y na vrcholy v cestˇe }
Obr´azek 2.4: Pseudok´od algoritmu PRA*
14
2.4
Dalˇ s´ı metody
Memory-Efficient Abstractions V ˇcl´anku [15] je pˇredstaven dalˇs´ı pˇr´ıstup ke generov´an´ı abstraktn´ıch graf˚ u. Do jist´e m´ıry je kombinac´ı dvou pˇredeˇsl´ ych metod. Stejnˇe jako HPA* rozdˇel´ı p˚ uvodn´ı pl´an na pravidelnou s´ıt’ sektor˚ u. Sektory d´ale rozdˇel´ı na souvisl´e oblasti, tzv. regiony, kter´e se st´avaj´ı vrcholy budouc´ıho abstraktn´ıho grafu. Ten vznik´a spojen´ım tˇech region˚ u, kter´e mezi sebou soused´ı (viz obr´azek 2.5). Vlastn´ı algoritmus je pak podobn´ y HPA* – nejdˇr´ıve se najde pomoc´ı A* cesta v abstraktn´ım grafu, kter´a se podle potˇreby zjemn´ı a n´aslednˇe vyhlad´ı. Z algoritmu PRA* si tento pˇr´ıstup pˇrevzal omezen´ı hled´an´ı v niˇzˇs´ıch patrech jen na p´as“ ” tvoˇren´ y regiony z cesty v abstraktn´ım grafu. ˇ anek se d´ale detailnˇe zab´ Cl´ yv´a postupn´ ym zjemˇ nov´an´ım, vyhlazov´an´ım nebo pamˇet’ovou efektivitou, to vˇsak pro naˇse pouˇzit´ı nen´ı podstatn´e.
Obr´azek 2.5: Sektory a regiony Memory-Efficient Abstractions (zdroj: [15])
Incremental heuristic search methods Typick´ ym z´astupcem t´eto skupiny algoritm˚ u je D* Lite [9]. Tyto metody pouˇz´ıvaj´ı heuristiku, aby omezily a zac´ılily hled´an´ı, a z´aroveˇ n vyuˇz´ıvaj´ı dˇr´ıve spoˇcten´ ych cest z minul´ ych bˇeh˚ u algoritmu. Opravuj´ı jen to, co se zmˇenilo a kter´a ˇc´ast jiˇz prohleˇ r´ı tak nemal´e mnoˇzstv´ı prohled´av´an´ı, dan´e mapy je d´ıky tomu potˇreba opravit. Setˇ nebot’ zmˇeny ˇcasto zasahuj´ı jen malou ˇc´ast mapy (napˇr. kv˚ uli zamˇcen´ ym dveˇr´ım). D* Lite zaˇc´ın´a hled´an´ım cesty od c´ılov´e dlaˇzdice ke startovn´ı. Jeho postup pˇri prvn´ım hled´an´ı je v podstatˇe totoˇzn´ y s hled´an´ım bˇeˇzn´eho A*, jen kromˇe odhadu vzd´alenosti z c´ılov´e dlaˇzdice, hodnoty g, pouˇz´ıv´a odhad jeˇstˇe jeden, hodnotu rhs.
15
Je to jak´ ysi jednokrokov´ y v´ yhled, pˇresnˇeji minimum ze souˇct˚ u hodnot g(s0 ) soused˚ u dan´e dlaˇzdice a ceny pˇrechodu z tohoto souseda c(s0 , s): (
rhs(s) =
0 pokud s = sstart 0 0 mins0 ∈P red(s) (g(s ) + c(s , s)) jinak.
Tyto hodnoty uchov´av´a u kaˇzd´e dlaˇzdice a aktualizuje je v okamˇziku, kdyˇz nalezne zmˇeny v mapˇe. Zmˇenou jedn´e z hodnot se stane dlaˇzdice nekonzistentn´ı, coˇz m˚ uˇze m´ıt za n´asledek aktualizaci hodnot i dlaˇzdic sousedn´ıch. V´ ysledn´a cesta se pak najde projit´ım dlaˇzdic s z c´ılov´e dlaˇzdice sgoal tak, ˇze se vˇzdy vyb´ır´a pˇredch˚ udce s0 ∈ P red(s) s minim´aln´ı hodnotou g(s0 ) + c(s0 , s). I tato skupina algoritm˚ u je kandid´atem na pouˇzit´ı v projektu ENTI, protoˇze zmˇeny v konfiguraci svˇeta vˇetˇsinou neb´ yvaj´ı obrovsk´e. D* Lite mezi nimi vynik´a svou jednoduchost´ı a v´ yborn´ ym popisem.
Z´ avˇ er Z uveden´ ych algoritm˚ u byl po zv´aˇzen´ı v´ yhod a nev´ yhod vybr´an HPA*, kter´ y byl upraven tak, aby co nejl´epe pracoval v prostˇred´ı projektu ENTI. V´ıce o tom, jak´e d˚ uvody k v´ ybˇeru vedly a jak byl HPA* upraven, se doˇctete v kapitole 4.1 na stranˇe 24.
16
Kapitola 3 Projekt ENTI 3.1
Struktura projektu ENTI
Projekt ENTI nen´ı monolitick´ y – lze na nˇeho sp´ıˇse nahl´ıˇzet jako na soubor nˇekolika u ´zce prov´azan´ ych softwarov´ ych n´astroj˚ u1 . Nejd˚ uleˇzitˇejˇs´ımi jsou server prostˇred´ı, 2 prohl´ıˇzeˇc a ent . Server prostˇred´ı je u ´stˇredn´ı sloˇzkou projektu. Jeho u ´kolem je ˇr´ıdit veˇsker´e fyzik´aln´ı dˇeje v modelovan´em svˇetˇe a komunikovat s enty a prohl´ıˇzeˇcem. Server prostˇred´ı od nich pˇrij´ım´a informace o jejich ˇcinnosti, opaˇcn´ ym smˇerem pak pos´ıl´a 3 u ´daje o zmˇen´ach , kter´e ve svˇetˇe nastaly. Prohl´ıˇzeˇc je uˇzivatelsk´ ym rozhran´ım projektu. Stejnˇe jako ent je to klient, kter´ y se pˇripojuje k serveru prostˇred´ı. Prostˇrednictv´ım prohl´ıˇzeˇce m˚ uˇze uˇzivatel do svˇeta vstupovat jako jeden z ent˚ u a sledovat a ovlivˇ novat tak dˇen´ı ve svˇetˇe. Program ent je komponentou projektu, jeˇz reprezentuje jednoho enta – strojovou bytost ob´ yvaj´ıc´ı modelovan´ y svˇet. Tato bytost je schopna vn´ımat dˇeje ve sv´em bezprostˇredn´ım okol´ı a tyto vjemy shromaˇzd’ovat ve sv´e pamˇeti4 . Jej´ı chov´an´ı a rozhodov´an´ı je ˇr´ızeno skripty, pomoc´ı kter´ ych m˚ uˇze skl´adat jednoduch´e u ´kony (tzv. atomick´e instrukce) do sloˇzitˇejˇs´ıch u ´loh. 1
citace z [1], ˇc´ ast Uˇzivatelsk´ a pˇr´ıruˇcka, str. 15 Stejnˇe jako v [1] oznaˇcuje slovo ent napsan´e norm´aln´ım p´ısmem simulovanou bytost. Tot´eˇz slovo, ale neproporcion´ aln´ım p´ısmem, je n´azev spustiteln´eho programu, kter´ y bytost ˇr´ıd´ı. ENTI v mnoˇzn´em ˇc´ısle a kapit´ alkami pak obˇcas budeme pouˇz´ıvat m´ısto souslov´ı projekt ENTI“. ” 3 citace z [1], ˇc´ ast Uˇzivatelsk´ a pˇr´ıruˇcka, str. 17 4 citace z [1], ˇc´ ast Uˇzivatelsk´ a pˇr´ıruˇcka, str. 19 2
17
Ke sv´emu bˇehu potˇrebuj´ı ENTI i tzv. bal´ık svˇeta. Je to sada konfiguraˇcn´ıch soubor˚ u, kter´a popisuje simulovan´ y svˇet. Lze s nimi mˇenit vzhled a strukturu svˇeta. Obsahuje t´eˇz nˇekter´e skripty a dalˇs´ı konfigurace pro jednotliv´e enty.
3.2
Svˇ et ent˚ u
Jak bylo uvedeno v´ yˇse, jedn´ım z c´ıl˚ u projektu ENTI je simulovat svˇet podobn´ y svˇetu naˇsemu. Autoˇri zvolili nˇekter´a zjednoduˇsen´ı, kter´a tuto pr´aci a koneˇcn´ y v´ ybˇer algoritm˚ u podstatn´ ym zp˚ usobem ovlivˇ nuj´ı. Jde zejm´ena o n´asleduj´ıc´ı (viz [1], ˇc´ast Teoretick´a dokumentace, str. 10): Diskr´ etn´ı prostor a objekty. Prostor svˇeta ent˚ u je rozdˇelen na mal´e dlaˇzdice ve ˇctvercov´e s´ıti. Na dlaˇzdic´ıch mohou b´ yt um´ıstˇeny pˇredmˇety, vˇcetnˇe ent˚ u samotn´ ych. Pˇredmˇety mohou (podle urˇcit´ ych pravidel) zase obsahovat pˇredmˇety. Prostor je d´ale rozdˇelen do samostatn´ ych u ´sek˚ u, tzv. m´ıstnost´ı. Diskr´ etn´ı bˇ eh ˇ casu. Simulace je prov´adˇena po kolech, v kaˇzd´em kole vˇsichni enti dostanou cel´ y popis m´ıstnosti, kde se nach´az´ı, o zmˇen´ach v jin´ ych m´ıstnostech se naopak nedozv´ı nic. V kaˇzd´em kole pos´ıl´a kaˇzd´ y ent serveru atomickou instrukci a mezi instrukcemi prov´ad´ı v´ ypoˇcty. Omezen´ yˇ cas i prostor. Ent´ı ˇcas je zdola omezen startovn´ım okamˇzikem projektu. Ent´ı prostor je omezen´ y, v simulovan´em svˇetˇe je dopˇredu d´an poˇcet i velikost m´ıstnost´ı, m´ıstnosti ani dlaˇzdice nemohou pˇrib´ yvat ani ub´ yvat.
Obr´azek 3.1: Spuˇstˇen´ y prohl´ıˇzeˇc ENT˚ U
18
Enti se mohou pohybovat ve ˇctyˇrech smˇerech. Neexistuje stav natoˇcen´ı“ ani ” instrukce pro ot´aˇcen´ı – enti mohou udˇelat v dalˇs´ım kole krok na kteroukoli ze ˇctyˇr sousedn´ıch dlaˇzdic. M´ıstnosti jsou mezi sebou propojeny dveˇrmi. Mezi nˇekter´ ymi m´ıstnostmi mohou v´est schody, kter´e svˇet rozdˇel´ı do nˇekolika pater. Ent˚ uv pohled na topologii m´ıstnost´ı je vˇsak jednoduˇsˇs´ı neˇz by se mohlo z uveden´eho popisu zd´at: ent jen v´ı, kter´e m´ıstnosti jsou propojeny kter´ ymi dveˇrmi. Schody od dveˇr´ı v podstatˇe nerozliˇsuje. Veˇsker´e informace o um´ıstˇen´ı pˇredmˇet˚ u a ostatn´ıch ent˚ u jsou vˇzdy relativn´ı k jednotliv´ ym m´ıstnostem, ˇz´adn´e absolutn´ı souˇradnice neexistuj´ı a vlastnˇe je ani ˇz´adn´a ˇc´ast projektu nepotˇrebuje.
3.3
Programov´ an´ı ent˚ u
Jak jiˇz bylo nˇekolikr´at zm´ınˇeno, chov´an´ı ent˚ u je ˇr´ızeno skripty. Vˇetˇsina z nich je napsan´a v jazyce E. Tyto skripty jsou interpretovan´e pˇr´ımo entem, a tak je lze pomˇernˇe snadno mˇenit nebo rozˇsiˇrovat a do znaˇcn´e m´ıry tak ovlivˇ novat chov´an´ı kaˇzd´eho enta zvl´aˇst’. Nˇekter´e v´ ypoˇctov´e skripty nebo funkce pro pr´aci s datab´az´ı jsou vˇsak v jazyc´ıch Mercury [11] nebo C a kompiluj´ı se pˇr´ımo jako souˇc´ast enta. Jejich zmˇeny pro bˇeˇzn´e uˇzivatele pˇr´ıliˇs pˇr´ıvˇetiv´e nejsou (ˇcasto je potˇreba mˇenit nˇekolik soubor˚ u na r˚ uzn´ ych m´ıstech, neexistuje debugger), odmˇenou je vˇsak vyˇsˇs´ı rychlost a do jist´e m´ıry i spolehlivost. Pojd’me se na jazyk E pod´ıvat trochu podrobnˇeji. Z´akladn´ı strukturou pro z´apis algoritm˚ u je tzv. skript. Je na cestˇe mezi prologovsk´ ym termem a procedurou v C (jakkoli se to zd´a nemoˇzn´e). Zat´ımco v´ ybˇer toho, kter´ y skript se spust´ı, se dˇeje podle ryze specifick´ ych pravidel, vykon´av´an´ı pˇr´ıkaz˚ u uvnitˇr skriptu prob´ıh´a do znaˇcn´e m´ıry procedur´alnˇe. K dispozici jsou i pˇr´ıkazy jako repeat, if—then nebo for-cyklus, na druhou stranu lze pouˇz´ıt verzi s backtrackingem i bez nˇej. K v´ ybˇeru toho, kter´ y skript z nˇekolika variant se m´a pouˇz´ıt, slouˇz´ı hodnot´ıc´ı funkce. Ta existuje pro kaˇzd´ y skript. Na z´akladˇe stavu enta a jeho okol´ı urˇc´ı, jak moc je pro enta dan´a verze skriptu zaj´ımav´a, a interpret pak vybere nejslibnˇejˇs´ı variantu. Podobn´ y syst´em pouˇz´ıvaj´ı priority. S jejich pomoc´ı jazyk E dovoluje prov´adˇet v´ıce u ´loh najednou a jen mezi nimi pˇrep´ınat podle toho, kter´a z nich je nejd˚ uleˇzitˇejˇs´ı (m´a nejvyˇsˇs´ı prioritu). Tyto priority se nav´ıc mohou mˇenit v ˇcase, takˇze lze elegantnˇe pl´anovat vykon´av´an´ı r˚ uzn´ ych u ´kol˚ u, obstar´av´an´ı ˇzivotn´ıch potˇreb apod. 19
Dalˇs´ım nem´enˇe zaj´ımav´ ym jevem je tzv. interrupt. Pˇri programov´an´ı umˇel´ ych bytost´ı je ˇcasto potˇreba zajistit po urˇcitou dobu platnost nˇejak´ ych podm´ınek. Interrupty jsou skripty, kter´e spoustu jinak nutn´ ych test˚ u nahrad´ı elegantn´ım ˇreˇsen´ım: po jejich aktivaci (tzv. navˇeˇsen´ı“) se zaˇcnou prov´adˇet jakmile zaˇcne ” platit n´ami zvolen´a podm´ınka. Pˇr´ıklad: jestliˇze ent potˇrebuje z´ıskat konev, ale o ˇz´adn´e nev´ı, lze navˇesit interrupt seber konev a skonˇci“ na podm´ınku vid´ım ” ” konev“. Staˇc´ı pak proch´azet svˇet a jakmile ent konev uvid´ı, sebere ji a skript u ´spˇeˇsnˇe skonˇc´ı. Jazyk E m´a ale i nev´ yhody. Rozliˇsuje jen ˇctyˇri datov´e typy: handle (v podstatˇe ˇctyˇrbajtov´e cel´e ˇc´ıslo slouˇz´ıc´ı k reprezentaci vˇsech ent˚ u, m´ıstnost´ı, objekt˚ u i ˇc´ısel), seznam (bˇeˇzn´a datov´a struktura neprocedur´aln´ıch jazyk˚ u, m˚ uˇze obsahovat objekty typu handle), member (struktura s pevnˇe dan´ ymi poloˇzkami nebo jinak tak´e ˇr´adek relaˇcn´ı tabulky, pouˇz´ıvan´a ke konkretizaci pˇredmˇet˚ u) a superseznam (seznam member˚ u). Zcela chyb´ı napˇr´ıklad pole, se kter´ ymi by mnoh´e algoritmy pracovaly podstatnˇe efektivnˇeji. Omezen´e jsou i moˇznosti ukl´ad´an´ı dat mezi bˇehy skript˚ u. Existuj´ı jen dvˇe moˇznosti: glob´aln´ı promˇenn´e a entova datab´aze. Prvn´ı z nich je sice jednoduch´a a patrnˇe i rychl´a, nelze ale pouˇz´ıt ve funkc´ıch psan´ ych v Mercury nebo C. Pˇrid´avat nov´ y typ z´aznamu do entovy datab´aze tak, aby byl pˇr´ıstupn´ y i z Mercury/Cfunkc´ı, sice lze, vyˇzaduje to vˇsak velk´e u ´sil´ı v konfiguraci mnoha dalˇs´ıch soubor˚ u, pˇrid´av´an´ı nov´ ych handl˚ u atd. Do entovy datab´aze nav´ıc nelze ukl´adat nic jin´eho neˇz handly, takˇze uchov´av´an´ı vˇetˇs´ıho mnoˇzstv´ı dat, napˇr´ıklad urˇcit´e informace ke kaˇzd´e dlaˇzdici na mapˇe, by datab´azi velmi zaplnilo a zpomalilo.
3.4
Pohybov´ e skripty
Skripty a funkce, kter´e jsou zamˇeˇreny na ent˚ uv pohyb a navigaci, jsou soustˇredˇeny v knihovn´ach skript˚ u jazyka E i ve zdrojov´ ych souborech napsan´ ych v Mercury. V prvn´ı skupinˇe najdeme pˇredevˇs´ım ˇr´ıd´ıc´ı v´ ykonn´e skripty, kter´e obsahuj´ı vyˇsˇs´ı logiku“, atomick´e instrukce a ˇcasto vyuˇz´ıvaj´ı interrupty, ” napˇr´ıklad jdiNaDlazdici/5, jdiDoMistnosti/3 nebo jdiKEntovi/2. Do druh´e skupiny patˇr´ı hlavnˇe v´ ypoˇcetn´ı funkce hledaj´ıc´ı vlastn´ı cestu po dlaˇzdic´ıch nebo mezi m´ıstnostmi, ˇcasto komunikuj´ıc´ı s datab´az´ı. Pˇr´ıkladem jsou funkce cSmerKDlazdici/6 nebo cDvereSmeremK/6. Prvn´ı c´ıl t´eto pr´ace (viz kap. 1.1, str. 7), zrychlen´ı prohled´avac´ıch algoritm˚ u, se bude naplˇ novat pˇredevˇs´ım ve druh´e skupinˇe, tedy v Mercury. Naopak pro skripty, kter´e budou zlepˇsovat vˇerohodnost chov´an´ı ent˚ u, nab´ız´ı jazyk E pomˇernˇe ˇsirokou 20
paletu n´astroj˚ u. Vˇetˇsina zmˇen spadaj´ıc´ıch do t´eto oblasti se tedy bude odehr´avat ve zdrojov´ ych souborech ze skupiny prvn´ı. Konkr´etn´ı popis toho, co a jak bylo zlepˇseno, najdete v n´asleduj´ıc´ıch dvou kapitol´ach.
21
Kapitola 4 Pouˇ zit´ e postupy a algoritmy C´ıle t´eto pr´ace byly sice vytyˇceny v kapitole 1.1, nikoliv vˇsak pˇr´ıliˇs konkr´etnˇe. N´asleduj´ıc´ı kapitola pˇredstav´ı probl´emy, kter´ ymi jsme se zab´ yvali, podrobnˇeji, a to vˇcetnˇe obecn´eho popisu jejich ˇreˇsen´ı. Jde o hierarchick´e hled´an´ı cest pomoc´ı varianty algoritmu A* (4.1), tzv. bagrov´an´ı (4.2), pron´asledov´an´ı (4.3) a vyh´ yb´an´ı ciz´ım ent˚ um (4.4) a sb´ır´an´ı pˇredmˇet˚ u pˇri jin´ ych ˇcinnostech, tzv. on-line hled´an´ı (4.5). Implementaˇcn´ı detaily a pˇr´ıklady pouˇzit´ı naleznete v kapitole 5.
4.1
Hierarchick´ e hled´ an´ı cest
Pˇrestoˇze virtu´aln´ı svˇet ENT˚ U je typicky pouze nˇ ekolik m´ıstnost´ı velik´ y, enti se v nˇem mus´ı rychle a pˇresvˇedˇcivˇe pohybovat. Naj´ıt cestu mus´ı v podstatˇe k jak´emukoli u ´kolu – zahradn´ık mus´ı pro zeleninu doj´ıt na zahradu, um´ yt se mus´ı enti u umyvadla nebo ve sprˇse apod. Stejnˇe jako v jin´ ych podobn´ ych aplikac´ıch (nejˇcastˇeji v poˇc´ıtaˇcov´ ych hr´ach), hled´an´ı cest je nejen hojnˇe pouˇz´ıv´ano, ale nav´ıc jako takov´e zab´ır´a pomˇernˇe mnoho v´ ypoˇcetn´ıho ˇcasu. To zjist´ıme zejm´ena v pˇr´ıpadˇe, kdyˇz projekt ENTI spust´ıme na starˇs´ım poˇc´ıtaˇci (cca 1,3 GHz a m´enˇe). C´ıl je tedy zˇrejm´ y: hled´an´ı cest zefektivnit pˇri souˇcasn´em zachov´an´ı nebo dokonce zlepˇsen´ı vˇerohodnosti pohybu. Jak uˇz jsme uvedli, p˚ uvodn´ı pˇredstava ent˚ u o topologii m´ıstnost´ı byla velmi jednoduch´a: enti pouze vˇedˇeli, kter´a m´ıstnost je se kterou spojena dveˇrmi. Je sice pravdou, ˇze na to, aby doˇsli tam, kam potˇrebuj´ı, to staˇc´ı, ale tento pˇr´ıstup neumoˇzn ˇuje k hled´an´ı cesty mezi r˚ uzn´ ymi m´ıstnostmi pouˇz´ıt lepˇs´ı algoritmus neˇz Dijkstr˚ uv. Ten se v pˇr´ıpadˇe ENT˚ U, kde jsou vˇ sechny m´ıstnosti podobnˇe velk´e, moc neodliˇsuje od prohled´av´an´ı do ˇs´ıˇrky. Enti si nav´ıc spoˇctenou cestu pˇres m´ıstnosti 22
nepamatovali – vyrazili do prvn´ı m´ıstnosti, kudy cesta vedla, a tam celou cestu poˇc´ıtali znova. P˚ uvodn´ı n´avrh hled´an´ı cest mezi dlaˇzdicemi v r˚ uzn´ ych m´ıstnostech byl do jist´e m´ıry hierarchick´ y jiˇz od zaˇc´atku – nejdˇr´ıve si enti napl´anovali, pˇres kter´e m´ıstnosti p˚ ujdou, a v nich pak hledali konkr´etn´ı cestu po jednotliv´ ych dlaˇzdic´ıch. Neumoˇzn ˇoval vˇsak ve vyˇsˇs´ıch vrstv´ach pouˇz´ıt ˇz´adnou heuristiku.
Absolutn´ı souˇ radnice dlaˇ zdic Jako prvn´ı krok k efektivnˇejˇs´ım algoritm˚ um jsme proto napsali sadu skript˚ u a Mercury-funkc´ı, kter´e vˇsechny m´ıstnosti zasadily do jak´esi virtu´aln´ı trojdimenzion´aln´ı s´ıtˇe, tj. kaˇzd´e m´ıstnosti pˇriˇradily souˇradnice (x, y, z) jej´ıho severoz´apadn´ıho rohu (hodnoty jsou relativn´ı v˚ uˇci startovn´ı pozici enta). Souˇradnice v r´amci m´ıstnosti jsou pˇr´ımo uloˇzeny v prvn´ım a druh´em bajtu handlu dan´e dlaˇzdice, pozice konkr´etn´ıch dlaˇzdic jsou tedy prost´ ym souˇctem dvou vektor˚ u po sloˇzk´ach. Postup z´ısk´an´ı t´eto sady souˇradnic je pomˇernˇe jednoduch´ y: ent (virtu´alnˇe) proch´az´ı jednotliv´e m´ıstnosti do ˇs´ıˇrky. Kaˇzd´e dveˇre, na kter´e naraz´ı, jsou jiˇz v proˇsl´e ˇc´asti mapy, a jejich absolutn´ı souˇradnice jsou tedy zn´amy. Pomoc´ı relativn´ı pozice dveˇr´ı v nov´e m´ıstnosti se pak snadno spoˇc´ıt´a pozice jej´ıho severoz´apadn´ıho rohu. Proch´azen´ı prob´ıh´a po jednotliv´ ych patrech – pokud ent naraz´ı na schody, poˇck´a s jejich projit´ım, dokud nen´ı proˇsl´e cel´e pˇredchoz´ı patro. Svˇet ent˚ u neˇ rozliˇsuje, zda schody vedou nahoru nebo dol˚ u. C´ısla pater (souˇradnice z) tedy nemus´ı odpov´ıdat zam´ yˇslen´emu n´avrhu svˇeta; je to sp´ıˇse poˇrad´ı, v jak´em se jednotliv´a patra zpracov´avala. Aby se vˇsak topologie pater neztratila, ent si vytv´aˇr´ı paralelnˇe dalˇs´ı strukturu, tzv. graf pater. Tam ukl´ad´a, kter´e patro je kde a se kter´ ym spojeno schody. K jeho vyuˇzit´ı se vr´at´ıme pozdˇeji. Tento krok umoˇznil u kaˇzd´e dlaˇzdice rychle zjistit jej´ı pˇribliˇznou vzd´alenost od kter´ekoli jin´e. Protoˇze enti chod´ı jen do ˇctyˇr smˇer˚ u, nejlepˇs´ı metrikou je jistˇe Manhattansk´a, kter´a vzd´alenost rychle spoˇc´ıt´a jako souˇcet absolutn´ıch hodnot rozd´ıl˚ u odpov´ıdaj´ıc´ıch souˇradnic d(A, B) = |Ax − Bx | + |Ay − By | + |Az − Bz |. Jak bylo uvedeno v pˇredchoz´ım odstavci, v´ yznam vzd´alenosti v ose z je diskutabiln´ı, pro naˇse u ´ˇcely vˇsak staˇc´ı. 23
V´ ybˇ er, u ´ pravy a aplikace HPA* V tomto bodˇe jiˇz bylo tˇreba rozhodnout, kter´ y z algoritm˚ u uveden´ ych v kapitole 2 aplikovat. HPA* se nab´ızel svou jednoduchost´ı, v prostˇred´ı projektu ENTI vˇsak m´a sv´e slabiny: mapa m˚ uˇze b´ yt pomˇernˇe ˇr´ıdk´a a nen´ı zaruˇceno, ˇze se m´ıstnosti po zasazen´ı do 3D s´ıtˇe nebudou pˇrekr´ yvat. Dalˇs´ı v poˇrad´ı, PRA*, se zd´al na prvn´ı pohled jako dobr´ y kandid´at: abstraktn´ı graf vych´az´ı pˇr´ımo z dan´e mapy, nab´ız´ı velkou variabilitu, nav´ıc je algoritmus aktivnˇe pouˇz´ıv´an a vyv´ıjen. Po bliˇzˇs´ım zkoum´an´ı byl ale zavrˇzen: poˇzadavek na osmismˇern´e dlaˇzdice je pˇr´ıliˇs siln´ y, nad to by bylo pˇrinejmenˇs´ım nepˇr´ıjemn´e ukl´adat do entovy datab´aze mnoˇzstv´ı abstraktn´ıch graf˚ u. D* Lite a jin´e algoritmy ze skupiny incremental heuristic search metods byly zavrˇzeny kv˚ uli omezenosti entovy datab´aze, nav´ıc nedosahuj´ı takov´ ych zlepˇsen´ı v rychlosti jako hierarchick´e pˇr´ıstupy. Posledn´ı z uveden´ ych, Memory-Efficient Abstractions, vyuˇz´ıv´a zaj´ımav´eho pˇr´ıstupu v dˇelen´ı mapy na souvisl´e oblasti, ale nepˇredstavuje pˇr´ıliˇs komplexn´ı ˇreˇsen´ı. Po zv´aˇzen´ı klad˚ u a z´apor˚ u popsan´ ych metod jsme nakonec zvolili sv˚ uj vlastn´ı pˇr´ıstup. Je zaloˇzen na stejn´e myˇslence jako HPA*, naplno ale vyuˇz´ıv´a dodateˇcn´ ych informac´ı a implementaˇcn´ıch detail˚ u naˇs´ı konkr´etn´ı aplikace, tedy projektu ENTI. Postup uveden´ y v [2] jsme upravili pˇredevˇs´ım v tˇechto bodech: Klastry nahrazeny m´ıstnostmi. M´ısto klastr˚ u (“clusters” v ˇcl´anku [2]) velikosti cca 10 × 10 pol´ı jsme vyuˇzili nativn´ıho rozdˇelen´ı svˇeta na m´ıstnosti. Toto ˇreˇsen´ı pˇrin´aˇs´ı mnoh´e v´ yhody. Velmi dobˇre, pˇresnˇe a v´ ystiˇznˇe jsou definovan´e pr˚ uchody mezi klastry (“enters” a “transmissions” v [2]) pomoc´ı dveˇr´ı a schod˚ u mezi m´ıstnostmi. Je t´ım zaruˇcena vysok´a pˇresnost heuristiky (pˇresnˇeji to vlastnˇe ani nejde – enti nemohou proj´ıt pˇres zed’), nen´ı potˇreba path smoothing (nen´ı kudy cestu zlepˇsit) a nav´ıc je cel´a implementace o pozn´an´ı jednoduˇsˇs´ı. Existuj´ı samozˇrejmˇe i z´aporn´e str´anky. M´ıstnosti jsou obvykle menˇs´ı neˇz 10 × 10 pol´ı a pr˚ uchod˚ u m˚ uˇze b´ yt v´ıce neˇz v origin´aln´ım ˇreˇsen´ı HPA*, takˇze hled´an´ı v abstraktn´ım grafu je n´aroˇcnˇejˇs´ı. L´ın´ e poˇ c´ıt´ an´ı vzd´ alenost´ı. P˚ uvodn´ı podoba HPA* navrhuje pˇredpoˇc´ıtat vzd´alenosti mezi pr˚ uchody (v naˇsem pˇr´ıpadˇe mezi dveˇrmi) v kaˇzd´em klastru dopˇredu. Naˇse pr´ace pouˇz´ıv´a jin´ y pˇr´ıstup: nejdˇr´ıve se pouˇz´ıv´a odhad Manhattanskou metrikou. Pˇresn´a vzd´alenost se spoˇc´ıt´a aˇz v okamˇziku, kdy ent skuteˇcnˇe cestu mezi dveˇrmi potˇrebuje napl´anovat a proj´ıt. Spoˇctenou vzd´alenost si pak uloˇz´ı do datab´aze a pˇr´ıˇstˇe ji jiˇz pouˇzije m´ısto odhadu. Toto chov´an´ı nav´ıc odpov´ıd´a chov´an´ı lid´ı – chce-li ˇclovˇek rychle odhadnout 24
nˇejakou vzd´alenost, m˚ uˇze se snadno dopustit chyby. Pokud si ale nˇejakou trasu opravdu projde, odhad se podstatn´ ym zp˚ usobem zpˇresn´ı. Druh´ a abstraktn´ı vrstva tvoˇ ren´ a patry. Autoˇri v [2] v˚ ubec neuvaˇzuj´ı, ˇze by mapa mohla vyboˇcit ze dvou rozmˇer˚ u. Bylo proto potˇreba naj´ıt zp˚ usob, jak nejl´epe vyˇreˇsit hled´an´ı v nˇekolika patrech. Celkem pˇrirozenˇe se nab´ıdlo ˇreˇsen´ı vytvoˇrit mezi nimi druhou abstraktn´ı vrstvu. Pr´avˇe zde se uplatn´ı graf pater generovan´ y pˇri ukl´ad´an´ı absolutn´ıch pozic m´ıstnost´ı (viz str. 23). Hled´ an´ı jen v prvn´ı abstraktn´ı vrstvˇ e. Podobnost v entovˇe vn´ım´an´ı dveˇr´ı a schod˚ u umoˇznila jednoduˇse implementovat pomˇernˇe pˇrekvapivou vˇec: pl´anovat cestu mezi m´ıstnostmi v r˚ uzn´ ych patrech lze stejnˇe dobˇre pouˇzit´ım obou abstraktn´ıch vrstev (tzn. nejdˇr´ıve zjistit, pˇres kter´a patra a schody je potˇreba j´ıt, a pak teprve napl´anovat nejkratˇs´ı cesty pˇres m´ıstnosti mezi schody v kaˇzd´em patˇre) i kdyˇz se bude hledat jen ve vrstvˇe prvn´ı (na schody se bude ent d´ıvat jako na obyˇcejn´e dveˇre a druh´a abstraktn´ı vrstva se nepouˇzije). Prvn´ı pˇr´ıstup je pro delˇs´ı cesty rychlejˇs´ı a zˇrejmˇe i podobnˇejˇs´ı lidsk´emu jedn´an´ı, druh´ y pak umoˇzn ˇuje naj´ıt cesty o nˇeco kratˇs´ı (pouˇz´ıv´a se pˇresnˇejˇs´ı heuristika, patra lze opouˇstˇet a zase se do nich vracet). Vlastn´ı algoritmus nalezen´ı cesty se od p˚ uvodn´ıho algoritmu HPA* v podstatˇe neliˇs´ı (pseudok´od viz obr´azek 4.1). Pouˇz´ıv´a-li se graf pater, najde se nejdˇr´ıve, pˇres kter´e schody je potˇreba proj´ıt. Tato cesta se pak zjemn´ı o sled dveˇr´ı tvoˇr´ıc´ı nejkratˇs´ı cestu mezi schody. Pokud se druh´a abstraktn´ı vrstva nepouˇzije, z´ısk´ame sled dveˇr´ı a schod˚ u rovnou. Za zm´ınku stoj´ı, ˇze pr´avˇe v tomto bodˇe hraj´ı kl´ıˇcovou roli ´ cinnˇe lze totiˇz pouˇz´ıvat algoritmus absolutn´ı souˇradnice dlaˇzdic, dveˇr´ı a schod˚ u. Uˇ A* i pˇri hled´an´ı mezi r˚ uzn´ ymi m´ıstnostmi, coˇz p˚ uvodnˇe nebylo moˇzn´e. Ent spoˇc´ıt´a cestu pˇres aktu´aln´ı m´ıstnost k nejbliˇzˇs´ım dveˇr´ım a vyraz´ı k nim. Cestu pˇres dalˇs´ı m´ıstnosti poˇc´ıt´a vˇzdy aˇz kdyˇz do nich vstoup´ı. Jednak se t´ımto rozdˇeluje z´atˇeˇz procesoru na v´ıc ˇc´ast´ı, ˇc´ımˇz se bˇeh ENT˚ U st´ av´a plynulejˇs´ım, jednak se nepoˇc´ıt´a zbyteˇcnˇe dopˇredu v pˇr´ıpadˇe, ˇze je nalezen´a cesta nepr˚ uchodn´a nebo je potˇreba pˇrepl´anovat u ´lohu, a v neposledn´ı ˇradˇe se st´av´a hled´an´ı pˇresnˇejˇs´ı, nebot’ ent z´ısk´a po vstupu do m´ıstnosti aktu´aln´ı pˇrehled o vˇsech pˇredmˇetech i entech, kteˇr´ı se v n´ı nach´az´ı. Popsan´a metoda sniˇzuje ˇcasov´e n´aroky na hled´an´ı cest, coˇz by se mˇelo v´ yraznˇeji projevit zejm´ena u delˇs´ıch vzd´alenost´ı. Kromˇe popsan´eho hierarchick´eho pˇr´ıstupu au ´spory hled´an´ı pouˇzit´ım algoritmu A* se ˇcas uspoˇr´ı i odstranˇen´ım hled´an´ı cel´e cesty v kaˇzd´e m´ıstnosti znovu – skripty si cestu pamatuj´ı a k pˇrepl´anov´an´ı doch´az´ı aˇz kdyˇz selˇze nˇekter´ y z podskript˚ u. 25
cNajdiCestuDo(start, c´ıl, pˇresnost, pouˇzijPatra) { if ((Stejn´ePatro(start, c´ıl ) and pouˇzijPatra == true) or pouˇzijPatra == false) then omezNaJednoPatro = pouˇzijPatra (dlaˇzdicePˇredeDveˇrmi, vzd´ alenost) = aStar(start, c´ıl, pˇresnost, omezNaJednoPatro) else omezNaJednoPatro = true dlaˇzdiceUSchod˚ u = aStarVrat’JenPatra(start, c´ıl, pˇresnost) (dlaˇzdicePˇredeDveˇrmi, vzd´ alenost) = ZjemniPatra(start, c´ıl, dlaˇzdiceUSchod˚ u, omezNaJednoPatro) return (dlaˇzdicePˇredeDveˇrmi, vzd´ alenost) } ZjemniPatra(start, c´ıl, dlaˇzdiceUSchod˚ u) { omezNaJednoPatro = true abstraktn´ıCesta = [start, dlaˇzdiceUSchod˚ u, c´ıl ] dlaˇzdicePˇredeDveˇrmi = [ ] vzd´ alenost = 0 do (s, g) = VezmiPrvn´ıDvojiciZ(abstraktn´ıCesta) (nov´eDlaˇzdice, nov´ aVzd´ alenost) = aStar(s, g, pˇresnost, omezNaJednoPatro) dlaˇzdicePˇredeDveˇrmi = dlaˇzdicePˇredeDveˇrmi + nov´eDlaˇzdice vzd´ alenost = vzd´ alenost + nov´ aVzd´ alenost while nepr´ azdn´ a abstraktn´ıCesta return (dlaˇzdicePˇredeDveˇrmi, vzd´ alenost) }
Obr´azek 4.1: Pseudok´od hled´an´ı mezi r˚ uzn´ ymi m´ıstnostmi
26
Pozn´ amka o mˇ eˇ ren´ı vzd´ alenost´ı Algoritmus A* potˇrebuje k odhadu vzd´alenosti do c´ıle rychlou a tzv. pˇr´ıpustnou metriku. V pˇr´ıpadˇe ˇctyˇrsmˇern´ ych dlaˇzdic se v naprost´e vˇetˇsinˇe pˇr´ıpad˚ u pouˇz´ıv´a jiˇz zm´ınˇen´a metrika Manhattansk´a a ani v t´eto pr´aci nen´ı pouˇzito jin´e. Je to jak´ ysi doln´ı odhad vzd´alenosti do c´ıle. Probl´em se ale objevuje ve vertik´aln´ım smˇeru. Jak jiˇz bylo uvedeno v´ yˇse, v´ yznam rozd´ılu v souˇradnic´ıch z pˇr´ıliˇs neodpov´ıd´a vzd´alenosti pater mezi sebou. Nav´ıc vzd´alenost mezi dlaˇzdicemi pˇr´ımo nad sebou bude nejsp´ıˇs ve skuteˇcnosti mnohem delˇs´ı neˇz 1, nebot’ cesta mus´ı v´est pˇres nˇejak´e schody – heuristika je silnˇe podhodnocen´a (viz napˇr. obr´azek 4.2). N´asledky nejsou katastrof´aln´ı, popsan´ y jev ale m˚ uˇze v´est v pˇr´ıpadˇe vynech´an´ı druh´e abstraktn´ı vrstvy (grafu pater) ke zbyteˇcn´emu hled´an´ı v nec´ılov´ ych patrech do m´ıst, kudy cesta nepovede. Do jin´ ych pater lze totiˇz vstoupit pouze po schodech, hled´an´ı jinam tedy nem´a smysl. Probl´em je naopak zcela odstranˇen, kdyˇz se druh´a vrstva pouˇzije, nebot’ hled´an´ı cesty je pak omezeno vˇzdy jen na jedno patro. Druh´ y typ vzd´alenost´ı, se kter´ ymi A* pracuje, je vzd´alenost dosud uraˇzen´a. Ta ’ by mˇela b´ yt co nejpˇresnˇejˇs´ı, nebot pˇri pouˇzit´ı ˇspatn´eho odhadu nemus´ı algoritmus naj´ıt cestu nejkratˇs´ı. Popsan´e algoritmy sˇc´ıtaj´ı vzd´alenosti uraˇzen´e pˇres jednotliv´e m´ıstnosti. Na jejich mˇeˇren´ı lze pouˇz´ıt tˇri stupnˇe pˇresnosti: (1) odhad Manhattanskou metrikou (nejm´enˇe pˇresn´ y), (2) vzet´ı vzd´alenosti z entovy datab´aze, pokud tam je, jinak pouˇzit´ı pˇredchoz´ıho postupu, (3) pˇresn´e napl´anov´an´ı cesty
Obr´azek 4.2: Vzd´alenosti ve vertik´aln´ım smˇeru. Heuristika (d = 1) se m˚ uˇze od skuteˇcnosti (d = 22) znaˇcnˇe liˇsit.
27
mezi dveˇrmi a uloˇzen´ı nov´e vzd´alenosti do datab´aze (to i v pˇr´ıpadˇe, kdyˇz v datab´azi byla star´a hodnota). Je na autorovi, kter´ y skript pouˇz´ıv´a, jakou pˇresnost a rychlost zvol´ı.
4.2
Bagrov´ an´ı
Zat´ımco pˇredchoz´ı ˇc´ast (4.1) se vˇenovala sp´ıˇse teoretick´emu a algoritmick´emu zlepˇsen´ı odpov´ıdaj´ıc´ı prvn´ımu c´ıli t´eto pr´ace, n´asleduj´ıc´ı ˇc´asti se zamˇeˇr´ı na praktiˇctˇejˇs´ı a viditelnˇejˇs´ı chov´an´ı ent˚ u. Pˇri hled´an´ı cesty po jedn´e m´ıstnosti se pouˇz´ıval algoritmus A* i v p˚ uvodn´ı verzi ENT˚ U. V nˇ ekter´ ych pˇr´ıpadech vˇsak nefungoval spr´avnˇe. Pˇr´ıkladem je situace, kdy byla cesta na c´ılovou dlaˇzdici zahrazena pˇredmˇety, kter´e lze sebrat. Kdyˇz m´a ˇclovˇek zablokovanou chodbu vˇecmi, posb´ır´a je, pˇrem´ıst´ı a chodbu tak uvoln´ı. Tohoto vˇsak enti nebyli schopni. N´aprava byla pomˇernˇe jednoduch´a. Z´asah vyˇzadoval algoritmus A* tak, aby zaplnˇen´e dlaˇzdice spr´avnˇe penalizoval, ale aby cestu pˇres nˇe dok´azal naj´ıt. Ve skriptu, kter´ y m´a na starosti vlastn´ı pohyb, pak jiˇz staˇcilo pˇridat schopnost nejdˇr´ıve pˇredmˇety posb´ırat, pokud se ent na napl´anovanou dlaˇzdici nevejde. S pohybem po m´ıstnosti souvis´ı i dalˇs´ı podprobl´em. Pokud se enti chtˇeli dostat na dlaˇzdici ve stejn´e m´ıstnosti, ve kter´e st´ali, hledali cestu pouze po t´eto aktu´aln´ı m´ıstnosti. Jestliˇze je vˇsak m´ıstnost zatarasena pˇredmˇety, m˚ uˇze b´ yt v´ yhodnˇejˇs´ı pouˇz´ıt okoln´ı m´ıstnosti a pˇrek´aˇzku obej´ıt jinudy. Probl´em byl postupnˇe vyˇreˇsen dvˇema zp˚ usoby. Prvn´ı testuje cesty okoln´ımi m´ıstnostmi v pˇr´ıpadˇe, ˇze cesta pˇres aktu´aln´ı je delˇs´ı neˇz dvojn´asobek Manhat-
Obr´azek 4.3: Bagruj´ıc´ı ent
28
tansk´e vzd´alenosti. Postupnˇe zkouˇs´ı cesty vˇsemi dveˇrmi, zda-li nem˚ uˇze b´ yt kratˇs´ı. V kladn´em pˇr´ıpadˇe enta poˇsle touto cestou, nenajde-li ˇz´adnou kratˇs´ı cestou, ent se vyd´a aktu´aln´ı m´ıstnost´ı. Druh´ y pˇr´ıstup vyuˇz´ıv´a algoritmu z pˇredchoz´ı ˇc´asti. Upraven´ım skriptu pro hled´an´ı cesty mezi r˚ uzn´ ymi m´ıstnostmi jsme z´ıskali obecnˇejˇs´ı variantu, kter´a umoˇzn ˇuje hledat cestu mezi kter´ ymikoli dlaˇzdicemi, tedy i dlaˇzdicemi jedn´e m´ıstnosti. Bere pˇri tom v u ´vahu i cesty pˇres m´ıstnosti okoln´ı, na coˇz pouˇz´ıv´a uvedenou u ´pravu algoritmu A*.
4.3
Pron´ asledov´ an´ı
´ Ukolem skriptu jdiKEntovi/2 je enta dov´est k jin´emu specifikovan´emu entovi (d´ale obˇeti“). V p˚ uvodn´ı verzi se snaˇzil enta nasmˇerovat vˇzdy pˇr´ımo na svoji ” ’ obˇet . Pokud se hnula, skript pˇrepl´anoval cestu na novou pozici a ent vyrazil nov´ ym smˇerem. Pokud ale budeme zkoumat chov´an´ı lid´ı, zjist´ıme, ˇze v mnoha pˇr´ıpadech sv´e obˇeti nadbˇehnou a zkr´at´ı si tak cestu, zvl´aˇstˇe pak v pˇr´ıpadˇe, kdy se jim jejich c´ıl nesnaˇz´ı ut´eci. V ent´ım svˇetˇe ˇctyˇrsmˇern´ ych dlaˇzdic to lze vyj´adˇrit pˇresnˇeji. Oznaˇc´ıme-li • zmˇenu souˇradnic, o kter´e se zmˇen´ı pozice naˇs´ı obˇeti za jedno kolo, jako (o∆x , o∆y ), kde o∆x , o∆y ∈ {−1, 0, 1}, |o∆x + o∆y | = 1, • pozici obˇeti jako (ox , oy ), • a pozici naˇseho enta jako (ex , ey ), lze v dan´e m´ıstnosti alespoˇ n trochu nadbˇehnout pokud sgn(ex − ox ) = sgn(o∆x ) 6= 0 ∨ sgn(ey − oy ) = sgn(o∆y ) 6= 0. Pouˇzijeme techniku pron´asledov´an´ı“ (v orig. “pursuit”) popsanou v [12] ” a upravenou pro prostˇred´ı ˇctyˇrsmˇern´ ych dlaˇzdic. Z pozice obˇeti v aktu´aln´ım a pˇredchoz´ım kole lze odhadnout, kudy se naˇse obˇet’ bude pohybovat, pokud se nezastav´ı ani nezmˇen´ı smˇer. Nebo pˇresnˇeji, za kolik kol bude na kter´e dlaˇzdici. Pokud je splnˇena v´ yˇse uveden´a podm´ınka, je moˇzn´e z t´eto informace snadno spoˇc´ıtat pravdˇepodobn´e m´ısto stˇretu, na kter´e m˚ uˇzeme naˇseho enta poslat (viz obr´azek 4.4). 29
Pokud uveden´a podm´ınka splnˇena nen´ı, lze jeˇstˇe zkusit jinou moˇznost, a to odhadnout dveˇre, do kter´ ych naˇse obˇet’ m´ıˇr´ı. Jestliˇze ent bude schopn´ y dorazit do vedlejˇs´ı m´ıstnosti dˇr´ıve neˇz obˇet’, zkus´ı j´ı nadbˇehnout sousedn´ımi dveˇrmi. Jestliˇze selˇze i tato moˇznost, nezb´ yv´a neˇz se vydat pˇr´ımo za naˇs´ı obˇet´ı s t´ım, ˇze j´ı tˇreba bude moˇzn´e nadbˇehnout pozdˇeji. intersection
target
ent
Obr´azek 4.4: Pron´asledov´an´ı – m´ısto stˇretu
4.4
Vyh´ yb´ an´ı se ostatn´ım ent˚ um
V p˚ uvodn´ı verzi se enti pˇri pl´anov´an´ı cesty pˇres m´ıstnost snaˇzili vyhnout pouze dlaˇzdic´ım, na kter´ ych ve chv´ıli hled´an´ı nˇekdo st´al. To vˇsak bylo zvl´aˇstˇe na delˇs´ı vzd´alenosti t´emˇeˇr bezpˇredmˇetn´e – situac´ı, kdy se ciz´ı enti neh´ ybou, je v jejich ˇzivotˇe jen m´alo. Naˇse metoda na zlepˇsen´ı vych´az´ı z postupu uveden´eho, stejnˇe jako v pˇredchoz´ım pˇr´ıpadˇe, v [12], konkr´etnˇe pˇredch´azen´ı koliz´ım“ (v orig. “unaligned ” collision avoidance”). Odhadnou se m´ısta, kde by mohlo doj´ıt ke koliz´ım (pokud se ciz´ı enti budou pohybovat stejnˇe jako v posledn´ım kole), a ent se bude snaˇzit vyhnout tˇemto m´ıst˚ um oˇcek´avan´e sr´aˇzky. Prvn´ı ˇc´ast ˇreˇsen´ı je do jist´e m´ıry analogick´a s pˇredchoz´ım pˇr´ıpadem: sledov´an´ı ostatn´ıch ent˚ u v m´ıstnosti a odhad toho, kter´ ym smˇerem p˚ ujdou. Dobˇre n´am pˇri tom poslouˇz´ı jazyk E a jeho interrupty, kter´e dovol´ı sledovat pohyb ostatn´ıch ent˚ u bez enormn´ıho mnoˇzstv´ı test˚ u a podm´ınek. V dalˇs´ım kroku se pak pozice a smˇery, kter´ ym ostatn´ı enti jdou, pˇredaj´ı v´ ypoˇctov´ ym Mercury-funkc´ım, kter´e odhadnou budouc´ı cesty ostatn´ıch ent˚ u a vypoˇcten´e dlaˇzdice v pˇr´ısluˇsn´ ych kolech pˇri prohled´av´an´ı algoritmem A* penalizuj´ı. T´ım je dosaˇzeno poˇzadovan´eho chov´an´ı – dlaˇzdice, na kter´e m´ıˇr´ı ostatn´ı enti, A* nevybere a ent se jim tedy vyhne. 30
4.5
On-line hled´ an´ı
Pokud chce ent naj´ıt urˇcit´ y pˇredmˇet, nejdˇr´ıve se pod´ıv´a do sv´e datab´aze. Jestliˇze tam odpov´ıdaj´ıc´ı pˇredmˇet najde, jde tam, kde si mysl´ı, ˇze je, a vezme ho. V pˇr´ıpadˇe, ˇze o ˇz´adn´em takov´em nev´ı, vyraz´ı na proch´azku cel´ ym svˇetem a snaˇz´ı se naj´ıt nˇejak´ y splˇ nuj´ıc´ı dan´a krit´eria. Tato pr´ace pˇredstavuje jeˇstˇe jin´ y pˇr´ıstup k hled´an´ı vˇec´ı, kter´e (zat´ım) ent nevid´ı. Dal by se nazvat napˇr´ıklad hled´an´ı mimodˇek“. Hlavn´ı myˇslenka tkv´ı v tom, ” ˇze ent pˇredmˇety aktivnˇe nehled´a, ale sb´ır´a aˇz v okamˇziku, kdy je uvid´ı pˇri nˇejak´e jin´e ˇcinnosti. Ent si udrˇzuje seznam pˇredmˇet˚ u (pˇresnˇeji superseznam member˚ u popisuj´ıc´ıch pˇredmˇety), kter´e by r´ad naˇsel. Z´aroveˇ n si nastav´ı glob´aln´ı interrupt, kter´ y spust´ı sb´ır´an´ı pˇredmˇet˚ u aˇz ve chv´ıli, kdy nˇejak´e hledan´e vid´ı. Pro uˇzivatele–program´atora jsou k dispozici skripty, kter´e pˇredmˇety pˇrid´avaj´ı a ub´ıraj´ı ze seznamu hledan´ ych. V podstatˇe v kaˇzd´e chv´ıli lze tak´e zjistit, kter´e pˇredmˇety uˇz ent sebral a kter´e jeˇstˇe na sebr´an´ı ˇcekaj´ı. Uplatnˇen´ı v praktick´ ych skriptech najde jak verze nov´a, tak i p˚ uvodn´ı. Nˇekter´e vˇeci ent potˇrebuje nutnˇe a dalˇs´ı ˇcinnost se bez nich neobejde (potˇrebuje-li si ent uvaˇrit j´ıdlo, neobejde se bez surovin k jeho v´ yrobˇe). V jin´ ych pˇr´ıpadech je vˇsak moˇzn´e hled´an´ı doˇcasnˇe pˇreruˇsit, zaˇc´ıt dˇelat nˇeco jin´eho a mezit´ım se pokusit pˇredmˇety naj´ıt. Napˇr´ıklad hudebn´ık˚ uv hlavn´ı u ´kol je chodit po m´ıstnostech a hr´at. R˚ uzn´e hudebn´ı n´astroje si m˚ uˇze navˇesit do sv´eho on-line hledaˇce“, v klidu po” kraˇcovat v hran´ı na p˚ uvodn´ı n´astroj a nov´ y sebrat aˇz v okamˇziku, kdyˇz se k nˇemu dostane.
Obr´azek 4.5: Sc´ena s vyh´ yb´an´ım tˇr´ı ent˚ u
31
Kapitola 5 Implementace a modelov´ e situace 5.1
Hierarchick´ e hled´ an´ı cest
Programovac´ı jazyk Zlepˇsen´ı efektivity hled´an´ı cest a v´ ybˇer a implementace nov´ ych prohled´avac´ıch algoritm˚ u je kl´ıˇcovou ˇc´ast´ı t´eto pr´ace. Jak jsme jiˇz naznaˇcili dˇr´ıve, vˇetˇsina zmˇen se odehr´ala ve zdrojov´ ych souborech jazyka Mercury. Mercury je deklarativn´ı jazyk se silnou kontrolou syntaxe, typ˚ u a druhu determinismu (tzn. jestli a pˇr´ıpadnˇe kolikr´at m˚ uˇze predik´at uspˇet). To jazyku umoˇzn ˇuje odhalit mnoho chyb jiˇz pˇri pˇrekladu a podstatnˇe zv´ yˇsit rychlost v´ ysledn´ ych program˚ u v porovn´an´ı s jin´ ymi deklarativn´ımi jazyky. Jako assembler pouˇz´ıv´a jazyk C, ˇc´ımˇz jsou v´ ysledn´e programy do jist´e m´ıry pˇrenositeln´e. Popsan´e v´ yhody jako rychlost, siln´a kontrola a typov´a ˇcistota jsou zvl´aˇstˇe v´ yrazn´e v˚ uˇci jazyku E. Jazyk E m´a i jin´a omezen´ı: do skriptu napˇr´ıklad nelze pˇredat v´ıce neˇz patn´act promˇenn´ ych, coˇz se vzhledem k pˇrekladu kaˇzd´eho ifvˇetven´ı jako podskriptu uk´azalo pro sloˇzitˇejˇs´ı konstrukce jako do znaˇcn´e m´ıry omezuj´ıc´ı. Vˇse spolu faktem, ˇze nˇekter´e prohled´avac´ı funkce jiˇz byly v Mercury naps´any, bylo krit´eriem pˇri v´ ybˇeru Mercury. Teoreticky by bylo moˇzn´e funkce ps´at i v jin´ ych jazyc´ıch (pˇr´ımo se nab´ızelo C), Mercury vˇsak poskytuje podobnou neprocedur´aln´ı filozofii jako E – typick´ ym pˇr´ıkladem je bezprobl´emov´a pr´ace se seznamy a jejich pˇrevod do/z E. Pˇrestoˇze domovsk´a str´anka projektu Mercury [10] p˚ usob´ı dosti amat´ersk´ ym a nekomerˇcn´ım dojmem, jeho funkˇcnost a mnoˇzstv´ı kontrol, kter´e skuteˇcnˇe prov´ad´ı, pˇresnˇe odpov´ıd´a specifikaci.
32
Jazyk Mercury s sebou pochopitelnˇe pˇrinesl i probl´emy. Typick´ ym pˇr´ıkladem je absence debuggeru a omezenost na v´ ypisy na standardn´ı v´ ystup. Na domovsk´e str´ance je sice uvedeno, ˇze autoˇri ˇz´adn´e lad´ıc´ı prostˇredky nepouˇz´ıvaj´ı, v praxi bychom je ale, mysl´ım, ocenili. Dalˇs´ı probl´emy vypl´ yvaly z propojen´ı s projektem ENTI. Nejv´ıce ˇcasu zaplnila spr´avn´a komunikace s entovou datab´az´ı. Chybˇel pˇr´ıkaz pro z´apis, takˇze bylo potˇreba se ponoˇrit do zdrojov´ ych soubor˚ u nejen Mercury, ale i C++, ve kter´ ym je entova datab´aze naps´ana. Jeˇstˇe n´aroˇcnˇejˇs´ı pak bylo pˇrid´an´ı nov´ ych tzv. smysl˚ u“, ” kter´e byly nutn´e pro reprezentaci grafu pater a uloˇzen´ı absolutn´ıch pozic m´ıstnost´ı – zmˇeny vyˇzadovaly i konfiguraˇcn´ı soubory cel´eho projektu ENTI.
ˇ sen´ı Reˇ Vˇsechny popsan´e probl´emy se podaˇrilo vyˇreˇsit, a tak jiˇz mohla n´asledovat vlastn´ı implementace upraven´eho HPA*. Pˇriˇrazen´ı absolutn´ıch souˇradnic m´ıstnostem zaˇr´ıd´ı funkce cNastavPoziceMistnosti/1 s jedn´ım vstupn´ım argumentem ud´avaj´ıc´ım dlaˇzdici, kter´a bude m´ıt souˇradnice (0, 0, 0) (nejjednoduˇsˇs´ı je pˇredat dlaˇzdici, kde ent pr´avˇe stoj´ı). Tuto funkci je tˇreba zavolat na zaˇc´atku entova ˇzivota, zejm´ena pˇred prvn´ım pouˇzit´ım hledac´ıch funkc´ı. Projde vˇsechny dostupn´e m´ıstnosti a souˇradnice jejich severoz´apadn´ıch roh˚ u uloˇz´ı do entovy datab´aze ke smyslu HSmistnost_abspoziceH ve form´atu [handle–m´ıstnosti, handle–souˇradnice–X, handle–souˇradnice–Y, handle– souˇradnice–Z ]1 . Za kr´atkou pozn´amku stoj´ı, ˇze v uk´azkov´em svˇetˇe, kter´ y je dod´av´an spolu s projektem ENTI, nelze vˇsechny m´ıstnosti d´ıky jejich velikostem do krychlov´e s´ıtˇe spr´avnˇe um´ıstit. Doch´az´ı tak k jejich pˇrekryv˚ um a/nebo zdem tlustˇs´ım neˇz 1 dlaˇzdice. Nen´ı to vˇsak kl´ıˇcov´e – souˇradnice se pouˇz´ıvaj´ı vˇzdy jen pro heuristiku tak, ˇze k dlaˇzdici se zjiˇst’uje souˇradnice, nikoliv naopak. Vlastn´ı nov´e hled´an´ı cesty, vyuˇz´ıvaj´ıc´ı variantu algoritmu A*, maj´ı na starosti dvˇe funkce: cNajdiCestuDvermi/8 a cNajdiCestuDo/8. Z´asadn´ı rozd´ıl je v tom, ˇze druh´a umoˇzn ˇuje hledat cestu nejdˇr´ıve po patrech a teprve n´aslednˇe ji zjemnit na jednotliv´e m´ıstnosti, prvn´ı se d´ıv´a na schody jako na norm´aln´ı dveˇre (viz 4.1, str. 25). Souˇc´ast´ı pr´ace nebylo pouze naps´an´ı funkc´ı nov´ ych, ale i nahrazen´ı p˚ uvodn´ıch funkc´ı bez A* nov´ ymi verzemi. Pˇremostˇeny tak byly star´e funkce 1
handle–souˇradnice“ znamen´a handle ˇc´ısla, kter´e se rovn´a souˇradnici. Napˇr. handle pro ˇc´ıslo ” 0 je totiˇz ve skuteˇcnosti ˇc´ıslo 18120704.
33
cDvereSmeremK/6 a cOdhadVzdalenosti/4 funkc´ı cNajdiCestuDvermi/8 a upraven byl tak´e skript jdiDoMistnosti/1 tak, aby ent nehledal vˇzdy celou cestu znova, jakmile vejde do nov´e m´ıstnosti, ale aby si ji pamatoval a pouˇz´ıval, dokud to jde.
Testy Testov´an´ı prob´ıhalo na poˇc´ıtaˇci s procesorem Intel Mobile Celeron 1.8 GHz a 512 MB operaˇcn´ı pamˇeti v prostˇred´ı Linux Fedora Core 5. Vˇzdy byla provedena tˇri nez´avisl´a mˇeˇren´ı t´ehoˇz nastaven´ı, z kter´ ych se vypoˇc´ıtal aritmetick´ y pr˚ umˇer. Jazyk E by mˇel umoˇzn ˇovat mˇeˇren´ı re´aln´eho ˇcasu, kter´ y ubˇehne v dan´em skriptu, potˇrebn´e funkce (pushtime, poptime) vˇsak nejsou implementov´any. Probˇehlo tedy pouze mˇeˇren´ı v´ ypoˇctov´ ych funkc´ı v Mercury. Aby byly ˇcasy v˚ ubec mˇeˇriteln´e, jeden predik´at probˇehl vˇzdy desetkr´at tˇesnˇe za sebou se stejn´ ymi parametry, ˇcasy jednoho bˇehu lze tedy jednoduˇse spoˇc´ıtat vydˇelen´ım deseti. U kaˇzd´e trasy jsme mˇeˇrili tˇri r˚ uzn´e varianty – jako prvn´ı starou funkci cDvereSmeremK/6, jako druhou a tˇret´ı novou cNajdiCestuDo/8, pˇriˇcemˇz ve druh´em pˇr´ıpadˇe se pouˇzil graf pater (tedy hierarchick´a varianta), ve tˇret´ım nikoliv. Nen´ı zcela jasn´e, do jak´e m´ıry byl mˇeˇren skuteˇcnˇe jen ˇcas, kter´ y byl str´aven v dan´em predik´atu, jestli mˇeˇren´ı ovlivˇ nuj´ı i ostatn´ı bˇeˇz´ıc´ı procesy a jak se do mˇeˇren´ı prom´ıtla vol´an´ı ciz´ıch funkc´ı, napˇr´ıklad hled´an´ı a z´apisy do entovy datab´aze. Pˇresto hlavn´ım v´ ysledkem jsou hodnoty relativn´ı v˚ uˇci sobˇe. Aˇc jsou leckdy pˇrekvapiv´e, maj´ı vypov´ıdaj´ıc´ı hodnotu. Neˇz se vˇsak dostaneme k samotn´emu mˇeˇren´ı, uvˇedomme si, jak´e v´ ysledky m˚ uˇzeme oˇcek´avat. V ˇc´asti 2.2 (str. 11) bylo uvedeno, ˇze HPA* m˚ uˇze b´ yt aˇz desetkr´at rychlejˇs´ı neˇz obyˇcejn´e A* a m˚ uˇze navˇst´ıvit aˇz desetkr´at m´enˇe vrchol˚ u. Nahl´ednut´ım do ˇcl´anku [2] vˇsak zjist´ıme, ˇze tyto v´ ysledky autoˇri namˇeˇrili u cest d´elky cca 400. Uk´azkov´ y svˇet, na kter´em prob´ıhalo testov´an´ı, takov´ ych rozmˇer˚ u zdaleka nedosahuje. Dalˇs´ı zmˇenou je fakt, ˇze vlastnˇe porovn´av´ame algoritmus Dijkstr˚ uv s hierarchick´ ym A*. Prvn´ı fakt ukazuje sp´ıˇse na menˇs´ı zrychlen´ı, druh´ y by mˇel naopak rozd´ıl zvˇetˇsovat. D´a se tedy oˇcek´avat, ˇze zrychlen´ı bude mˇeˇriteln´e, a to v´ yraznˇeji s pˇrib´ yvaj´ıc´ı vzd´alenost´ı startovn´ı a c´ılov´e pozice. V uk´azkov´em svˇetˇe (mapa viz obr´azek 5.1 a 5.2) jsme k testov´an´ı zvolili ˇctyˇri trasy. Vˇsechny vedly z prvn´ıho patra, z toho prvn´ı tˇri z pokoje ˇclovˇeka. Prvn´ı cesta smˇeˇrovala na zahradu, coˇz je pˇribliˇznˇe napˇr´ıˇc cel´ ym svˇetem pˇres vˇsechna tˇri patra, druh´a cesta vedla do knihovny, na coˇz staˇcilo pouze vyj´ıt na chodbu 34
komora
pokoj_cloveka
knihovna dilna
Obr´azek 5.1: Mapa uk´azkov´eho svˇeta: patro a pˇr´ızem´ı
mistnost_s_ _pavucinami
zahrada
Obr´azek 5.2: Mapa uk´azkov´eho svˇeta: sklep
35
a vej´ıt do c´ılov´e m´ıstnosti, tˇret´ı do m´ıstnosti s pavuˇcinami, kter´a je, stejnˇe jako zahrada, ve sklepˇe (ent musel tedy proj´ıt pˇres dvoje schody). Posledn´ı cesta vedla z komory do d´ılny v pˇr´ızem´ı. Horizont´alnˇe jsou m´ıstnosti na opaˇcn´ ych stran´ach domu, ale nejkratˇs´ı cesta vede d´ıky tomu, ˇze schody nejsou pˇresnˇe nad sebou, na prvn´ı pohled oklikou. V tabulce 5.1 jsou uvedeny v´ ysledky mˇeˇren´ı. V prvn´ım sloupci je varianta, jakou se hledalo, v dalˇs´ıch dvou d´elka nalezen´e cesty v dlaˇzdic´ıch a poˇcet m´ıstnost´ı, kter´ ymi proch´az´ı. N´asleduje ˇcas deseti bˇeh˚ u algoritmu v sekund´ach (pr˚ umˇer ze tˇr´ı mˇeˇren´ı), poˇcet navˇst´ıven´ ych vrchol˚ u (vrchol odpov´ıd´a dlaˇzdici pˇrede dveˇrmi) a poˇcet r˚ uzn´ych vrchol˚ u, kter´e algoritmus pˇri sv´em bˇehu navˇst´ıvil. Prvn´ı hled´an´ı, z pokoje ˇclovˇeka na zahradu, dopadlo v z´asadˇe podle oˇcek´av´an´ı. Vzhledem ke stˇredn´ı d´elce hledan´e cesty je jiˇz i pˇres nezanedbatelnou reˇzii, se kterou je (hierarchick´ y) A* spojen, rozd´ıl v ˇcase proti Dijkstrovu algoritmu dobˇre patrn´ y. Mezi hierarchickou a nehierarchickou verz´ı v´ yznamn´ y rozd´ıl nen´ı, coˇz jsme vˇsak ˇcekali – hierarchick´a verze se dle [2] zaˇc´ın´a vypl´acet aˇz od cest d´elky cca 50. V poˇctu navˇst´ıven´ ych vrchol˚ u je rozd´ıl v˚ uˇci star´e verzi algoritmu velmi markantn´ı: hierarchick´a verze jich navˇst´ıvila asi sedmdes´atkr´at m´enˇe, nehierarchick´a pak asi dvaadvacetkr´at m´enˇe. typ poˇc. dlˇz. poˇc. m´ıst. pr˚ umˇer. ˇcas pokoj cloveka → zahrada cDvere 38 6 0.457 cNajdi/2 36 6 0.280 cNajdi/1 38 6 0.277 pokoj cloveka → knihovna cDvere 16 3 0.030 cNajdi/2 16 3 0.243 cNajdi/1 16 3 0.243 pokoj cloveka → mistnost s pavucinami cDvere 43 6 0.623 cNajdi/2 76 9 0.273 cNajdi/1 43 6 0.403 komora → dilna cDvere 36 6 0.323 cNajdi/2 35 6 0.077 cNajdi/1 36 6 0.067
cel. expnd.
r˚ uz. expnd.
10626 150 480
84 15 41
540 90 110
35 9 11
14260 260 2120
88 21 70
7480 320 310
86 25 31
Tabulka 5.1: V´ ysledky test˚ u
36
Na druh´em hled´an´ı bylo pomˇernˇe pˇrekvapiv´e, jak moc m˚ uˇze algoritmus A* na kr´atk´ ych vzd´alenostech ztr´acet v ˇcase. D˚ uvodem m˚ uˇze b´ yt, ˇze naˇse implementace v podstatˇe nebyla optimalizovan´a, pˇresto je rozd´ıl znaˇcn´ y. Poˇcet navˇst´ıven´ ych vrchol˚ u se ukazuje jako podstatnˇe stabilnˇejˇs´ı ukazatel – A* navˇst´ıvil zhruba pˇetinu; hierarchick´a a nehierarchick´a verze se z´asadnˇe neliˇs´ı, nebot’ m´ıstnosti byly ve stejn´em patˇre. Tˇret´ı pˇr´ıklad uk´azal typickou vlastnost hierarchick´eho pˇr´ıstupu. Je sice pˇribliˇznˇe dvaap˚ ulkr´at rychlejˇs´ı a navˇst´ıvil asi jednu pades´atinu vrchol˚ u v˚ uˇci Dijkstrovu algoritmu, d´ıky dˇeravosti“ sklepn´ıho patra (a tud´ıˇz nepˇresn´e heuris” tice) vˇsak nedok´azal naj´ıt nejkratˇs´ı cestu. Nehierarchick´a verze si za cenu pomˇernˇe velk´eho poˇctu navˇst´ıven´ ych vrchol˚ u poradit dok´azala a d´ıky stˇredn´ı vzd´alenosti dok´azala Dijkstr˚ uv algoritmus porazit i v ˇcase. Na posledn´ı trase potvrdil Dijkstr˚ uv algoritmus stabilitu sv´ ych v´ ysledk˚ u a ˇcas ani poˇcet navˇst´ıven´ ych vrchol˚ u nevyboˇcuj´ı z vysledovan´eho chov´an´ı. Lehce zv´ yˇsen´ y poˇcet navˇst´ıven´ ych vrchol˚ u u algoritm˚ u A* se d´a vysvˇetlit nutnost´ı vypoˇr´adat se z faktem, ˇze dlaˇzdice, kter´e sousedily s pouˇzit´ ymi dveˇrmi mezi prvn´ım patrem a pˇr´ızem´ım, jsou v horizont´aln´ım smˇeru cca 6 dlaˇzdic vzd´alen´e. Vysvˇetlen´ı, proˇc se najednou tak v´ yrazn´ ym zp˚ usobem liˇs´ı ˇcas A* algoritm˚ u, se n´am ale nal´ezt nepodaˇrilo. Celkovˇe lze ˇr´ıci, ˇze ve vˇetˇsinˇe pˇr´ıpad˚ u ke zrychlen´ı skuteˇcnˇe doˇslo. Nov´e algoritmy ztr´ac´ı v pˇr´ıpadˇe, ˇze startovn´ı a c´ılov´e pozice jsou bl´ızko sebe. Vezmeme-li ale v u ´vahu, ˇze nov´e skripty vrac´ı cestu celou, nejenom prvn´ı m´ıstnost, zrychlen´ı je na delˇs´ıch cest´ach ve skuteˇcnosti jeˇstˇe v´ yraznˇejˇs´ı a na kr´atk´ ych se pravdˇepodobnˇe v´ ysledky vyrovnaj´ı, takˇze naˇse pr´ace mˇela smysl.
5.2
Bagrov´ an´ı
Aby enti dok´azali nach´azet a spr´avnˇe zvaˇzovat n´aroˇcnost cesty pˇres zaplnˇen´e dlaˇzdice, bylo potˇreba zmˇenit predik´at cSmerKDlazdici/7. P˚ uvodn´ı verze algoritmu A* ignorovala dlaˇzdice, kam se ent neveˇsel. Dalˇs´ı zmˇena pak byla ve skriptu jdiNaDlazdici/5, kter´ y potˇreboval upravit tak, aby dok´azal z pln´e dlaˇzdice nejdˇr´ıve pˇredmˇety posb´ırat. Dalˇs´ı podprobl´em, schopnost uvaˇzovat i cesty okoln´ımi m´ıstnostmi, jsme nejdˇr´ıve ˇreˇsili pouze ve skriptu jdiNaDlazdici/5. Jak jiˇz bylo naznaˇceno v ˇc´asti 4.2 (str. 28), pokud je cesta pˇres aktu´aln´ı m´ıstnost velmi dlouh´a (delˇs´ı neˇz 37
dvojn´asobek teoreticky nejkratˇs´ı vzd´alenosti), zkouˇs´ı se postupnˇe cesty pˇres vˇsechny dveˇre i m´ıstnostmi sousedn´ımi. Druh´e ˇreˇsen´ı se nab´ıdlo po zlepˇsen´ı prohled´av´an´ı cest mezi r˚ uzn´ ymi m´ıstnostmi pomoc´ı A*. Pouˇzijeme-li na projit´ı m´ıstnosti skript jdiDoMistnosti/1, prohled´avac´ı funkce cNajdiCestuDo/8 bude zkouˇset okoln´ı m´ıstnosti automaticky. Na pˇriloˇzen´em CD je video geometrie.avi, kter´e demonstruje dosud popsan´a zlepˇsen´ı. Zelen´ y ent je ent ovl´adan´ y poˇc´ıtaˇcem. Modro-ˇzlut´ y je ovl´ad´an uˇzivatelem, jeho pohyb je nutn´ y, aby bylo vidˇet chov´an´ı strojov´eho enta a nebudeme se ´ j´ım d´ale zab´ yvat. Ukol zelen´eho enta je doj´ıt z dlaˇzdice t´emˇeˇr v nejpravˇejˇs´ım rohu (souˇradnice (2, 5), viz obr´azek 5.3) do t´emˇeˇr nejlevˇejˇs´ıho rohu (8, 2) a pot´e zase zpˇet. Cestu m´a zahrazenou kybl´ıky a konvemi, a tak nastane pˇr´ıpad, kdy je spoˇc´ıtan´a cesta pˇres aktu´aln´ı m´ıstnost velmi dlouh´a. Zkus´ı tedy cestu pˇres okoln´ı m´ıstnosti a zjist´ı, ˇze existuje a mohla by b´ yt kratˇs´ı. Na c´ılovou dlaˇzdici tedy dojde pˇres sousedn´ı m´ıstnost. Pˇri pl´anov´an´ı cesty v sousedn´ı m´ıstnosti si zapamatuje vzd´alenost mezi dveˇrmi, kter´a je d´ıky ˇzidl´ım pomˇernˇe velk´a, a tak kdyˇz ent pl´anuje zp´ateˇcn´ı cestu (8, 2) → (2, 5), radˇeji sesb´ır´a pˇredmˇety v aktu´aln´ı m´ıstnosti, protoˇze uˇz v´ı, jak daleko je to d´ıky ˇzidl´ım pˇres m´ıstnost sousedn´ı. Start
Goal
Obr´azek 5.3: Topologie m´ıstnost´ı v pˇr´ıkladu z videa na CD
5.3
Pron´ asledov´ an´ı
Z´akladn´ı kostra skriptu jdiKEntovi/2 z˚ ustala stejn´a, zmˇenila se ale ˇc´ast, kter´a se star´a o dojit´ı aˇz k entovi v aktu´aln´ı m´ıstnosti. Skript kombinuje pl´anovac´ı pˇrednosti jazyka E a na poˇcetn´ı v´ ykony vol´a funkce napsan´e v Mercury. Skript navˇes´ı interrupt, kter´ y sleduje pohyb obˇeti. Z jej´ı pozice v pˇredchoz´ım a aktu´aln´ım kole zjiˇst’uje smˇer, kter´ ym se obˇet’ za posledn´ı kolo hnula. Zjist´ı-li 38
ent, ˇze obˇet’ zmˇenila smˇer, spust´ı cel´ y skript znovu a pˇrepl´anuje cestu. Pokud ent v´ı, kam obˇet’ smˇeˇruje, zjist´ı, jestli j´ı m˚ uˇze nadbˇehnout (vzorec viz ˇc´ast 4.3, str. 29). V kladn´em pˇr´ıpadˇe spoˇc´ıt´a jej´ı cestu a vyraz´ı na nejlepˇs´ı pol´ıˇcko tak, aby j´ı co nejdˇr´ıve potkal. Jestliˇze nadbˇehnout nem˚ uˇze, zkus´ı zjistit, nelze-li doj´ıt kratˇs´ı ’ cestou do m´ıstnosti, kam obˇet m´ıˇr´ı. Najde dveˇre, kter´e jsou nejbl´ıˇz pr˚ useˇc´ıku jej´ı cesty s nejbliˇzˇs´ı stˇenou. Spoˇc´ıt´a dvˇe vzd´alenosti: vzd´alenost d1 obˇeti od tˇechto dveˇr´ı a vzd´alenost d2 pr˚ useˇc´ıku jej´ı cesty se stˇenou od dan´ ych dveˇr´ı. Pomoc´ı podm´ınky (5 − 2d1 ) + (5 − 2d2 ) > 0 zkus´ı odhadnout, maj´ı-li dveˇre ˇsanci na to, ˇze do nich obˇet’ skuteˇcnˇe m´ıˇr´ı. Jestliˇze je podm´ınka splnˇena, ent zjist´ı, m˚ uˇze-li doj´ıt do stˇredu m´ıstnosti, kam m´ıˇr´ı tyto dveˇre, kratˇs´ı cestou. Jestliˇze ano, zkus´ı nadbˇehnout takto. Jestliˇze ne, nezb´ yv´a, neˇz se vydat pˇr´ımo za obˇet´ı. Dvˇe pˇripraven´a videa ukazuj´ıc´ı obˇe popsan´e situace, kdy ent m˚ uˇze obˇeti nadbˇehnout, najdete na CD disku. Zelen´ y ent je strojov´ y a snaˇz´ı se dohnat modroˇzlut´eho enta ovl´adan´eho uˇzivatelem. Prvn´ı video, nadbihani_1.avi, pˇredstavuje pˇr´ıpad, kdy ent m˚ uˇze sv´e obˇeti nadbˇehnout a vyuˇz´ıt tak sv´e poziˇcn´ı v´ yhody i kdyˇz obˇet’ mˇen´ı smˇer. Dobˇre je patrn´e, ˇze entovy reakce jsou o kolo zpoˇzdˇeny, nebot’ mus´ı nejdˇr´ıve zjistit, kam obˇet’ m´ıˇr´ı. Na druh´em videu, nadbihani_2.avi, je uk´azka u ´spˇeˇsn´eho odhadu, do kter´ ych dveˇr´ı obˇet’ m´ıˇr´ı, a n´asledn´e nadbˇehnut´ı kratˇs´ı cestou.
5.4
Vyh´ yb´ an´ı se ostatn´ım ent˚ um
Abychom mohli sledovat pohyb ostatn´ıch ent˚ u v m´ıstnosti, navˇes´ıme ve skriptu jdiNaDlazdici/5 podobn´ y interrupt jako v pˇredchoz´ım pˇr´ıpadˇe. Bude se spouˇstˇet ve chv´ıli, kdy existuj´ı enti, kteˇr´ı jsou bl´ıˇze neˇz zadan´ y polomˇer – na enty, kteˇr´ı jsou d´ale, se nebere ohled. Z test˚ u vyˇsla pro polomˇer nejl´epe hodnota 4, nebot’ je-li to m´enˇe, ent nestaˇc´ı uhnout, je-li to v´ıce, zbyteˇcnˇe se zatˇeˇzuje procesor, nav´ıc se pohyb sledovan´ ych ent˚ u m˚ uˇze pˇred stˇretem jeˇstˇe dosti zmˇenit. Pozice a smˇery takto sledovan´ ych ent˚ u se pˇredaj´ı funkci cSmerKDlazdici/7, kter´a spoˇc´ıt´a pravdˇepodobn´e cesty ent˚ u. Dlaˇzdice, po kter´ ych enti zˇrejmˇe p˚ ujdou, v pˇr´ısluˇsn´ ych kolech penalizuje. Pˇri testov´an´ı jsme zjistili, ˇze penalizovat pouze dlaˇzdici, na kter´e ent bude v pˇr´ısluˇsn´em kole, nestaˇc´ı. Je to t´ım, ˇze nen´ı d´ano poˇrad´ı, v jak´em enti vykonaj´ı sv´e atomick´e instrukce, a nav´ıc ent pˇri sv´em kroku ˇcasto blokuje p˚ uvodn´ı i c´ılovou dlaˇzdici najednou. Je tedy potˇreba omezit dlaˇzdici pˇred i za tou, kterou odhadnou v´ ypoˇcetn´ı funkce. 39
Pˇriloˇzen´e CD obsahuje video vyhybani.avi, kter´e popsan´e zlepˇsen´ı ukazuje n´azornˇeji. Dva strojov´ı enti jdou proti sobˇe, tˇret´ı, lidsk´ y, kolmo na jejich smˇer. V pˇr´ıpadˇe prvn´ıho vyh´ yb´an´ı je moˇzn´e pozorovat jev, kter´ y zn´ame i z chov´an´ı lid´ı: enti se snadnˇeji vyh´ ybaj´ı tˇem, kteˇr´ı jdou kolmo. Jdou-li enti pˇr´ımo proti sobˇe, m˚ uˇze se st´at, ˇze se zaˇcnou vyh´ ybat na stejnou stranu. N´aslednˇe ale obˇcas radˇeji kolo poˇckaj´ı, neˇz vyraz´ı na jiˇz navˇst´ıven´e dlaˇzdice, takˇze se pomˇernˇe snadno vz´ajemnˇe obejdou.
5.5
On-line hled´ an´ı
Entovy skripty byly rozˇs´ıˇreny o tˇri nov´e. Prvn´ı z nich nese n´azev hledejASbirejLazy_Pridej/2. Vytvoˇr´ı nebo rozˇs´ıˇr´ı seznam pˇredmˇet˚ u, kter´e ent bude l´ın´ ym“ zp˚ usobem hledat (popsan´ ym v kapitole 4.5 na str. 31). Jedinou ” moˇznost´ı, jak tento seznam (pˇresnˇeji superseznam) reprezentovat, byly glob´aln´ı promˇenn´e. Je potˇreba, aby byl pˇr´ıstupn´ y z v´ıce r˚ uzn´ ych skript˚ u – entova datab´aze ani fakta pouˇz´ıt nelze, protoˇze do nich lze ukl´adat pouze typ handle, nikoliv seznam nebo superseznam. Druh´a a tˇret´ı funkce hledejASbirejLazy_Uber/1 a hledejASbirejLazy_VsechnoZrus/0 jsou opakem funkce prvn´ı, maj´ı na starosti pˇredmˇety ze seznamu ub´ırat. Pˇr´ıklad pouˇzit´ı m˚ uˇzeme nal´ezt v uk´azce on-line-hled.avi na vloˇzen´em CD. Stejnˇe jako v ostatn´ıch pˇr´ıpadech je ˇzluto-modr´ y ent ovl´ad´an uˇzivatelem a druh´ y, tentokr´at hnˇedo-b´ıl´ y, je ent strojov´ y. Jeho u ´kolem je proj´ıt vˇsechny m´ıstnosti a v kaˇzd´e kr´atce zahr´at na vˇsechny hudebn´ı n´astroje, kter´e v t´e chv´ıli m´a. Jeˇstˇe pˇred cestou do prvn´ı m´ıstnosti, pokoje knihovn´ıka, vˇsak pˇrid´a do sv´eho on-line hledac´ıho seznamu vˇsechny tˇri druhy hudebn´ıch n´astroj˚ u, kter´e ve svˇetˇe ent˚ u existuj´ı: fl´etnu, harmoniku a housle. V pokoji knihovn´ıka uspˇeje podm´ınka glob´aln´ıho interruptu navˇeˇsen´eho skriptem hledejASbirejLazy_Pridej/2 t´ım, ˇze ent uvid´ı housle. Sebere je, zahraje na nˇe a vyd´a se do sousedn´ı chodby. Tam, ani v dalˇs´ı m´ıstnosti, pokoji ˇclovˇeka, ˇz´adn´e nov´e n´astroje nenajde, zahraje tedy pouze na housle. Aˇz v pokoji hudebn´ıka a kuchaˇre najde postupnˇe fl´etnu a harmoniku, takˇze se jeho n´astroj´aˇrsk´ y park rozˇs´ıˇr´ı a v posledn´ı m´ıstnosti si uˇz zahraje na n´astroje vˇsechny tˇri.
40
Kapitola 6 Z´ avˇ er 6.1
Budouc´ı pr´ ace
Obor umˇel´e inteligence se neust´ale rozv´ıj´ı a s rostouc´ım v´ ykonem poˇc´ıtaˇc˚ u se nab´ız´ı mnoho moˇznost´ı, jak chov´an´ı umˇel´ ych bytost´ı d´ale zlepˇsovat. Chceme-li z˚ ustat u pohybov´ ych skript˚ u v projektu ENTI, dalˇs´ı pokraˇcov´an´ı by se mohlo ub´ırat n´asleduj´ıc´ımi smˇery. Optimalizace A* a HPA*. Z test˚ u vyplynulo, ˇze pˇri hled´an´ı velmi kr´atk´ ych cest nov´a implementace s heuristick´ ymi algoritmy zaost´av´a nad p˚ uvodn´ı verz´ı. Obecnˇe plat´ı, ˇze ˇc´ım sloˇzitˇejˇs´ı algoritmus, t´ım vˇetˇs´ı nutn´a reˇzie – toto chov´an´ı je tedy pˇrirozen´e. Pˇresto by jistˇe bylo zaj´ımav´e se v budoucnu pokusit tento deficit odstranit. Dlouhodob´ e sledov´ an´ı obˇ eti. Pˇri pron´asledov´an´ı ent˚ u se nov´e skripty snaˇz´ı co nejdˇr´ıve reagovat na nastal´e zmˇeny v pohybu obˇeti a vˇzdy hledat nejkratˇs´ı cestu na nov´e m´ısto stˇretu. Bez zaj´ımavosti by ale jistˇe nebylo sledovat a odhadovat entovu dlouhodobˇejˇs´ı strategii a pokusit se ji vyuˇz´ıt, napˇr´ıklad k nadb´ıh´an´ı do sousedn´ıch m´ıstnost´ı. Implementovat by se daly i jin´e techniky umˇel´e inteligence jako tzv. reinforcement, tedy na z´akladˇe u ´spˇechu nebo ne´ uspˇechu posledn´ıho postupu upravovat pˇr´ıˇst´ı strategie. Sn´ıˇ zen´ı n´ aroˇ cnosti vyh´ yb´ an´ı. Pokud by se podaˇrilo naj´ıt nˇejak´ y nov´ y zp˚ usob v uchov´av´an´ı vˇetˇs´ıho mnoˇzstv´ı dat, nejl´epe v poli, hardwarov´a n´aroˇcnost vyh´ yb´an´ı 41
by se pravdˇepodobnˇe dala sn´ıˇzit aplikac´ı nˇekter´e z incremental heuristic search methods. Cesta pˇres m´ıstnost by se pak nemusela hledat pˇri kaˇzd´e zmˇenˇe smˇeru druh´ ych ent˚ u cel´a znovu, ale aktualizovat by se mohla jen inkriminovan´a ˇc´ast mapy. Buzen´ı on-line hledac´ım skriptem. Pokud by se do jazyka E doplnilo v dokumentaci uveden´e us´ın´an´ı a probouzen´ı skript˚ u, byla by moˇznost skript z´avisl´ y na sebran´ ych pˇredmˇetech po navˇeˇsen´ı hledan´ ych pˇredmˇet˚ u uspat a po nalezen´ı potˇrebn´eho vybaven´ı opˇet vzbudit. Tento postup by pak spojoval v´ yhody obou nyn´ı dostupn´ ych variant.
6.2
Dalˇ s´ı aplikace
Aˇc se u ´pravou a implementac´ı nov´ ych prohled´avac´ıch algoritm˚ u zab´ yv´a podstatn´a ˇc´ast t´eto pr´ace, jako obecn´e prostˇred´ı pro jejich testov´an´ı se projekt ENTI, dle naˇseho n´azoru, pˇr´ıliˇs nehod´ı. Pathfinding v ENTECH je totiˇz dosti specifick´ y – svˇet je pevnˇe rozdˇelen na m´ıstnosti, enti se pohybuj´ı po pomˇernˇe velk´ ych dlaˇzdic´ıch jen ve ˇctyˇrech smˇerech, je pouˇzit diskr´etn´ı ˇcas, nen´ı vyˇreˇsen´e ukl´ad´an´ı vˇetˇs´ıho mnoˇzstv´ı dat apod. Kdybychom chtˇeli postupovat opaˇcn´ ym smˇerem a pouˇz´ıt n´ami upravenou verzi HPA* v jin´ ych aplikac´ıch, ve vˇetˇsinˇe pˇr´ıpad˚ u bychom asi tak´e narazili na nemal´e mnoˇzstv´ı probl´em˚ u. Jeden pˇr´ınos, se kter´ ym jsme se nesetkali v ˇz´adn´ ych jin´ ych zdroj´ıch, vˇsak tato ˇc´ast pr´ace pˇrinesla: pouˇzit´ı hierarchick´e formy A* na mapy s v´ıce patry. V dneˇsn´ı dobˇe tˇeˇzko najdeme 3D hru, jej´ıˇz svˇet by nebyl v´ıce´ urovˇ nov´ y. I kdyˇz pˇresnˇe nev´ıme, jak ˇreˇs´ı v´ıce pater napˇr´ıklad boti v Unrealu, vˇeˇr´ıme, ˇze n´aˇs pˇr´ıstup je dobr´ ym kandid´atem na zlepˇsen´ı. Pr´avˇe to, co je pro n´ızko´ urovˇ nov´e algoritmy“ nev´ yhodou, je v´ıtan´ ym zjed” noduˇsen´ım v algoritmech u ´rovnˇe vyˇsˇs´ı. Pro pl´anov´an´ı cel´ ych u ´loh a pˇrep´ın´an´ı mezi nimi nab´ız´ı jazyk E praktick´e n´astroje, kter´e spolu s mnoˇzstv´ım zjednoduˇsen´ı (napˇr´ıklad diskr´etn´ı ˇcas i prostor) d´avaj´ı moˇznost soustˇredit se na dan´ y probl´em a nezab´ yvat se implementaˇcn´ımi detaily. Praktick´ y pˇr´ınos pr´ace v jin´ ych programech a aplikac´ıch tedy bude sp´ıˇse v postupech spadaj´ıc´ıch do druh´eho c´ıle pr´ace, tedy ve vˇerohodnˇejˇs´ım chov´an´ı agent˚ u.
42
Pˇr´ıkladem m˚ uˇze b´ yt pron´asledov´an´ı ent˚ u. Popsan´a metoda, kter´a dok´aˇze jednoduch´ ym zp˚ usobem uˇcinit chov´an´ı postav uvˇeˇritelnˇejˇs´ım, by dobˇre mohla naj´ıt uplatnˇen´ı napˇr´ıklad ve strategi´ıch nebo jin´ ych simulac´ıch vyuˇz´ıvaj´ıc´ıch dlaˇzdicov´e mapy.
6.3
Shrnut´ı
Prvn´ım c´ılem pr´ace bylo zrychlen´ı prohled´avac´ıch algoritm˚ u. Abychom ho naplnili, provedli jsme pr˚ uzkum souˇcasn´ ych algoritm˚ u a pˇr´ıstup˚ u, kter´e rozv´ıj´ı z´akladn´ı prohled´avac´ı algoritmus A*. Pr´ace pˇrin´aˇs´ı pˇrehled nejv´ yznamnˇejˇs´ıch z´astupc˚ u. Pro pouˇzit´ı v projektu ENTI byl vybr´an a d´ale upraven HPA*. Je to hierarchick´a u ´prava algoritmu A*, kter´a ve sv´e z´akladn´ı verzi abstrahuje pravideln´e oblasti a stav´ı z nich graf. Tento postup se m˚ uˇze opakovat a lze tak vytvoˇrit z abstrakc´ı hierarchii. Z praktick´ ych test˚ u plyne, ˇze v´ ysledn´ y algoritmus skuteˇcnˇe zrychlen´ı na stˇredn´ıch a delˇs´ıch vzd´alenostech pˇrin´aˇs´ı. Pouˇzit´ı dvou vrstev abstraktn´ıch graf˚ u v´ ysledky jeˇstˇe o m´alo zlepˇsuje, nezaruˇcuje vˇsak nalezen´ı nejkratˇs´ı cesty. Objevil se (do jist´e m´ıry oˇcek´avan´ y) negativn´ı jev – pˇri hled´an´ı kr´atk´ ych cest m˚ uˇze b´ yt nov´ y algoritmus pomalejˇs´ı neˇz p˚ uvodn´ı. To potvrzuje teorii, ˇze nov´e, sloˇzitˇejˇs´ı algoritmy maj´ı vˇetˇs´ı nutnou reˇzii, ˇc´ımˇz se vypl´ac´ı aˇz pˇri rozs´ahlejˇs´ıch probl´emech. Druh´ y c´ıl, vˇerohodnˇejˇs´ı chov´an´ı ent˚ u, se realizoval ve ˇctyˇrech z´akladn´ıch zlepˇsen´ıch. Uvolˇ nov´an´ı cesty zatarasen´e pˇredmˇety, tzv. bagrov´an´ı, funguje rychle a podle pˇredpoklad˚ u. Pˇri pouˇz´ıv´an´ı pˇr´ıbuzn´eho vylepˇsen´ı, hled´an´ı cesty okoln´ımi m´ıstnostmi, je potˇreba opatrnˇe pouˇz´ıvat jeho prvn´ı verzi. Ve sloˇzitˇejˇs´ıch skriptech m˚ uˇze zp˚ usobovat nepˇrirozen´e chov´an´ı napˇr´ıklad t´ım, ˇze se ent bude rychle vracet do m´ıst, kde byl pˇred chv´ıl´ı. V druh´em pˇr´ıstupu k obch´azen´ı, kter´ y pouˇz´ıv´a upraven´ y HPA*, jsme slabiny nenaˇsli. Pron´asledov´an´ı ostatn´ıch ent˚ u prob´ıh´a tak, jak jsme si pˇredstavovali. V nejhorˇs´ım pˇr´ıpadˇe se enti chovaj´ı stejnˇe jako podle p˚ uvodn´ıch skript˚ u, pokud ale obˇet’ ut´ık´a spr´avn´ ym“ smˇerem, zlepˇsen´ı je zˇretelnˇe vidˇet. ” Vyh´ yb´an´ı koliz´ım s ostatn´ımi enty je patrnˇe nediskutabilnˇejˇs´ı ˇc´ast´ı pr´ace. Pravdou je, ˇze enti do sebe nar´aˇz´ı jen ve v´ yjimeˇcn´ ych pˇr´ıpadech. Cena, kter´a je za to zaplacena, je vˇsak pomˇernˇe vysok´a: jiˇz pˇri tˇrech vyh´ ybaj´ıc´ıch se entech m˚ uˇzeme c´ıtit zpomalen´ı chodu cel´eho syst´emu. Mnoˇzstv´ı interrupt˚ u, kter´e je 43
potˇreba dohromady navˇesit, totiˇz roste s druhou mocninou poˇctu ent˚ u v m´ıstnosti. Interrupty v jazyce E, kter´e se zprvu zdaj´ı jako praktick´e zjednoduˇsen´ı, se tak d´ıky mal´e rychlosti zpracov´an´ı st´avaj´ı slabinou. Posledn´ı novou schopnost´ı ent˚ u je tzv. on-line hled´an´ı, neboli hled´an´ı pˇredmˇet˚ u bˇehem jin´ ych ˇcinnost´ı. Z´atˇeˇz procesoru je zv´ yˇsena o jeden kr´atk´ y interrupt, a tak tato ˇc´ast funguje nejen spr´avnˇe, ale i rychle. Z uveden´eho plyne, ˇze i pˇres jist´a negativa, zp˚ usoben´a pˇrev´aˇznˇe implementaˇcn´ımi detaily, byly stanoven´e c´ıle splnˇeny a projekt ENTI tak byl v uveden´ ych bodech skuteˇcnˇe rozˇs´ıˇren a vylepˇsen.
44
Literatura [1] Bojar, O., Brom, C. et al.: Dokumentace studentsk´eho softwarov´eho projektu ENTI. MFF UK, Praha, 2002. [2] Botea, A., M¨ uller, M., Schaeffer, J.: Near Optimal Hierarchical Path-Finding. Journal of Game Development, 1:7–28, 2004. ˇ [3] Capek, K.: R. U. R., Rossum’s Universal Robots. Artur, Praha, 2004. [4] Dijkstra, E. W.: A note on two problems in connection with graphs. Numerische Mathematik 1, 269–271, 1959. [5] Hart, P., Nilsson, N., Raphael, B.: A formal basis for the heuristic determination of minimum cost paths. IEEE Transactions on Systems Science and Cybernetics, Vol. 4, Issue 2, p. 100–107, 1968. [6] Henderson, F. et al.: The Mercury Language Reference Manual. The University of Melbourne, Melbourne, 2002. [7] Higgins, D. F.: Pathfinding Design Architecture, How to Achieve LightningFast A*, AI Game Programming Wisdom. Charles River Media, Inc., 2002. [8] Jansen, M. R., Buro, M.: HPA* Enhancements. University of Alberta, Alberta, 2007. [9] Koenig, S., Likhachev, M.: D* Lite. American Association for AI, Atlanta, Pittsburgh, 2002. [10] The Mercury Project – homepage [online]. [cit. 30.7.2007] Dostupn´ y z WWW:
[11] The Mercury Library Reference Manual. The University of Melbourne, Melbourne, 2002. 45
[12] Reynolds, C. W.: Steering Behaviors For Autonomous Characters [online]. Sony Computer Entertainment America, California, 1999. [cit. 30.7.2007] Dostupn´ y z WWW:
[13] Skalsk´ y, V.: Wolfgang Kempelen: Bratislavsk´y faust [online]. [cit. 31.7.2007] Dostupn´ y z WWW:
[14] Sturtevant, N., Buro, M.: Partial Pathfinding Using Map Abstraction and Refinement. The Twentieth National Conference on Artificial Intelligence and the Seventeenth Innovative Applications of Artificial Intelligence Conference, 2005. [15] Sturtevant, N. R.: Memory-Efficient Abstractions for Pathfinding. American Association for AI (www.aaai.org), Alberta, 2007.
46
Pˇ r´ıloha: Obsah CD Souˇc´ast´ı pr´ace je pˇriloˇzen´ y CD-ROM, kter´ y obsahuje • videa, kter´a ukazuj´ı jednotliv´a zlepˇsen´ı chov´an´ı ent˚ u (popis v textu) • struˇcnou instalaˇcn´ı, uˇzivatelskou a program´atorskou dokumentaci • instalaci projektu ENTI • zdrojov´e soubory, kter´ ymi je potˇreba nahradit nˇekter´e soubory p˚ uvodn´ı • testovac´ı svˇety a skripty, kter´e demonstruj´ı popsan´a vylepˇsen´ı • tuto pr´aci ve form´atu PDF
47