Professional Documents
Culture Documents
UI2
UI2
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
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.
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.