prohled av an ı graf u Karel Hor ak, Petr Ryˇsav y 16. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Podobné dokumenty
Cvičení 5 - Průchod stromem a grafem

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

bfs, dfs, fronta, zásobník, prioritní fronta, halda

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Dynamické datové struktury I.

Datové struktury. alg12 1

STACK

5 Rekurze a zásobník. Rekurzivní volání metody

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Prohledávání do šířky = algoritmus vlny

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

bfs, dfs, fronta, zásobník

Algoritmizace prostorových úloh

Abstraktní datové typy: zásobník

Kolekce, cyklus foreach

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

Šablony, kontejnery a iterátory

Algoritmy a datové struktury

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Úvod do teorie grafů

ADT/ADS = abstraktní datové typy / struktury

Algoritmizace prostorových úloh

Úvod do programovacích jazyků (Java)

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

ˇ razen ı rychlejˇ s ı neˇ z kvadratick e Karel Hor ak, Petr Ryˇsav y 20. dubna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Vzdálenost uzlů v neorientovaném grafu

Stromy, haldy, prioritní fronty

Algoritmy na ohodnoceném grafu

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

1 Nejkratší cesta grafem

Šablony, kontejnery a iterátory

Matice sousednosti NG

Datové typy a struktury

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Programování v C++ 2, 4. cvičení

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PROHLEDÁVÁNÍ GRAFŮ. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Drsná matematika III 10. demonstrovaná cvičení Kostry grafů

Základy umělé inteligence

Úloha ve stavovém prostoru SP je <s 0, C>, kde s 0 je počáteční stav C je množina požadovaných cílových stavů

Programování v Javě I. Leden 2008

Dynamické datové struktury IV.

Konstruktory a destruktory

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Programování v Javě I. Únor 2009

Dynamické datové struktury III.

Základní datové struktury

Úvod do programovacích jazyků (Java)

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi

Lineární datové struktury

Implementace LL(1) překladů

Binární vyhledávací stromy II

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/

Algoritmus Minimax. Tomáš Kühr. Projektový seminář 1

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

07 Základní pojmy teorie grafů

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

TGH05 - aplikace DFS, průchod do šířky

Základní datové struktury III: Stromy, haldy

ADT Seznam. dynamická množina. prvky vkládáme a vyjímáme na libovolné pozici (místě) v jejich posloupnosti (sekvenci) zásobník a fronta vs.

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Spojové struktury. Spojová struktura (linked structure):

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Abstraktní datové typy

IRAE 07/08 Přednáška č. 7. Začátek (head)

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

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/

Dynamické datové struktury II.

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

1. Téma 12 - Textové soubory a výjimky

7. Dynamické datové struktury

Jazyk C# a platforma.net

Rekurzivní algoritmy

Hledáme efektivní řešení úloh na grafu

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/

TGH05 - aplikace DFS, průchod do šířky

8 Třídy, objekty, metody, předávání argumentů metod

Datové struktury Úvod

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Principy objektově orientovaného programování

TOKY V SÍTÍCH II. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Transkript:

prohledávání grafů Karel Horák, Petr Ryšavý 16. března 2016 Katedra počítačů, FEL, ČVUT

Příklad 1 Nad frontou (queue) byly provedeny následující operace: push(1) push(2) print(poll()) print(peek()) print(peek()) push(3) print(poll()) print(poll()) print(peek()) push(4) push(5) print(poll()) print(poll()) Co bude obsahovat fronta po každém z volání a jaké hodnoty budou vypsány? 1

Řešení 1 Obsah fronty bude následující 1 1,2 2 2 2 2,3 3 4 4,5 5 Vytisklé hodnoty budou: 1,2,2,2,3,null,4,5. 2

Příklad 2 Nad zásobníkem (stack) byly provedeny následující operace: push(1) push(2) print(pop()) print(peek()) print(peek()) push(3) print(pop()) print(pop()) print(peek()) push(4) push(5) print(pop()) print(pop()) Co bude obsahovat zásobník po každém z volání a jaké hodnoty budou vypsány? 3

Řešení 2 Obsah zásobníku bude následující 1 2,1 1 1 1 3,1 1 4 5,4 4 Vytisklé hodnoty budou: 2,1,1,3,1,null,5,4. 4

Příklad 3 Navrhněte algoritmus, který projde strom do hloubky (nepoužívejte rekurzi). A B C D E F G H I J K V jakém pořadí budou zpracovávány uzly následujícího stromu? Očíslujte vrcholy podle otevíracích a zavíracích časů. 5

Řešení 3 1/22 2/9 10/21 3/8 11/14 15/18 19/20 4/5 6/7 12/13 16/17 6

Příklad 4 Navrhněte algoritmus, který projde strom do šířky. A B C D E F G H I J K V jakém pořadí budou zpracovávány uzly následujícího stromu? Očíslujte vrcholy podle otevíracích časů. 7

Řešení 4 1 2 3 4 5 6 7 8 9 10 11 8

Příklad 5 Uvažte následující algoritmus pro průchod stromem do šířky: 1. Vlož kořen do prázdné fronty. 2. Dokud fronta není prázdná, opakuj: 2.1 Vyjmi první prvek z fronty a zpracuj ho. 2.2 Vlož do fronty všechny potomky právě vyjmutého listu. Rekonstruujte strom, víte-li že průběžný obsah fronty při průchodu stromem do šířky je následující: A BC C DE EFG FG GHI HI I Formulujte obecný algoritmus, který řeší tuto úlohu. 9

Řešení 5 A B C D E F G H I V každém okamžiku je první vrchol fronty aktuálně zpracováváný kĺıč. Pokud se podíváme do obsahu fronty v dalším okamžiku, na konci se objeví jeho potomci. Obecný algoritmus lze formulovat takto: 1. Dokud není obsah fronty prázdný, opakuj: 1.1 Vezmi vrchol v s kĺıčem podle první hodnoty ve frontě. 1.2 Posuň se na frontu v dalším čase. 1.3 Vrcholu v přidej jako potomky nové vrcholy očíslované kĺıči, které se objevily na konci fronty. 10

Příklad 6 Uvažujme, že na vstup algoritmus pro prohledávání stromu do hloubky/šířky dostaneme místo stromu obecný graf. Navštíví algoritmus všechny vrcholy? Bude algoritmus nadále konečný? Pokud ne, jak tento problém vyřešíme? 11

Řešení 6 V případě průchodu do hloubky algoritmus nenavštíví všechny vrcholy, pokud narazí na cyklus. Naopak prohledávání do šířky vrcholy navštíví všechny. Ani jeden z algoritmů nebude konečný, pokud graf obsahuje cyklus. Řešením je pamatovat si, které vrcholy jsme již navštívili a které ne. 12

Příklad 7 V jakém pořadí budou zpracovávány uzly následujícího grafu při průchodu do hloubky? V každém okamžiku zpracovávejte následníky v abecedním pořadím. A B G C D H E F Očíslujte vrcholy podle otevíracích a zavíracích časů. 13

Řešení 7 1/12 2/11 13/16 4/7 3/10 14/15 5/6 8/9 14

Příklad 8 V jakém pořadí budou zpracovávány uzly následujícího grafu při průchodu do šířky? V každém okamžiku zpracovávejte následníky v abecedním pořadím. A B G C D H E F Očíslujte vrcholy podle otevíracích časů. 15

Řešení 8 1 2 7 3 4 8 5 6 16

Příklad 9 Najděte cestu z vrcholu E do vrcholu A v následujícím grafu. Předpokládejte, že následníky v každém okamžiku zpracováváte v abecedním pořadí. Zformulujte obecný algoritmus, který najde cestu z vrcholu do vrcholu. Jak naleznete cestu obsahující nejméně hran? Bonusová otázka: Jak byste našli nejkratší cestu, pokud by hrany měly přiřazené délky? A 1 6 E 4 B 7 1 2 D C 4 3 F 5 17

Řešení 9 Pro nalezení cesty, která obsahuje nejméně hran lze použít prohledávání do šířky. Pokud nám pouze stačí najít nějakou cestu, lze použít prohledávání do hloubky. Cesta, která obsahuje nejméně hran je E,C,F,A. Nejlevnější cesta je E,B,C,F,A nebo E,B,D,F,A. Pro nalezení nejkratší cesty je třeba uzly řadit ve frontě podle toho, jaká je cena za nejkratší cesty do daného vrcholu. Více na https://en.wikipedia.org/wiki/dijkstra s_algorithm. 18

Příklad 10 Převozník chce převézt z jednoho břehu na druhý hlávku zeĺı, kozu a vlka. Do lod ky s sebou může vzít bud zeĺı, nebo kozu, nebo vlka, ale víc se tam nevejde. Nechá-li na břehu hlávku zeĺı a kozu, koza zeĺı sežere. Nechá-li na břehu kozu a vlka, pak vlk sežere kozu. Jakým způsobem musí převozník postupovat, aby nedošlo k žádné škodě? Zkuste problém vyřešit pomocí programu. 19

Řešení 10 c l a s s StateWrapper { // xor of state with those i s equal to application of given action to the state private f i n a l int MOVE BOAT = 0 b0001 ; private f i n a l int MOVE BOAT AND GOAT = 0 b0011 ; private f i n a l int MOVE BOAT AND WOLF = 0 b0101 ; private f i n a l int MOVE BOAT AND CABBAGE = 0 b1001 ; // t h e s t a t e space, f a l s e f o r t h e o r i g i n a l bank, t r u e f o r t h e d e s i r e d one // instead of boolean array we w i l l use integer for storing the state p r o t e c t e d f i n a l i n t s t a t e ; protected f i n a l List<String> ac ti on s ; p u b l i c StateWrapper ( i n t state, List<String> actions, String action ) { t h i s. s ta t e = s t a te ; t h i s. actions = actions == n u l l? new ArrayList <>() : new ArrayList<>(actions ) ; i f ( a c t i o n!= n u l l ) t h i s. a c t i o n s. add ( a c t i o n ) ; } p u b l i c boolean i s F i n a l ( ) { // 0 b0000 i s i n i t i a l s t a t e, f i n a l i s i f e v e r y t h i n g i s on t h e o t h e r s i d e r e t u r n s t a t e == 0 b1111 ; } p u b l i c boolean i s A d d m i s s i b l e ( ) { // admissible i f there i s boat on the same side as goat or goat i s not together with wolf nor cabb f i n a l boolean goat = ( ( s t a t e & Main.GOAT)!= 0 ) ; f i n a l boolean boat = ( ( s t a t e & Main.BOAT)!= 0 ) ; r e t u r n goat == boat ( goat!= ( ( state & Main.CABBAGE)!= 0) && goat!= ( ( state & Main.WOLF)!= 0 } p u b l i c L i s t<statewrapper> l i s t C h i l d r e n ( ) { L i s t<statewrapper> l i s t = new A r r a y L i s t <>(4); l i s t. add (new StateWrapper ( state ˆ MOVE BOAT, actions, Move boat ) ) ; i f ( ( ( state & Main.BOAT)!= 0) == ( ( state & Main.GOAT)!= 0 ) ) l i s t. add (new StateWrapper ( state ˆ MOVE BOAT AND GOAT, actions, Sail with goat ) ) ; i f ( ( ( state & Main.BOAT)!= 0) == ( ( state & Main.WOLF)!= 0 ) ) l i s t. add (new StateWrapper ( state ˆ MOVE BOAT AND WOLF, actions, Sail with wolf ) ) ; i f ( ( ( state & Main.BOAT)!= 0) == ( ( state & Main.CABBAGE)!= 0 ) ) l i s t. add (new StateWrapper ( state ˆ MOVE BOAT AND CABBAGE, actions, Sail with cabbage ) ) ; r e t u r n l i s t ; }} 20

Řešení 10 p u b l i c c l a s s Main { public static f i n a l int BOAT = 0 b0001 ; public static f i n a l int GOAT = 0 b0010 ; public static f i n a l int WOLF = 0 b0100 ; public static f i n a l int CABBAGE = 0 b1000 ; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Deque<StateWrapper> queue = new L i n k e d L i s t <>(); queue. add (new StateWrapper (0x0, null, null ) ) ; Set<I n t e g e r> v i s i t e d = new HashSet <>(16); v i s i t e d. add (0 x0 ) ; w h i l e (! queue. isempty ( ) ) { StateWrapper s t a t e = queue. p o l l ( ) ; i f ( s t a t e. i s F i n a l ( ) ) { System. out. p r i n t l n ( s t a t e. a c t i o n s ) ; return ; } }}}}} f o r ( StateWrapper r e a c h a b l e : s t a t e. l i s t C h i l d r e n ( ) ) { i f ( r e a c h a b l e. i s A d d m i s s i b l e ( ) &&! v i s i t e d. c o n t a i n s ( r e a c h a b l e. s t a t e ) ) { queue. add ( r e a c h a b l e ) ; v i s i t e d. add ( r e a c h a b l e. s t a t e ) ; 21

Programovací úlohy k procvičení https://open.kattis.com/problems/safepassage 22

Reference http://kam.mff.cuni.cz/~kuba/ka/pruchod.pdf 23