| Definovanie problému SÚlohou je nájsť riešenie hlavolamu Sokoban. Sokoban je chlapík,
 ktorý v sklade presúva debny. Jeho zvláštnosťou je, že sa pohybuje len
 vo dvoch kolmých smeroch – vľavo, vpravo a hore, dole (z nášho pohľadu
 na obrazovke). Debny, ktoré má presunúť, sú také ťažké, že ich dokáže
 len tlačiť. Ak napríklad stojí vľavo od debny, môže ju posunúť doprava
 a on sa zároveň dostane na miesto, kde bola pred tým debna.
 Podmienkou posunu je, že za debnou nesmie byť múr. Ak je debna pri múre,
 sokoban sa nedokáže dostať medzi debnu a múr a od múru ju odtlačiť.
 A ani Sokoban nemôže prechádzať cez stenu.
 Počiatočná pozícia Sokobana je označená písmenom S, cieľová
 pozícia debny je označená XXX (na svetlejšom podklade) a debna je
 označená svojím obrázkom. Svetlomodré štvorčeky predstavujú podlahu,
 tmavošedé štvorčeky a tmavé orámovanie predstavujú múr.
 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | S |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | XXX |  
 
Možné riešenie úlohy je napríklad takéto:
 
 | CHOD_VPRAVO, | CHOD_VPRAVO, | CHOD_VPRAVO, | CHOD_HORE, |  | CHOD_HORE, | CHOD_HORE, | CHOD_VPRAVO, | TLAC_DOLE, |  | TLAC_DOLE, | CHOD_VPRAVO, | CHOD_DOLE, | TLAC_VLAVO, |  | TLAC_VLAVO, | CHOD_HORE, | CHOD_VLAVO, | TLAC_DOLE, |  | TLAC_DOLE, | TLAC_DOLE, | CHOD_VLAVO, | CHOD_DOLE, |  | TLAC_VPRAVO, | TLAC_VPRAVO, | TLAC_VPRAVO, | TLAC_VPRAVO. |  Implementácia SKeď chceme túto úlohu riešiť algoritmami prehľadávania stavového priestoru,
musíme si konkretizovať niektoré pojmy. Uvádzame príklad reprezentácie stavu,
opis operátorov a cieľového stavu.
STAV
Pri riešení tohto problému potrebujeme poznať pozície viacerých objektov,
 ale len Sokoban a debna svoju pozíciu menia. Ak číslujeme od nuly od ľavého
 horného rohu, tak počiatočný stav reprezentuje dvojica (S 3 0) (D 1 4).
 Celý stav hry nám dopĺňajú pozície nehybných objektov – múry a cieľová
 pozícia debny: (M 0 5) (M 0 6) (M 1 0) (M 1 6) (M 2 0) (M 2 1) (M 2 6)
 (M 4 3) (M 4 4) (M 5 3) (M 5 4) (C 6 6). Tieto údaje sú však statické a stačí
 ich mať zapamätané raz.
Cieľový stav sa dosiahne, keď debna má rovnaké súradnice ako cieľová pozícia,
 teda pre tento sklad bude platiť (D 6 6). Pretože Sokoban môže byť z ľubovoľnej
 korektnej strany debny, cieľových stavov môže byť viacero, v tomto prípade
 dva: (S 5 6) (D 6 6) a (S 6 5) (D 6 6).
 
Vstupom algoritmu je počiatočný stav hry a stav nehybných objektov.
 Tým je zároveň definovaná aj pozícia debny v cieľovom stave.
OPERÁTORY
Operátorov je osem – štyri na chôdzu vľavo, vpravo, hore, dolu a štyri na posun
 debny v rovnakých smeroch. Operátory chôdze sú použiteľné, ak v tom smere nie je
 žiadna prekážka – debna, múr alebo okraj skladu. Operátor posunu je použiteľný,
 ak je v tom smere debna a za debnou nie je prekážka.
Najjednoduchšie je definovať, že všetky operátory majú rovnakú váhu – vtedy
 je najlacnejšia cesta definovaná počtom krokov Sokobana. Je ale možné dať
 posúvaniu debny väčšiu váhu, napríklad aspoň dvojnásobnú. Vtedy zvyčajne
 najlacnejšia cesta obsahuje najmenší možný počet posunov debny a až potom sa
 berie do úvahy minimum voľnej chôdze. (Ak by sme chceli zaručiť, aby riešenie
 vždy obsahovalo minimum posunov, museli by sme dať operátory posunu toľkokrát
 drahšie, koľko krokov môže Sokoban urobiť, kým raz posunie debnu – napríklad
 sumu všetkých voľných políčok.) Tu však vzniká problém, že algoritmom sa do
 tlačenia debny „nechce“ a generujú veľké podstromy prehľadávania stavového priestoru.
UZOLAko v probléme 2
ALGORITMUSAko v probléme 2
HEURISTIKA
Pretože stavový priestor tohto problému je obrovský, je nevyhnutné použiť
 informované prehľadávanie s dobrou heuristikou. Heuristika musí tiež
 eliminovať vysokú cenu operátorov posunu zodpovedajúcim bonusom. To znamená,
 že vzdialenosť debny od cieľa je zdanlivo niekoľkokrát väčšia ako vzdialenosť
 Sokobana od debny.
Pri návrhu riešenia je vhodné vziať do úvahy, že keď je debna pri stene,
 Sokoban ju od steny nedostane, ak tá stena sama niekde nekončí. A keď je
 debna dvomi stranami pri stene, nemá zmysel generovať nasledovníkov (Sokoban
 nemusí pobehovať okolo), lebo debnu už zaručene nie je možné presunúť do
 cieľa. (Ak už v tom cieli samozrejme nie je.)
 
 
 |