Stavový prostor
• 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
• 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
• Ř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
• 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 • …
• 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(n 2 ) • vyzkoušíme zpracovat 100 stavů • jak dlouho bude trvat zpracování 10 6 stavů?
• Seznam OPEN a CLOSED • Seznam OPEN je fronta (FIFO) 1.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í. 2.Pokud je seznam OPEN prázdný, řešení neexistuje, ukonči prohledávání. 3.Vymaž první stav (označíme jej i) v seznamu OPEN a zapiš tento stav do seznamu CLOSED. 4.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 č Zapiš všechny následovníky stavu i, kteří nejsou v seznamu CLOSED na konec seznamu OPEN. 6.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.
• 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.
• Seznam OPEN je zásobník (LIFO) 1.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í. 2.Pokud je seznam OPEN prázdný, řešení neexistuje, ukonči prohledávání. 3.Vymaž první stav (označím jej i) v seznamu OPEN a zapiš tento stav do seznamu CLOSED. 4.Pokud se hloubka uzlu i rovná maximální přípustné hloubce, pokračuj krokem č.2. 5.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. 6.Zapiš všechny následovníky stavu i, kteří nejsou v seznamu CLOSED, na začátek seznamu OPEN. 7.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.
• 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 cestu a 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.
• 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 (greedy search) • prohledávání do hloubky • Zvolíme nadějnou cestu a v případě, že nenajdeme cílový stav, vrátíme se do výchozího stavu a začneme znovu jinou cestou
• 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
• 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.