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



Podobné dokumenty
Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

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

alkoholu v organismu, jízdu výtahů s lidmi...).

DYNAMICKÉ PROGRAMOVÁNÍ A PROBLÉM BATOHU

GRAFY A GRAFOVÉ ALGORITMY

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

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

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

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

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

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

Je n O(n 2 )? Je n 2 O(n)? Je 3n 5 +2n Θ(n 5 )? Je n 1000 O(2 n )? Je 2 n O(n 2000 )? Cvičení s kartami aneb jak rychle roste exponenciála.

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

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Definice funkcí a procedur. Mnoho operací provozujeme opakovaně, proto je hloupé programovat je při každém použití znovu.

Digitální učební materiál

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

Anotace. Soubory a práce s nimi, rekurze podruhé, struktury (datový typ record), Martin Pergel,

Matice se v některých publikacích uvádějí v hranatých závorkách, v jiných v kulatých závorkách. My se budeme držet zápisu s kulatými závorkami.

Paralelní LU rozklad

Anotace. Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj

Anotace. Dijkstrův algoritmus,

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:

Řešení problému batohu dynamickým programováním, metodou větví a hranic a aproximativním algoritmem

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.

Stromy, haldy, prioritní fronty

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

12. Aproximační algoritmy

NPRG030 Programování I, 2018/19 1 / :25:37

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto

Anotace. Pointery. Martin Pergel,

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Časová a prostorová složitost algoritmů

Anotace. Pointery, dynamické proměnné

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

Determinant. Definice determinantu. Permutace. Permutace, vlastnosti. Definice: Necht A = (a i,j ) R n,n je čtvercová matice.

Další možnosti inicializace proměnných

Anotace. Ordinalni typy - typ char, funkce ord, chr, succ, prev, inc, dec,

Semafory Zobecněním operací WAKEUP a SLEEP přidáním celočíselného čítače vzniknou semafory a jejich atomické operace DOWN a UP.

Předmět: Algoritmizace praktické aplikace

Násobení pomocí sčítání

7. ODE a SIMULINK. Nejprve velmi jednoduchý příklad s numerických řešením. Řešme rovnici

Obsah: KR2 - Uživatelská příručka -1-

Digitální učební materiál

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

Operační systémy Tomáš Hudec. 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu Obědvající filosofové

Programování. Debugging a testování. Martin Urza

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

Často potřebujeme hledat mezi dvěma vrcholy grafu cestu, která je v nějakém

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

8. Posloupnosti, vektory a matice

zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.

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

( ) ( ) Lineární rovnice s parametrem II. Předpoklady: 2801

TGH07 - Chytré stromové datové struktury

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

METODICKÉ LISTY. výstup projektu Vzdělávací středisko pro další vzdělávání pedagogických pracovníků v Sokolově

Matice. Přednáška MATEMATIKA č. 2. Jiří Neubauer. Katedra ekonometrie FEM UO Brno kancelář 69a, tel

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

TGH07 - Chytré stromové datové struktury

Da D to t v o é v ty t py IB111: Datové typy

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

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132

Algoritmizace a programování

Lenka Zalabová. Ústav matematiky a biomatematiky, Přírodovědecká fakulta, Jihočeská univerzita. zima 2012

Operační systémy. Přednáška 5: Komunikace mezi procesy

Umělá inteligence I. Roman Barták, KTIML.

Dynamické programování

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE. Optimalizace trasy při revizích elektrospotřebičů

Programování I. Martin Pergel,

8. Geometrie vrací úder (sepsal Pavel Klavík)

Predispozice pro výuku IKT (2015/2016)

0. Lineární rekurence Martin Mareš,

Anotace. Jednotky (tvorba a využití), struktury (typ record),

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

PROGRAMOVÁNÍ. Cílem předmětu Programování je seznámit posluchače se způsoby, jak algoritmizovat základní programátorské techniky.

Digitální učební materiál

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

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

3. Matice a determinanty

Implementace LL(1) překladů

Teoretická rozdělení

Anotace. Objekt self, Zapouzdření, polymorfismus,

Zavádění inovativních metod a výukových materiálů do přírodovědných předmětů na Gymnáziu v Krnově

Algoritmizace. 1. Úvod. Algoritmus

Vícekriteriální hodnocení variant metody

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

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

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

Filtrace snímků ve frekvenční oblasti. Rychlá fourierova transformace

Katedra kybernetiky skupina Inteligentní Datové Analýzy (IDA) 9. dubna Filip Železný (ČVUT) Vytěžování dat 9.

TGH05 - Problém za milion dolarů.

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Svaz chovatelů holštýnského skotu ČR, o.s. MATING. Prý pro nás na webu udělali nějakou seznamku?! ver. 2.0

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

Inovace výuky prostřednictvím ICT v SPŠ Zlín, CZ.1.07/1.5.00/ Vzdělávání v informačních a komunikačních technologií

Kapitola 11. Vzdálenost v grafech Matice sousednosti a počty sledů

Sbírka příkladů. verze

Transkript:

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

Problémy, které byly Přednášející jde tentokrát do M1, počet platných uzávorkování pomocí n párů závorek, počet rozkladů přirozeného čísla na součet nerostoucích kladných celých čísel, Pascalův trojúhelník, nejdelší rostoucí podposloupnost, pořadí násobení matic, problém batohu.

Pascalův trojúhelník Obsahuje kombinační čísla, n-tý řádek konkrétně obsahuje hodnoty ( ( n 0), n ( 1),..., n n), při výpočtu využíváme toho, že ( ) ( n k = n 1 ) ( k + n 1 k 1), pro jednoduchost chceme spočítat jen číslo ( n k).

Pascalův trojúhelník rekurzívní řešení Získali jsme rekurenci ( ) ( n k = n 1 ) ( k 1 + n 1 ) k, z této snadno sestrojíme rekurzívní program: function kombin(n,k:integer):longint; begin end; begin if (k=0) or (k=n) then kombin:=1; else kombin:=kombin(n-1,k-1)+kombin(n-1,k); kombin(100,50); end. Mále stejný problém, pořád počítáme to samé mockrát. Opět přidáme cache na výsledky.

Pascalův trojúhelník const MAX=100; var cache:array[0..max,0..max] of longint; function kom(n,k:integer):longint; begin if cache[n,k]=0 then begin if (k=0) or (k=n) then cache[n,k]:=1 else cache[n,k]:=kom(n-1,k-1)+kom(n-1,k); end; kom:=cache[n,k]; end; var n,k:integer; begin read(n,k); writeln(kom(n,k)); end.

Násobení matic Násobení matic není komutativní, ale je asociativní. Máme-li vynásobit několik matic, nemůžeme jejich pořadí měnit, můžeme součin všelijak závorkovat. Různá uzávorkování jsou různě výhodná. Které z nich je to nejvýhodnější? Předpokládáme, že máme abstraktní funkce zjistící ze zadaných rozměrů složitost součinu matic správných tvarů.

Násobení matic Některé násobení provedeme jako poslední. To úlohu rozdělí na (nejvýše) dvě další instance. V každé (menší) instanci opět nějaké násobení provedeme jako poslední. Ideální podhoubí pro rekurzi!

Násobení matic function slozitost(od,az do:integer):longint; for i:=od to az do-1 do begin slozitost:=slozitost(od,i)+ slozitost(i+1,az do)+samotne nasobeni; Opět budeme zbytečně násobit stále to samé. Opět se toho zbavíme stejně.

Násobení matic function slozitost(od,az do:integer):longint; if cache[od,az do]=0 then for i:=od to az do-1 cache[od,az do]:=slozitost(od,i)+ slozitost(i+1,az do)+samotne nasobeni; slozitost:=cache[od,az do];

Metoda Všechny tyto problémy jsme řešili stejně: Navrhli jsme rekurzívní algoritmus, ten počítal často to samé, proto jsme mu doplnili cache. Pokud se podíváme pořádně, na správném místě cache najdeme výsledek. Potřebujeme tam tedy tu rekurzi? Ne a můžeme se jí zbavit za předpokladu, že zjistíme, jak vyplňovat cache, tedy tabulku. Tomu říkáme dynamické programování.

Odstranění rekurze Přednášející jde do posluchárny: a[1]:=1; a[2]:=2; for i:=3 to n do a[i]:=a[i-1]+a[i-2]; Pascalův trojúhelník: for i:=0 to n do for j:=0 to i do p(i,j):=p(i-1,j-1)+p(i-1,j); a okrajové případy zvlášť! Závorkování: Cvičení

Násobení matic poučení Tomuto říkáme dynamické programování. Zpravidla implementujeme pouze fázi vyplňování tabulky. Na tom je nepříjemné určovat, odkud vyplňování zahájit. Není tudíž špatné navrhnout si aspoň na počátku rekurzívní řešení a až pak rekurzi rozbít : cache[od,az do]:=min{cache[od,i]+cache[i,az do]+ samotne nasobeni} což stačí udělat cyklem.

Problém batohu Definition Problémem batohu nazveme problém, kdy máme zadány váhy jednotlivých předmětů (w 1,... w n ) a jejich ceny (c 1,... c n ) a nosnost batohu m a ptáme se, jak naložit batoh co nejcennějším obsahem. Předpokládejme variantu, že všechna čísla jsou přirozená! Rekurzivní řešení: Načti předměty a volej funkci přidej(k,l). První parametr říká, kolik předmětů už v batohu je, druhý určuje index posledního z nich. Nevýhoda: Zkoušíme všechny možnosti. Zlepšení? Dynamickým programem, ale neotřelým způsobem.

Vytvoř pomocné batohy s nosnostmi 1, 2,... m a proměnné popisující optimum v nich zinicializuj nulami. Pro každý předmět i přepočítej všechny batohy a zjisti, zda dopadnou lépe, pokud předmět přidáme nebo ne: Pro batoh k zjisti, pokud cena batohu(k)<cena batohu(k w i ) + c i. Pokud ano, cena batohu(k):=cena batohu(k w i ) + c i. Invariant: Řešíme-li prvek i, evidujeme (před touto fází) optimální naplnění batohů pomocí prvků 1, 2,... k 1. Složitost: mn. Pozor, pokud nejsou čísla přirozená, stává se problém NP-těžkým. Není ale silně NP-těžký, což znamená, že těžkost se vynucuje velkými čísly lišícími se o málo.

Simulace je modelování, při kterém sledujeme časový průběh děje. Každou chvíli chceme něco simulovat. Jak to udělat? Dva typy procesů: Spojité a diskrétní. Spojité: Například míchání kapalin. Diskrétní: Například nákup v obchodu. Spojitá simulace se typicky řeší metodami matematické analýzy. se programuje. Zjednodušování a zkoumání, co je podstatné.

Počítačová simulace Cílem je zjistit, jak se model bude chovat pro zadaná data. operuje s konečným počtem jevů, z nichž každý běží spočitatelným způsobem. Například: Zákazník přejde z oddělení hraček do restaurace, pokladní spočítá útratu... Typický příklad u nás používaný: Auta s pískem.

Auta s pískem Chceme odvézt hromadu písku z místa A do místa B. Máme několik automobilů se známými parametry: rychlost jízdy jednotlivými úseky (tedy doba průjezdu), nosnost (kolik lze naložit), doba nakládání,... Na cestě je kritická sekce, ve které se auta nemohou míjet. Semafor pustí jen jedno. Otázka: Jak dlouho budeme hromadu písku převážet z místa A na místo B, pokud v 8 hodin ráno přijde 10 dělníků s lopatami na obě místa a na místo A přijedou dvě nákladní auta?

Auta s pískem Pokud by auta neinteragovala (nezdržovala se a nemusela na sebe čekat), jde o úlohu typu jeden kopáč vykope příkop za hodinu, za jak dlouho nakope příkop deset kopáčů. Co ale dělat, pokud jedno auto má vyšší nosnost, musí jet nižší rychlostí, auta nelze nakládat současně a před kritickou sekcí je třeba čekat na semaforu? Budeme simulovat jednotlivé události: Auto přijelo (do bodu A, do bodu B, ke kritické sekci, na konec kritické sekce), auto odjíždí (z místa A nebo B). Uděláme si graf jak po sobě události následují v závislosti na okolí a odsimulujeme (například ručně budeme tahat autíčky a znamenat si čas).

Další příklady Samoobsluha: Zákazník přijde do obchodu, chvíli bloudí mezi jednotlivými odděleními, pak se postaví do fronty u pokladny, zaplatí a odejde. Cíl: Jak zorganizovat vnitřek obchodu, aby v ní zákazníci zbytečně netrávili dlouhý čas (případně utratili co nejvíce)... Výtahy: V budově je několik výtahů, lidé chtějí cestovat z patra do patra. Jak dlouho se bude čekat na výtah máme-li přiměřený popis chování lidí?

Jak to naprogramovat? Vůbec není podstatné, jak jednotlivé akce probíhají, ale jen jak se mezi nimi přechází (tedy kdy doběhne jedna akce a nastane další). Návaznosti akcí jsou dobře definovány! Implementujeme tzv. kalendář událostí...

Kalendář událostí Kalendář událostí je datová struktura osazená operacemi extract min, insert a delete. Operace dělají toto (v tomto pořadí): vyber událost, která se má odehrát jako první (od současného (simulovaného) okamžiku); naplánuj (budoucí) událost; zruš naplánovanou událost. Událost má čas (kdy nastane) a popis účasníků (a popis události). Příklad: 11:20, konec přednášky, účastníci: přednášející (smaže tabuli), studenti (každý někam odejde).

Kalendář událostí Jak to realizovat? Spojovým seznamem (uspořádaným nebo neuspořádaným), haldou, polem (pokud umíme shora omezit maximální délku kalendáře),... (použitá datová struktura ovlivňuje složitost). Co s procesy, které čekají?

Stavy procesů Dobrá, pro začátek stavy procesů: běží proces počítá, tedy jej právě zpracováváme (rozhodujeme, co s ním). Aktivní je vždy nejvýše jeden proces (pokud nemáme pro simulaci paralelní prostředí). naplánován má v kalendáři událostí zařazenu plánovanou událost; víme, kdy se s ním něco stane. čeká bude aktivován jiným procesem je dobře definováno jakým, ale nemůžeme ještě říci, kdy se tak stane (například auto čeká před kritickou sekcí, až semafor nastaví zelenou v jeho směru, nebo zákazník čeká ve frontě, až budou vybaveni všichni zákazníci před ním). ukončený proces doběhl takový proces buďto zrušíme, nebo udržujeme pro účely zjištění údajů o jeho běhu.

Neživé procesy Budou všechny procesy k nalezení v kalendáři událostí? Co když u některého procesu nevíme, kdy může být naplánován? Ten v kalendáři naplánován nebude, nesmíme o něm ale ztratit údaje. Čekající procesy musíme vhodným způsobem organizovat (nastrkat do vhodných front, případně jiných datových struktur).

Simulační jádro je částí hlavního programu pracující s kalendářem událostí. Vyzvedne z kalendáře nejbližší událost a zpracuje. Pozor, tato událost nás může přimět vyházet z kalendáře některé další události! Pozor, obsloužení události může vyústit v naplánování další události procesu, nebo v jeho deaktivaci (čekání ve frontě). Taktéž můžeme některé procesy aktivovat (probudit).

Simulační program Zinicializuje kalendář událostí a pomocné fronty, načte příslušná data, naplánuje iniciální události, spustí jádro, vypíše výsledky (typicky čas konce simulace).

Příklad: Auta s pískem Zjistíme počet a parametry jednotlivých aut, co auto, to proces. Auta předjedou ve stanovený čas (naplánujeme pro ně na správnou dobu událost asi přijeď k hromadě ). Událost přijeď k hromadě zjistí, zda je hromada volná. Pokud ne, zařadí se do fronty. Pokud ano, naplánuje událost odjezd. Událost odjezd naplánuje příjezd auta ke kritické sekci a probudí první auto čekající ve frontě u hromady.

Příklad: Auta s pískem pokračování příjezd ke kritické sekci zjistí, zda je kritická sekce volná (na semaforu zelená). Pokud ne, zařadí se do fronty u semaforu. Pokud volno je, naplánuje si odjezd z kritické sekce. odjezd z kritické sekce naplánuje příjezd ke staveništi a probudí auta čekající v protisměru. přijeď ke staveništi a odjezd ze staveniště se chová podobně jako u hromady.

Konec Teď už to jen naprogramovat......děkuji za pozornost...