You are on page 1of 5

Slovensk technick univerzita

Fakulta informatiky a informanch technolgi Ilkoviova 3, 842 16 Bratislava 4

Umel inteligencia
Problm 2: 8-hlavolam

Ondrej Galbav Akademick rok: 2012/2013 tudijn odbor: Informatika Cviiaci: Ing. Peter Kajsa, PhD.

Zadanie
Mojou lohou je njs rieenie 8-hlavolamu. Hlavolam je zloen z 8 oslovanch polok a jednho przdneho miesta. Polka je mon presva hore, dole, vavo alebo vpravo, ale len ak je tm smerom medzera. Je vdy dan nejak vchodiskov a nejak cieov pozcia a je potrebn njs postupnos krokov, ktor ved z jednej pozcie do druhej. V rieen mm poui lan hadanie a porovna dve heuristick funkcie: 1. Poet polok, ktor nie s na svojom mieste 2. Set vzdialenost jednotlivch polok od ich cieovej pozcie

Rieenie
Rieenie som implementoval v jazyku C# na platforme .NET. Trieda State reprezentuje uzol a uklad v sebe stav hry. Generuje svoj hash kd na zklade stavu hry. Umouje porovna svoj stav hry s inm stavom hry alebo uzlom. Funkcia IsOperatorPossible vracia, i je mon aplikova dan opertor na zklade polohy przdneho polka. ComputeNewState generuje nov uzol aplikovanm opertora na sasn stav. Trieda Heuristics obsahuje zadan heuristick funkcie. Trieda PuzzleSolver implementuje samotn lan hadanie. Funkcia Solve m ako parametre poiaton stav, cieov stav v podobe uzlov a slo heuristickej funkcie. Skontroluj sa rozmery mrieok stavov a i oba stavy patria do rovnakej polovice stavovho priestoru. Zamedz sa tm zbytonmu rieeniu nerieitenej lohy. Lan hadanie vyuva prioritn frontu (so zaradenm na koniec, pri rovnakej priorite) a slovnk so zoznam u spracovanch stavov. V prpade vyerpania vetkch vygenerovanch uzlov, program oznmi nerieiten lohu a nezacykl sa. To by sa, ale, nemalo sta pri korektnch stavoch a predchdzajcich kontrol ch. Trieda Tools implementuje pomocn funkcionalitu - vpoet kontrolnho stu FNV, porovnanie dvoch pol typu integer a prioritn frontu prebrat zo stackoverflow.com. Pri natan stavu zo sboru sa kontroluje, i stav obsahuje przdne polko a i set vetkch polok je sprvny pre dan rozmery mrieky. i je kad slo zastpen len raz sa v sasnej verzii nekontroluje.

Reprezentcia dajov
Uzol - class State
int[] puzzleState - jednorozmern pole so stavom hry State predecessor - referencia na predchdzajci uzol v ceste int rows, cols - rozmery hracej plochy lastOperator - opertor pouit pre vytvorenie stavu (me by aj Init - napr. poiaton stav natan zo sboru) int steps - dka cesty, v lanom hadan sa daj nepouva int spaceX, spaceY - sradnice przdneho polka pre rchlejie vyhodnotenie aplikovatenosti opertorov

Prioritn fronta - class PriorityQueue


Pouva SortedDictionary<int, Queue> ako loisko. Vytvra separtne fronty pre kad prioritn triedu.

Ukladanie spracovanch uzlov


Pouva Dictionary<int, List<State>>. Pre kad hash uzla (stavu), ktor nemus by uniktny, vytvra zoznam referenci na uzly - rieenie kolzi zreazenm.

Formt sboru
Prv dve sla v sbore uruj poet riadkov a stpcov. Zvyn sla reprezentuj stav, priom riadky stavu s umiestnen za sebou v jednom riadku sboru.

Algoritmus
1. Zisti, i sa poiaton a cieov stav nachdzaj v rovnakej polovici stavovho priestoru. Ak nie, ohls nerieitenos problmu. 2. Vytvor poiaton uzol a vlo ho do prioritnej fronty s najvyou prioritou 3. Opakuj ak prioritn front nie je przdna: a. Vyber najvhodnej uzol z fronty. b. Pridaj ho do zoznamu spracovanch uzlov. c. Ak sa stav aktulneho uzla rovn cieovmu stavu, vyp cestu a ukoni hadanie. d. Pre kad opertor: ak je mon opertor aplikova na aktulny stav, vygeneruj a zara ho do fronty s prioritou vypotanou poda zvolenej heuristickej funkcie. 4. Ohls problm pri rieen problmu.

Spsob testovania
Korektnos vybranch rieen som overil prostrednctvom webovej varianty tejto hry. Vygeneroval som 10 nhodnch vstupov s rozmerom hracej plochy 3x3.

Porovnanie heuristickch funkci


Vstupy hadania pre obe heuristiky (H1, H2).
slo vstupu 1 2 3 4 5 6 7 8 9 10 Vytvoren uzly H1 H2 474 1063 666 463 1258 715 2045 2869 945 1567 483 668 848 2327 2038 2318 1095 373 876 3071 Rozvinut uzly H1 H2 351 812 480 319 922 537 1525 2202 679 1109 359 501 641 1784 1524 1770 800 280 648 2364 Dka cesty H1 H2 80 92 47 49 77 89 84 132 95 83 110 94 75 97 88 68 116 56 84 132 as vpotu [ms] H1 H2 53 29 49 15 56 25 62 58 55 30 54 28 54 49 68 41 62 17 56 58

Poet vytvorench uzlov


3500 3000 2500 2000 1500 1000 500 0 1 2 3 4 5 6 7 8 9 10 H1 H2

Poet rozvinutch uzlov


2500 2000 1500 H1 1000 500 0 1 2 3 4 5 6 7 8 9 10 H2

Dka njdenej cesty


140 120 100 80 H1 60 40 20 0 1 2 3 4 5 6 7 8 9 10 H2

Zaver
Ned sa poveda, ktor heuristick funkcie je vhodnejia pri malom pote vstupov. Vsledky s zvisle od vstupov, niekedy je vhodnejie pota zle umiestnen polka, inokedy vzdialenosti polok do cieovej pozcie. To sa ale ned uri vopred. Algoritmus je schopn riei hlavolam ubovonch MxN rozmerov, avak me by limitovan dostupnou pamou. Algoritmus lanho hadania je mon ahko rozri na A* hadanie, potrebn daje sa v uzloch u ukladaj. Algoritmus sa d urchli porovnvanm cieovho stavu cez hodnotu heuristickej funkcie (a vynechanm porovnvania pol), ktor nadobda hodnotu 0 pri konenom stave. To by vyadovalo premiestni tto kontrolu do asti algoritmu zodpovednej, za generovanie novch uzlov, nakoko daj z heuristickej funkcie nie je dostupn pri vyberan stavu. Alebo je mon upravi implementciu prioritnho frontu, aby vrtil okrem uzla aj jeho prioritu. Tie nie je nutn v kadom stave uklada rozmery hracej plochy, nakoko s nemenn poas hadania.

You might also like