# Řešení úloh **Úloha** - dvě množina stavů - $X = \{x_{1}, x_{2}, \dots, x_{k}\}$ ... množina výchozích stavů - $Y = \{y_{1}, y_{2}, \dots, y_{m}\}$ ... množina cílových stavů - zobrazení $X \to Y$ **Řešením úlohy** - postup (posloupnost operací), kterým převedeme úlohu z některého výchozího stavu $x_{i}$ do definovaného cílového stavu $y_{j}$ **Posloupnost stavů** - $x_{i} = s_{0}, s_{1}, \dots, s_{t} = y_{j}$ - pro přechod mezi jednotlivými $s_{i}$ slouží operátory $r_{i}$ popisující elementární operace **Operátory** - $\text{R} = \{r_{1}, r_{2}, \dots, r_{l}\}$ - úlohu vyjádříme jako $x_{i} \to^{R_{Kij}} y_{j}$ **Definice úlohy** - trojice $(X, Y, R)$ - vždy známe dvě složky a třetí určujeme - $(X, ?, R)$ ... deduktivní - $(?, Y, R)$ ... abduktivní - $(X, Y, ?)$ ... induktivní ## Hledání řešení úlohy Hledáme takové sestavení operátorů $R$, které vyhovuje zadaným množinám stavů $X$ a $Y$ a je v nějakém (obvykle daném) smyslu optimální. **Postup** - metodou pokusů a omylů vytváříme strom řešení úlohy - současným prohledáváním hledáme takový kompoziční operátor $R_{Kij}$ (sestavení operátorů), který vyhovuje množinám stavů $X$ a $Y$ + procházení stromu řešení - deterministické - náhodné - heuristické **Předpoklady** 1. existuje konečná **množina stavů** $S = \{s_{i}\}$, ve kterých se může úloha nacházet 2. existuje alespoň jeden **výchozí** (**počáteční**) **stav** úlohy $s_{0} \in S$ 3. existuje konečná množina **cílových** (**požadovaných**) **stavů** úlohy $G = \{g_{j}\}$, přičemž $G \subseteq S$ 4. existuje konečná množina **elementárních operátorů** $R = \{r_{l}\}$, které převádějí úlohu ze tavu $s_{p}$ do stavu $s_{q}$ **Stavový prostor** - definován dvojice $(S, R)$ **Konkrétní řešení úlohy** - definováno trojicí $(s_{0}, s_{j}, R_{K_{0}j})$ na $S$ - $R_{K_{0}j}$ - kompoziční operátor pro převod úlohy z $s_{0}$ do $s_{j} = g_{_{k}}$ **Řešení úlohy ve stavovém prostoru** - kompoziční operátor $R_{K_{0}j} = r_{1}r_{2}r_{3}\dots r_{r-1}r_{r}$ takový, že - $s_{1} \leftarrow r_{1} (s_{0})$ - $s_{2} \leftarrow r_{1} (s_{1}) = r_{2}(r_{1}(s_{0}))$ - ... - $s_{r} \leftarrow r_{r} (s_{r-1}) = r_{r}(r_{r-1}(\dots r_{1}(s_{0}))$ ## Reprezentace úlohy stromovým grafem **Pojmy** - **uzly grafu** - stavy úlohy - **hrany grafu** - přechody mezi stavy - **bezprostřední následovník** - uzly, které mají stejného rodiče - **expanze uzlu** - nalezení všech bezprostředních následovníků uzlu - **hloubka uzlu** - počet hran do něj vedoucích z uzlu $s_{0}$ **Strom řešení úlohy** - jediný uzel bez bezprostředního předchůdce - **kořen** - u každého uzlu určujeme rekurzivně jeho hloubku - kořen - 0 - následovník uzlu s hloubkou $d$ má hloubku $d+1$ - uzly bez bezprostředního následovníka jsou - cílovými stavy úlohy - stavy bez aplikovatelných operátorů - stavy, o kterých jsme rozhodli, že je nemá smysl rozvíjet - orientovaná hrana - přechod ze starého do nového stavu (aplikace operátoru) **Nalezení řešení úlohy** - nalezení cesty spojující kořen s listem, který reprezentuje cílový stav úlohy ## Produkční systém **Složky** - **databáze úlohy** - fakta - **báze znalostí** - produkční pravidla - podmínka -> akce - **řídíci mechanizmus** - provádí volbu, které pravidlo bude použito - vybírá fakta z databáze, která budou dosazena do podmínky - ukončuje výpočet, pokud je splněna cílová podmínka - **množina cílů**, které mají být splněny # Dekompozice úlohy **Hanoiské věže** - máme tři tyče: **A, B, C** - na tyči **A** je (podle velikosti) $n$ kotoučů - úkol: přeskládat z **A** pomocí **C** na tyč **B** (zaps. $n(A, B, C)$) bez porušení uspořádání + fáze + přeskládat $n-1$ kotoučů z A pomocí B na C + přeložit 1 kotouč z A na B + překládat $n-1$ kotoučů z C pomocí A na B **AND/OR grafy** - chceme najít cestu $a \to z$ - pomocí AND/OR grafu rozdělíme problém na podproblémy - cesta přes k, cesta přes l - pokud máme OR vrchol, tak stačí projít jediného následníka - pokud máme AND vrchol, musíme projít všechny následníky + **celkové řešení** = podgraf AND/OR grafu, který nevynechá žádného následníka AND uzlu