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

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

Binární soubory (datové, typované)

Úvod do teorie grafů

Prohledávání do šířky a do hloubky. Jan Hnilica Počítačové modelování 15

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

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

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

NPRG030 Programování I, 2018/19 1 / :03:07

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

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Základy umělé inteligence

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

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

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

Základy umělé inteligence

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

Časová a prostorová složitost algoritmů

bfs, dfs, fronta, zásobník

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

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

NPRG030 Programování I RNDr.Tomáš Holan, Ph.D. 4.patro, č

Implementace LL(1) překladů

3. Prohledávání grafů

Diskrétní matematika. DiM /01, zimní semestr 2018/2019

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

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

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

Předmět: Algoritmizace praktické aplikace

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

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3]

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

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

Rozklad problému na podproblémy

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

Základy informatiky. 07 Teorie grafů. Kačmařík/Szturcová/Děrgel/Rapant

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

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Vzdálenost uzlů v neorientovaném grafu

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Algoritmizace prostorových úloh

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Dynamické programování

07 Základní pojmy teorie grafů

Stromy, haldy, prioritní fronty

Ú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ů

Hranová konzistence. Arc consistency AC. Nejprve se zabýváme binárními CSP. podmínka odpovídá hraně v grafu podmínek

Dynamické datové struktury III.

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

State Space Search Step Run Editace úloh Task1 Task2 Init Clear Node Goal Add Shift Remove Add Node Goal Node Shift Remove, Add Node

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

5. přednáška - Rozklad problému na podproblémy

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

Základy informatiky. Teorie grafů. Zpracoval: Pavel Děrgel Úprava: Daniela Szturcová

Algoritmy na ohodnoceném grafu

Algoritmizace. 1. Úvod. Algoritmus

Matice sousednosti NG

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

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

Rekurzivní algoritmy

Návrh Designu: Radek Mařík

ALGORITMY A DATOVÉ STRUKTURY

Anotace. Dynamické programování, diskrétní simulace.

Teorie grafů. Kostra grafu. Obsah. Radim Farana Podklady pro výuku pro akademický rok 2013/2014

Metody návrhu algoritmů, příklady. IB111 Programování a algoritmizace

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

2. úkol MI-PAA. Jan Jůna (junajan)

Úvod do programování 10. hodina

Hlavolamy a teorie grafů

Algoritmy a datové struktury

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

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

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

Dijkstrův algoritmus

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

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

TGH04 - procházky po grafech

"Agent Hledač" (3. přednáška)

13. Třídící algoritmy a násobení matic

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Úvod do informatiky. Miroslav Kolařík

Úvod do plánování: Zadání úloh PDDL

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

Dynamické datové struktury IV.

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

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

INFORMATIKA. Vybrané podposloupnosti

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

Anotace. Dijkstrův algoritmus,

Watkinsův algoritmus řádkového rozkladu

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Rekurze. Jan Hnilica Počítačové modelování 12

Odstranění řádků (na základě hodnoty)

Rekurzivní sledování paprsku

Transkript:

Hanojské věže - 3 kolíky A, B, C - na A je N disků různé velikosti, seřazené od největšího (dole) k nejmenšímu (nahoře) - kolíky B a C jsou prázdné - úkol: přenést všechny disky z A na B, mohou se odkládat na C - podmínka: nikdy nesmí ležet větší disk na menším Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C provedeme jedině takto: 1. PŘENESVĚŽ (N-1, A, C, B) - rekurze 2. přenes disk z A na B - triviální akce 3. PŘENESVĚŽ (N-1, C, B, A) - rekurze Časová složitost: O(2 N ) dána charakterem problému, k vyřešení úkolu je nutné provést tolik přesunů. Pavel Töpfer, 2017 Programování 1-10 1

program Hanoj; var N: integer; {počet kotoučů} procedure Prenes(N, A, B, C: integer); {přenese věž N kotoučů z kolíku A na kolík B, přitom využívá kolík C jako pomocný pro odkládání} begin if N > 0 then begin Prenes(N-1, A, C, B); writeln('prenes kotouc z ', A, ' na ', B); Prenes(N-1, C, B, A) end end; {procedure Prenes} begin write('pocet kotoucu: '); readln(n); Prenes(N, 1, 2, 3) end. Pavel Töpfer, 2017 Programování 1-10 2

Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé vrstvě zkouší všechny možnosti zleva doprava) - je nutné pamatovat si všechny situace v jedné vrstvě stromu při větší hloubce je to paměťově velmi náročné (exponenciálně), až nepoužitelné - použijeme, máme-li nalézt jedno (nejkratší) řešení vždy najde nejkratší možné řešení co do počtu kroků Pavel Töpfer, 2017 Programování 1-10 3

- výhodné, existují-li v rozsáhlém prohledávacím stromě nějaká řešení vzdálená od startu jen na málo kroků prohledá se jen několik horních vrstev stromu (významná časová úspora oproti prohledávání do hloubky) - nevhodné při úloze nalézt všechna řešení musí se projít celý strom, a to je při stejné časové složitosti výhodnější provádět do hloubky (paměťově mnohem méně náročné) - v některých úlohách je nutné prohledávat do hloubky (prohledávání do šířky by se paměťově nezvládlo), v některých je nutné prohledávat do šířky (prohledávání do hloubky by se časově nezvládlo), v některých je to jedno (obě varianty prohledávání jsou paměťově i časově stejně náročné) Pavel Töpfer, 2017 Programování 1-10 4

Realizace prohledávání do hloubky a do šířky Prohledávání do hloubky se zpravidla realizuje rekurzivní procedurou, totéž lze naprogramovat pomocí zásobníku: vlož do zásobníku výchozí stav dokud (není zásobník prázdný) a (není nalezeno řešení) opakuj vyjmi ze zásobníku vrchní stav a zpracuj ho vlož do zásobníku jeho všechna možná pokračování Prohledávání do šířky se realizuje velmi podobně pomocí fronty: vlož do fronty výchozí stav dokud (není fronta prázdná) a (není nalezeno řešení) opakuj vyjmi z fronty první stav a zpracuj ho vlož do fronty jeho všechna možná pokračování Pavel Töpfer, 2017 Programování 1-10 5

Příklady: Proskákání celé šachovnice koněm (bylo) - každé možné řešení úlohy má délku 63 kroků, použití prohledávání do šířky je paměťově nereálné Nejkratší cesta koněm na šachovnici - dána výchozí a cílová pozice, dojít šachovým koněm co nejmenším počtem tahů z výchozího na cílové pole - použití prohledávání do hloubky je velmi nevhodné backtracking do hloubky až 63, zatímco vždy existuje řešení délky maximálně 6 - postupujeme do šířky: sousední pole k výchozímu označíme 1, jejich sousedy 2, jejich sousedy 3, atd., dokud nedojdeme na cílové pole (číslo = délka nejkratší cesty ze startu) - k nalezení vlastní cesty je nutný ještě zpětný chod (cíl sousední pole s hodnotou o 1 menší start) Pavel Töpfer, 2017 Programování 1-10 6

Možnosti realizace: 1. Pole z předchozího kroku vlny (tzn. pole s číslem o 1 menším) nevyhledávat vždy procházením celé šachovnice, ale ukládat si jejich souřadnice navíc do fronty je třeba paměť navíc, ale urychlí to výpočet při vlně 2. U každého pole na šachovnici si pamatovat nejen minimální počet kroků, které na něj vedou, ale i souřadnice předchozího pole snadné nalezení předchůdce při zpětném chodu (ale zase je to paměťově i časově náročnější při provádění vlny ) Pavel Töpfer, 2017 Programování 1-10 7

Procházení grafu (např. pro určení souvislosti) - v obyčejném neorientovaném grafu projít ze zvoleného výchozího vrcholu všechny dostupné vrcholy - označujeme všechny již navštívené vrcholy, abychom někam nešli dvakrát (abychom nezačali v grafu chodit v cyklu) - můžeme rovnocenně použít průchod do hloubky nebo do šířky, liší se pořadím návštěvy jednotlivých vrcholů, ale oba najdou stejné řešení se stejnou (kvadratickou) časovou i paměťovou složitostí Možnosti realizace: 1. rekurzivní procedura realizující průchod do hloubky 2. zásobník nebo fronta pro řízení průchodu do hloubky resp. do šířky představují seznam dluhů = čísla těch vrcholů, do nichž jsme při prohledávání už přišli, ale z nichž jsme nezkoušeli jít dál 3. seznam dluhů dokonce nemusí být realizován ani jako zásobník nebo fronta, můžeme z něj vybírat vrchol ke zpracování libovolně (pak průchod grafem neprobíhá do hloubky ani do šířky) Pavel Töpfer, 2017 Programování 1-10 8