Prohledávání stavového prostoru

Slides:



Advertisements
Podobné prezentace
Číslo projektu školy CZ.1.07/1.5.00/ Číslo a název šablony klíčové aktivity III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo materiáluVY_32_INOVACE_ICT_II_S2_15.
Advertisements

Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Nalezení nejkratší vzdálenosti mezi uzly dopravní sítě Předmět: Teorie dopravy - cvičení.
Programování 4. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015.
Tvorba panorámat Gymnázium a Jazyková škola s právem státní jazykové zkoušky Svitavy Ditta Kukaňová.
Vypracováno kolektivem autorů České společnosti pro technickou normalizaci Úřad pro technickou normalizaci, metrologii a státní zkušebnictví
Redukce lůžek Existuje prostor pro redukci lůžek akutní péče?
DEN ZEMĚ –orientační závod Autor: Mgr. Ivana Tesařová.
Hromadná korespondence 1 Word Předmět: Informační a komunikační technologie Autor: Milan Franek.
Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Josef Ledvoň. Dostupné z Metodického portálu ISSN: , financovaného.
Univerzita třetího věku kurz Znalci Databáze 2.
Publicita v projektech financovaných z ESF v rámci Operačního programu Lidské zdroje a zaměstnanost Seminář pro žadatele.
P RÁCE A VÝKON Ing. Jan Havel. Gymnázium a Jazyková škola s právem státní jazykové zkoušky Svitavy Materiál je určen pro bezplatné používání pro potřeby.
ZAL – 5. cvičení Martin Tomášek Pole - opakování Základní datový typ. V poli držíme více elementů (jednoho typu) S elementy v poli můžeme manipulovat.
©Ing. Václav Opatrný. V úvodních hodinách elektrotechniky jsou žáci seznamováni s veličinami, které popisují známý fyzikální svět, získávají představu.
Funkce Lineární funkce a její vlastnosti 2. Funkce − definice Funkce je předpis, který každému číslu z definičního oboru, který je podmnožinou množiny.
Název školy ZÁKLADNÍ ŠKOLA, JIČÍN, HUSOVA 170 Číslo projektu CZ.1.07/1.4.00/ Číslo a název klíčové aktivity 3.2 Inovace a zkvalitnění výuky prostřednictvím.
Výukový materiál zpracovaný v rámci projektu Číslo projektuCZ.1.07/1.4.00/ Šablona klíčové aktivityIII/2 SadaMatematika 6 NázevDesetinná čísla_8.
Postup modelování Kateřina Růžičková. Postup modelování Rozhodnutí modelovat Definice problému Existence modelu, pro daný problém Identifikace modelu.
Vysoká škola technická a ekonomická v Českých Budějovicích Ústav podnikové strategie Analýza marketingového mixu vybrané banky Autor bakalářské práce:
Seminář o stavebním spoření
Výukový materiál zpracován v rámci projektu
Digitální učební materiál zpracovaný v rámci projektu
Základní škola Ústí nad Labem, Anežky České 702/17, příspěvková organizace   Číslo projektu: CZ.1.07/1.4.00/ Název projektu: „Učíme lépe a moderněji“
Tvorba jednoduché tabulky - rozvrh
Matematika 3 – Statistika Kapitola 4: Diskrétní náhodná veličina
Řešení nerovnic Lineární nerovnice
Lineární rovnice a nerovnice I.
MODELY TEORIE GRAFŮ.
Soustava dvou lineárních rovnic se dvěma neznámými
Občanské soudní řízení I.
TIPY A RADY PRO PRÁCI S DATABÁZÍ SCOPUS
Jednotné principy klasifikace na GJKT
Jaroslav Kudr pro OATGM
Digitální učební materiál zpracovaný v rámci projektu
PB071 – Programování v jazyce C
Základní škola Ústí nad Labem, Anežky České 702/17, příspěvková organizace   Číslo projektu: CZ.1.07/1.4.00/ Název projektu: „Učíme lépe a moderněji“
JEdit Open source programování – – Marek Bílý.
Plošný základ, nelineární analýza
Soustava dvou lineárních rovnic se dvěma neznámými
ROZVRHOVÁNÍ SLUŽEB VE ZDRAVOTNICKÉM ZAŘÍZENÍ
Vzdělávání pro konkurenceschopnost
Běžné reprezentace grafu
Poměr v základním tvaru.
Název projektu: ZŠ Háj ve Slezsku – Modernizujeme školu
ČÍSLO PROJEKTU ČÍSLO MATERIÁLU NÁZEV ŠKOLY AUTOR TÉMATICKÝ CELEK
Soustava dvou lineárních rovnic se dvěma neznámými
Kvadratické nerovnice
Matematika pro stavební obory 19. Autor: RNDr. Zdeněk Bláha
Řešení nerovnic Lineární nerovnice
Materiál byl vytvořen v rámci projektu
Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
ZÁKLADNÍ ŠKOLA, JIČÍN, HUSOVA 170 Číslo projektu
název projektu: Šablony Špičák číslo projektu: CZ.1.07/1.4.00/
Občanské soudní řízení I.
Základní škola Ústí nad Labem, Anežky České 702/17, příspěvková organizace   Číslo projektu: CZ.1.07/1.4.00/ Název projektu: „Učíme lépe a moderněji“
Geometrie pro 9. ročník Autor: Mgr. Hana Vítková Datum:
Poměr v základním tvaru.
Občanské soudní řízení I.
DENNÍ BRIEFING DEN 9 ( ).
EU peníze školám Základní škola , Znojmo, Mládeže
Prohledávání stavového prostoru
PROLOG strategie vyhodnocení dotazu
Lineární funkce a její vlastnosti
Lineární rovnice Druhy řešení.
Hra (AZ kvíz) ke zopakování či procvičení učiva:
Algoritmizace a datové struktury (14ASD)
Grafy kvadratických funkcí
Prohledávání grafů.
Slovní úlohy o společné práci − 3
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 cil.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,[]).

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ě": čte se <- 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).

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-z1 Reprezentace stavů wgc(Pozice_lodky, Seznam_vlevo, Seznam_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]). % Pomocne predikaty, napr. Usporadani o([c,g],[g,c]), ... o([],[]). o([X],[X]). o(P,[w,g,c]) :- l(P,3). o(P,[w,g]) :- p ([w,g],P),!. o(P,[w,c]) :- p ([w,c],P),!. o(P,[g,c]) :- p ([g,c],P). % Pomocne predikaty, napr. Permutace p(L,L1) ...

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).

Poznámky k právě navrženému řešení úlohy k-v-z1 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