Prohledávání stavového prostoru

Slides:



Advertisements
Podobné prezentace
Grafové algoritmy.
Advertisements

DOTAZOVACÍ JAZYKY slajdy přednášce DBI006
J. Pokorný 1 DOTAZOVACÍ JAZYKY slajdy přednášce DBI006 J. Pokorný MFF UK
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.
JUI - 3. přednáška Zpracování seznamů, predikátové a vyhodnocovací funkce RNDr. Jiří Dvořák, CSc.
Cvičení Úloha 1: Rozhodněte zda posloupnost znaků v poli délky n tvoří palindrom (slovo, které je stejné při čtení zprava i zleva). Př.: [a,l,e,l,a] [a,n,n,a]
Aplikace teorie grafů Základní pojmy teorie grafů
Modulární systém dalšího vzdělávání pedagogických pracovníků JmK v přírodních vědách a informatice CZ.1.07/1.3.10/ Teorie grafů – zadání řešení.
Modulární systém dalšího vzdělávání pedagogických pracovníků JmK v přírodních vědách a informatice CZ.1.07/1.3.10/ Prezentace zadání a řešení Teorie.
ALGO – Algoritmizace 1. cvičení
Programovací jazyk Prolog
Projektový management
Sample Solutions CTU Open Contest 2012 Czech Technical University in Prague.
Organon Interaktivní webová aplikace pro výuku logiky
Varianty Turingova stroje Výpočet funkcí pomocí TS
Principy překladačů Mezikód Jakub Yaghob.
Ondřej Pokorný ČVUT v Praze FJFI.
Induktivní logické programování
ADT Strom.
Definování prostředí pro provozování aplikace dosud jsme řešili projekt v obecné rovině aplikace bude ovšem provozována v konkrétním technickém a programovém.
Řešení dynamických problémů s podmínkami Pavel Surynek Univerzita Karlova v Praze Matematicko-fyzikální fakulta.
SÍŤOVÁ ANALÝZA.
D ATOVÉ MODELY Ing. Jiří Šilhán. D ATABÁZOVÉ SYSTÉMY Patří vedle textových editorů a tabulkových kalkulátorů k nejrozšířenějším představitelům programového.
TI 7.1 NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6. TI 7.2 Nejkratší cesty z jednoho uzlu Seznámíme se s následujícími pojmy: w-vzdálenost (vzdálenost na.
ORIENTOVANÉ GRAFY V této části se seznámíme s následujícími pojmy:
JUI - 9. přednáška Ř ez, negace, práce s databází RNDr. Jiří Dvořák, CSc.
METODA KONEČNÝCH PRVKŮ
Dostupné z Metodického portálu ISSN: , financovaného z ESF a státního rozpočtu ČR. Provozováno Výzkumným ústavem pedagogickým v Praze.
Jemný úvod do MATLABu © Leonard Walletzký, ESF MU, 2000.
Algoritmy vyhledávání a řazení
Využití subpohledu Ingrid Vindišová, 4. Y Úkol: Využití subpohledu 1. Úvod 2. Vytváření soustavy subpohled 3. Standardní subpohled 4. Návrhář standardního.
Reprezentace znalostí v UI Inteligentní systém musí umět předvídat důsledky svých akcí – potřebuje „model svého prostředí“. K jeho konstrukci potřebuje.
Přednáška 10 Logické programování, PROLOG (PROgramming in LOGic)
Jazyk XML Jazyk pro tvorbu strukturovaných dokumentů Syntaxí velmi podobný HTML Hlavní cíle návrhu: Snadná editace - jazyk je textový Snadné strojové zpracování.
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
TEORIE HER.
Použití dotazu jako zdroje dat pro pohled Iva Kraicigerová, 4Y2.
Přednáška 10 Logické programování, PROLOG (PROgramming in LOGic)
Matematické metody optimalizace. Příkady grafů Železniční stanice, tratě mezi nimi Města, silnice Křižovatky, ulice Uzly kanalizace, potrubí Místnosti,
Matematické metody optimalizace Tomáš Vaníček Katedra inženýrské informatiky Stavební fakulta ČVUT Thákurova 7, Praha 6 Dejvice, b407
Databázové systémy Informatika pro ekonomy, př. 18.
Automaty a gramatiky.
Databáze Formuláře VY_32_INOVACE_7B18. Formuláře Umožňují zobrazit data z tabulek uživatelsky vhodným způsobem Mohou být zobrazena data z více tabulek.
JUI přednáška Vstup a výstup, cykly RNDr. Jiří Dvořák, CSc.
Doc. Josef Kolář (ČVUT)Prohledávání grafůGRA, LS 2010/11, Lekce 4 1 / 15Doc. Josef Kolář (ČVUT)Prohledávání stavového prostoruGRA, LS 2013/14, Lekce 11.
Podprogramy (subroutines) Pojmenované kousky programu, které –tvoří logicky ucelené části –se v programu opakují Jsou zapsány na jednom místě a v případě.
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2015.
Návrh a implementace algoritmů pro údržbu,
Perzistence XML dat Kamil Toman
Náhodná veličina. Nechť (, , P) je pravděpodobnostní prostor:
Proč s aplikací pracovat?. Aplikace Stopy mé Ekoškoly má jednoduché ovládání a snadno prezentovatelné výstupy. Zábavnější práci s analýzou Kvalitní a.
Úvod do databází zkrácená verze.
Soustavy lineárních rovnic Matematika 9. ročník Creation IP&RK.
NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6.
Ekonomika malých a středních podniků
Definiční obor a obor hodnot
Dobývání znalostí z databází znalosti
Znázornění dopravní sítě grafem a kostra grafu Předmět: Teorie dopravy - cvičení Ing. František Lachnit, Ph.D.
KARTOGRAFICKÁ VIZUALIZACE
Maximální propustnost rovinné dopravní sítě
PROLOG strategie vyhodnocení dotazu
Prohledávání stavového prostoru
ZAL – 7. cvičení 2016.
Základní algoritmy Prologu
Soustavy lineárních rovnic
PROLOG strategie vyhodnocení dotazu
Grafy kvadratických funkcí
Logické programování Prezentace číslo 8.
Prohledávání grafů.
Grafy kvadratických funkcí
Transkript prezentace:

Prohledávání stavového prostoru

Prohledávání grafu - potřebné prostředky Prologu stromy a acyklické grafy - stačí čistý Prolog konečné grafy s případným cyklem - Prolog + negace * nekonečné grafy (lokálně konečné) - Prolog + negace* + predikáty 2. řádu ** * nutná pro kontrolu cyklu ** prohledávání do šířky

Prohledávání stavového prostoru do šířky pridej_za(+Open,+Uzel,-Vysledek) nalezne všechny přímé násl. uzlu Uzel, tento seznam přidá za Open a tak vznikne Vysledek. vlna(+Open,Z) hledá cestu, t.ž. začíná v některém prvku seznamu Open a končí v cílovém uzlu Z (Open odpovídá seznamu Open nodes používaném v klas.implementaci prohl.stav.prost.) dotaz ?-c_sir(a,X). Najde “nejbližší“ cílový uzel dostupný z a c_sir(X,X) :- cil(X). c_sir(X,Y) :- vlna([X],Y). vlna([],_) :- write('Vic cilovych uzlu neni.'),nl. vlna([H|T],H):- cil(H). vlna([Y|L],Z):- pridej_za(L,Y,N),vlna(N,Z). pridej_za(L,Y,N) :-primi_naslednici(Y,S),append(L,S,N). primi_naslednici(Y,S) :- bagof(Z,hr(Y,Z),S),!. primi_naslednici(Y,[]). % pro případ, kdy bagof končí „fail“

Prohledávání grafu do šířky: g2_bf ?-c_sir(a,X). X = f; X = i; X = l; X = n; Cvičení: Upravte program tak, aby podával i informace o cestě použité k dosažení cíle! a c b d i n m f g h j e k l

Predikáty měnící databázi programu assert(+Clause), retract (+Clause) assert/1 přidává obsah svého argumentu ZA definici predikátu téhož jména asserta/1 přidává obsah arg. PŘED tuto definici retract (+Clause) najde první klauzuli, kterou lze unifikovat s Clause, a zruší ji POZOR! Predikát v hlavě Clause musí být deklarován jako DYNAMICKÝ, tedy takový, že jeho definice se v průběhu výpočtu může měnit. Například :- dynamic fronta/1. Upozorňuje na to, že predikát fronta se v průběhu programu může měnit!

Použití predikátů assert(+Clause), retract (+Clause) Obdobu predikátu bagof(+X,+Cíl(X,_),-Seznam) můžeme naprogramovat právě pomocí assert a retract: Náš vlastní predikát nazvěme findall_p. Musíme použít pomocné konstr.: % * konstantu konec jako značku, že další možnosti nejsou a % * predikát fronta pro uložení nalezených instancí za X v dotazu Cil :- dynamic fronta/1. findall_p(X, Cil, XSeznam) :- call (Cil), assert (fronta(X) ), fail. findall_p(X, Cil, XSeznam) :- assert (fronta(konec) ), shrn_fronta ( XSeznam ). shrn_fronta ( Sezn ) :- retract (fronta (X) ), !, ( X == konec,!,Sezn = [] ; Sezn = [X| Z],shrn_fronta ( Z ) ).

?- findall_p(X, hr(a, X), L). X = X L = [b, c, d] Yes (0.00s cpu) :- dynamic fronta/1. hr(a,b). hr(a,c). hr(a,d). hr(b,e). hr(b,f). hr(c,g). hr(c,h). hr(c,a). hr(g,k). hr(g,l). hr(d,i). hr(d,j). hr(j,m). hr(j,n). cil(f). cil(i). cil(l). cil(n). findall_p(X,Cil,XSeznam) :- call(Cil), assert(fronta(X)), fail. findall_p(X,Cil,XSeznam) :- assert(fronta(konec)),shrn_fronta(XSeznam ). shrn_fronta(Sezn) :- retract(fronta(X)),!, (X == konec,!,Sezn = []; Sezn = [X| Z],shrn_fronta(Z)). ?- findall_p(X, hr(a, X), L). X = X L = [b, c, d] Yes (0.00s cpu) ?- findall_p(X, hr(g, X), L). X = X L = [k, l] Yes (0.00s cpu)

Prohledávání do šířky s rekonstrukcí cesty bf_path :- dynamic edge/2. % c_sir1(+VychoziStav,-CilStav,-Cesta) c_sir1(X,X,[X]):-cil(X). c_sir1(X,Y,T):-vlna1([X],Y),cil(Y),cesta(X,Y,T). vlna1([],konec):-nl,write('dalsi cilove uzly nejsou'),!. vlna1([H|T],H):-cil(H). vlna1([H|T],Z):-pridej_za1(T,H,N),vlna1(N,Z). pridej_za1(L,H,N):-primi_naslednici(H,S),append(L,S,N),pamatuj(H,S). primi_naslednici(H,S):-bagof(X,hr(H,X),S),!. primi_naslednici(H,[]). pamatuj(Z,[]). pamatuj(Z,[H|T]):-asserta(edge(Z,H)),pamatuj(Z,T). % cesta(+VychStav,+CilStav,-Cesta) se konstruuje „zpětně“ : proto se čte  cesta(X,X,[X]):-!. cesta(X,Y,[Y|T]):-edge(H,Y),cesta(X,H,T).

a Jak hledá program bf_path cestu do cílových uzlů tohoto grafu? ?- c_sir1(a, X, L). X = f L = [f, b, a] Yes (0.00s cpu, solution 1, maybe more) X = i L = [i, d, a] Yes (0.00s cpu, solution 2, maybe more) X = l L = [l, g, c, a] Yes (0.00s cpu, solution 3, maybe more) X = n L = [n, j, d, a] Yes (0.00s cpu, solution 4, maybe more) No (0.00s cpu) b c d e f g h i j k l m n

a c b d i n m f g h j e k l Jak hledá program bf_path cestu do cílových uzlů zde? ?- c_sir1(a, X, L). X = f L = [f, b, a] Yes (0.00s cpu, solution 1, maybe more) X = i L = [i, d, a] Yes (0.00s cpu, solution 2, maybe more) X = i L = [i, d, a] Yes (0.02s cpu, solution 3, maybe more) X = l L = [l, g, c, a] Yes (0.02s cpu, solution 4, maybe more) X = l L = [l, g, c, a] Yes (0.02s cpu, solution 5, maybe more) X = n L = [n, j, d, a] Yes (0.03s cpu, solution 6, maybe more) X = n L = [n, j, d, a] Yes (0.03s cpu, solution 7, maybe more) Opakování je způsobeno existencí smyčky. To lze ošetřit tím, že si ještě zapamatujeme uzly, které už byly analyzovány (rozvinuty) a ty do „agendy pro zpracování“ nedoplňujeme!

Varianta bf_path s kontrolou smyček bf_loop_check :- dynamic edge/2. :- dynamic analyzed_node/1. c_sir2(X,X,[X]):-cil(X). c_sir2(X,Y,T):-vlna2([X],Y),cil(Y),cesta(X,Y,T). vlna2([],konec):-nl,write('dalsi cilove uzly nejsou'),!. vlna2([H|T],H):-cil(H). vlna2([H|T],Z):-pridej_za2(T,H,N),vlna2(N,Z). pridej_za2(L,H,N):-assert(analyzed_node(H)) , primi_naslednici(H,S),vynech(S,S1), append(L,S1,N),pamatuj(H,S). vynech([],[]). vynech([H|T],T1):-analyzed_node(H),!,vynech(T,T1). vynech([H|T],[H|T1]):-vynech(T,T1).

a c b d i n m f g h j e k l Jak hledá program bf_loop-check cestu do cílových uzlů pro tenýž graf? ?- c_sir2(a, Y, T). Y = f T = [f, b, a] Yes (0.00s cpu, solution 1, maybe more) Y = i T = [i, d, a] Yes (0.02s cpu, solution 2, maybe more) Y = l T = [l, g, c, a] Yes (0.03s cpu, solution 3, maybe more) Y = n T = [n, j, d, a] Yes (0.03s cpu, solution 4, maybe more) No (0.05s cpu)

Prohledávání stavového prostoru Stavový prostor = implicitně definovaný graf, ve kterém hrany odpovídají povoleným krokům. Popis úlohy prostřednictvím predikátů: move(Stav, Aplikovatelná_akce), který nabízí všechny akce aplikovatelné v daném stavu update(Stav, Aplikovatelná_akce, Výsledný_stav_po_akci), který generuje stav, který je výsledkem aplikace zvolené akce init_state(S), final_state(S) Postup řešení podobný jako u prohledávání grafu.

Princip řešení úlohy k-v-z2 Reprezentace stavů wgc(Pozice_lodky, Seznam_obj_vlevo, Seznam_obj_vpravo) Reprezentace akcí: akce charakterizována nákladem loďky % Popis výchozího a cílového stavu init_state(wgc, wgc(left,[w,g,c],[])). final_state(wgc, wgc(right,[],[w,g,c])). % Popis podmínek pro vykonání akce v daném stavu move(wgc(left,L,R),Cargo):- element(Cargo,L). move(wgc(right,L,R),Cargo):- element(Cargo,R). move(wgc(B,L,R),alone).

% Výsledný stav po vykonání akce update(wgc(B,L,R),Cargo,wgc(B1,L1,R1)):- update_boat(B,B1), update_banks(Cargo,B,L,R,Li1,Ri1), o(Li1,L1),o(Ri1,R1). % ukolem predikatu o(+X,-Z) je usporadat seznam „sestupne“ update_boat(left,right). update_boat(right,left). % update_banks(Cargo, BoatInitPosition,LeftBankInit,RightBankInit,LFinal,RFinal). update_banks(alone,B,L,R,L,R). update_banks(Cargo,left,L,R,L1,R1) :- delete(Cargo,L,L1), insert(Cargo,R,R1),!. update_banks(Cargo,right,L,R,L1,R1) :- …

% Kontrola hrozícího nebezpečí legal(wgc(left,L,R)):- not illegal(R). legal(wgc(right,L,R)):- not illegal(L). illegal([w,g]). illegal([g,c]). % Pomocné predikáty, napr. „normální tvar“ ignorující uspořádání o([],[]). o([X],[X]). o([w,g],[w,g]). o([g,w],[w,g]). o([w,c],[w,c]). o([c,w],[w,c]). o([g,c],[g,c]). o([c,g],[g,c]). o(P,[w,g,c]) :- l(P,3). % Další pomocné predikáty % m: "member", d:"delete", i:"insert, l:"lenth“

Obecný program pro prohledávání stavového prostoru % Alg. Generující a prohledávající stav.prostor od vých stavu initial_state % k cílovému final_state využívající následující popis světa: % move(Stav, Aplikovatelná_akce) % update(Stav, Aplikovatelná_akce, Výsledný_stav_po_akci) solve_dfs(State,History,[]):-final_state(State). solve_dfs(State,History,[Move|Moves]):- move(State,Move), update(State,Move,State1), legal(State1), not member(State1,History), solve_dfs(State1,[State1|History],Moves). % Testování na konkrétní úloze test_dfs(Problem,Moves):- initial_state(Problem,State), solve_dfs(State,[State],Moves).

?- test_dfs(wgc, M). M = [g, alone, w, g, c, alone, g], Yes (0.00s cpu, solution 1, maybe more) M = [g, alone, c, g, w, alone, g], Yes (0.02s cpu, solution 2, maybe more) No (0.02s cpu Řešení úlohy: proveďte akce v M postupně zleva doprava, tj. převez kozu  vrať se  převez vlka  převez kozu  převez zelí  vrať se  převez kozu

Poznámky k právě navrženému řešení úlohy k-v-z2 Program v této podobě řešení nalezne! Pokud se tak v jiném případě nestane, je vhodné Pro odhalení důvodů je rozumné přidat tisk do solve_dfs, aby bylo zřejmé, kudy pokusy o řešení běží. Ujistit se, zda program neopakuje mnohokrát zbytečné akce. Je vhodné zajistit, aby se jako další akce nevybrala ta, která právě skončila. Dál je možné přidat parametr se jménem poslední akce a to kontrolovat, … Díky tisku se může ukázat, že popis nelegálních stavů ani popis cílového stavu nejsou úplné (permutace). Použít bfs