160 likes | 285 Views
Umělá inteligence. Stavový prostor. „Opakování“. Existují úlohy, pro které není k dispozici univerzální algoritmus řešení různé hry problém batohu, problém obchodního cestujícího Přesto je člověk schopen je řešit lidské řešení je nedeterministické musíme mít znalosti o problému
E N D
Umělá inteligence Stavový prostor
„Opakování“ • Existují úlohy, pro které není k dispozici univerzální algoritmus řešení • různé hry • problém batohu, problém obchodního cestujícího • Přesto je člověk schopen je řešit • lidské řešení je nedeterministické • musíme mít znalosti o problému • musíme znát strategie • nedokážeme řešení úlohy zapsat jako sekvenci opakujících se kroků • on-line úlohy
„Opakování“ • Pokud nedokážeme úlohu algoritmizovat, můžeme zkusit všechny možnosti (brute-force) • Příklad: piškvorky • při pokusu o algoritmizaci strategie zjistíme, že algoritmus roste se složitostí úlohy • pro 3×3 potřebujeme jiný algoritmus než pro 5×5 • počet variant tahů roste faktoriálem • → nelze zkoušet všechny možnosti • nejjednodušší strategie – blokování • nevede k cíli, a její implementace je netriviální • úlohu je potřeba řešit zcela jinak
Co s tím? • Řešením je převést (libovolnou) úlohu do stavového prostoru • definujeme stavy – situace, ve kterých se může řešení problému nacházet • přechody mezi stavy – operace pro transformaci jednoho stavu na druhý • často velmi abstraktní • řešení úlohy = nalezení požadovaného stavu a cesty k němu ve stavovém prostoru • stavový prosto reprezentujeme pomocí grafu
Strategie prohledávání • prohledávání do hloubky • prohledávání do šířky • hledání prvního nejlepšího • A* • algoritmy iterativního vylepšování • simulované žíhání, gradientní sestup • nedeterministické algoritmy • neuronové sítě • genetické algoritmy • …
Vsuvka • paměťová náročnost • počet stavů, které musíme prohledat • začínáme pesimistickými odhady • musíme prohledat všechny stavy • pak optimalizujeme • časová náročnost • rychlost jakou roste počet operací, které musíme provést • máme algoritmus s časovou složitostí O(n2) • vyzkoušíme zpracovat 100 stavů • jak dlouho bude trvat zpracování 106 stavů?
Prohledávání do šířky • Seznam OPEN a CLOSED • Seznam OPEN je fronta (FIFO) • Zapiš počáteční stav do seznamu OPEN, seznam CLOSED je prázdný. Je-li počáteční stav současně stavem cílovým, ukonči prohledávání. • Pokud je seznam OPEN prázdný, řešení neexistuje, ukonči prohledávání. • Vymaž první stav (označíme jej i) v seznamu OPEN a zapiš tento stav do seznamu CLOSED. • Expanduj stav i. Pokud tento stav nemá následovníky nebo všichni následovníci byli již expandování (tj. jsou v seznamu CLOSED), pokračuj krokem č. 2. • Zapiš všechny následovníky stavu i, kteří nejsou v seznamu CLOSED na konec seznamu OPEN. • Pokud některý z následovníků stavu i je cílovým stavem, řešení bylo nalezeno, ukonči prohledávání. Jinak pokračuj krokem č. 2.
Prohledávání do šířky • Výhodou prohledávání do šířky je to, že tímto postupem najdeme nejprve nejdříve dosažitelné cílové stavy. • Tedy najdeme nejkratší cestu z výchozího do cílového stavu. • Piškvorky 3×3 je možné skončit po 5 až 9 tazích • prohledáváním do šířky nalezneme nejprve výherní stavy dosažitelné po 5 tazích. • Nevýhodou prohledávání do šířky je nutnost udržovat seznam uzlů OPEN, což vede k velké paměťové náročnosti algoritmu.
Prohledávání do hloubky • Seznam OPEN je zásobník (LIFO) • Zapiš počáteční stav do seznamu OPEN, seznam CLOSED je prázdný. Je-li počáteční stav současně stavem cílovým, ukonči prohledávání. • Pokud je seznam OPEN prázdný, řešení neexistuje, ukonči prohledávání. • Vymaž první stav (označím jej i) v seznamu OPEN a zapiš tento stav do seznamu CLOSED. • Pokud se hloubka uzlu i rovná maximální přípustné hloubce, pokračuj krokem č.2. • Expanduj stav i. Pokud tento stav nemá následovníky nebo všichni byli již expandováni (tj. jsou v seznamu CLOSED), pokračuj krokem č.2. • Zapiš všechny následovníky stavu i, kteří nejsou v seznamu CLOSED, na začátek seznamu OPEN. • Pokud některý z následovníků stavu i je cílovým stavem, řešení bylo nalezeno, ukonči prohledávání. Jinak pokračuj krokem č.2.
Prohledávání do hloubky • Výhoda– realizace rekurzivní funkcí – není nutné pracovat se seznamem OPEN (zásobník programu). • Rychleji najde nějaké řešení (ne nutně nejlepší) • Toto je velmi významná výhoda v případě omezených zdrojů - lze prohledávání ukončit dříve než prohledávání do šířky. • Zvolíme cestua v případě, že nenajdeme cílový stav, vrátíme se do výchozího stavu a začneme znovu jinou cestou. • Postupy navracení do výchozího stavu se nazývá backtracking.
Optimalizace • Neinformované prohledávání je funkční, ale neefektivní • Znalosti o problému a strategie transformujeme na informovaný výběr stavů, které budou prohledány dříve • Nejjednodušší strategie: hledání prvního (očekávaného) nejlepšího (greedysearch) • prohledávání do hloubky • Zvolíme nadějnou cestua v případě, že nenajdeme cílový stav, vrátíme se do výchozího stavu a začneme znovu jinou cestou
Hledání prvního nejlepšího • minimalizace odhadované ceny dosažení cíle. • prvně je expandován uzel, který se zdá být nejblíže cíli • náklady na dosažení cíle z nějakého okamžitého stavu lze jen odhadnout, • odhady nákladů se počítají pomocí heuristické funkce (označovaná jako h): • h(n) = odhadnutá cena nejlevnější cesty ze stavu v uzlu n do stavu cílového
A* • Hodnocení stavu (uzlu) se rozkládá na dvě složky • f(n) = g(n) + h(n) • g(n) dává cenu cesty od startu do n • h(n) odhaduje cenu nejlevnější cesty z n do cíle f(n) = odhadnutá cena nejlevnějšího řešení přes uzel n do cíle. • Pokud je g() konstantní, redukuje se na algoritmus prvního nejlepšího.