Základy algoritmizace 4. Problémy, algoritmy, data

Podobné dokumenty
Funkce a procedury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 5 A0B36PR1 Programování 1

Část 1 Funkce, lokální proměnné a přidělování paměti. Funkce a procedury. Část 2 Cykly a řízení jejich průchodu. Část 3 Příklady

Rozklad problému na podproblémy

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

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

Rozklad problému na podproblémy, rekurze

5. Vyhledávání a řazení 1

Rozklad problému na podproblémy, rekurze

Kámen-nůžky-papír. Tomáš Svoboda Centrum strojového vnímání, Katedra kybernetiky Fakulta elektrotechnická, České vysoké učení technické

Kámen-nůžky-papír. Tomáš Svoboda Centrum strojového vnímání, Katedra kybernetiky Fakulta elektrotechnická, České vysoké učení technické

3. Řízení běhu programu

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

Funkce, intuitivní chápání složitosti

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

10. Složitost a výkon

Dekompozice problému, rekurze

Řídicí struktury. alg3 1

Chyby a výjimky. Chyba. Odkud se chyby berou? Kdo chyby opravuje? Co můžete dělat jako programátor? Dvě hlavní metody práce s chybami.

UPPAAL příklady. Jiří Vyskočil 2010

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

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

Rekurzivní algoritmy

11. Přehled prog. jazyků

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Návrh aplikace. Založeno na 9. kapitole knihy J. M. Zelle: Python Programming: An Introduction to Computer Science IB111

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Programování v Pythonu

Teorie her a ekonomické rozhodování. 4. Hry v rozvinutém tvaru

Algoritmizace a programování

Řídící struktury, if, while, switch

Programy a algoritmy pracující s čísly. IB111 Úvod do programování

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

Programy a algoritmy pracující s čísly. IB111 Úvod do programování skrze Python

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

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

Řídící struktury, if, while, switch

Třídění a vyhledávání Searching and sorting

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

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

2. Řešení úloh hraní her Hraní her (Teorie a algoritmy hraní her)

IB111 Úvod do programování skrze Python

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

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.

KTE / ZPE Informační technologie

(a kryptografické odbočky) IB111 Úvod do programování skrze Python

NPRG030 Programování I, 2017/18 1 / :22:16

Programy a algoritmy pracující s čísly. IB111 Úvod do programování skrze Python

Algoritmizace a programování

Algoritmizace a programování

Hraní her. (Teorie a algoritmy hraní her) Řešení úloh hraní her. Václav Matoušek /

IB111 Úvod do programování skrze Python Přednáška 7

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Funkce, podmíněný příkaz if-else, příkaz cyklu for

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Rekurze. IB111 Úvod do programování skrze Python

Abstraktní datové typy

Spojový seznam. Jan Kybic.

Rekurze a rychlé třídění

6 Příkazy řízení toku

Programování: základní konstrukce. IB111 Úvod do programování

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

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

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

Algoritmus pro generování normálních magických čtverců

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

Větvení a cykly. Úvod do programování 1 Tomáš Kühr

Algoritmizace a programování

A7B38UOS Úvod do operačních systémů. 6. Cvičení. Příkazy sed a awk

Optimalizace & soft omezení: algoritmy

Prioritní fronta, halda

IB111 Úvod do programování skrze Python

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Implementace LL(1) překladů

Lekce 01 Úvod do algoritmizace

ALGORITMIZACE A PROGRAMOVÁNÍ

Vyhledávání v textu. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Úvod do programování - Java. Cvičení č.4

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Pseudonáhodná čísla = algoritmicky generovaná náhrada za náhodná čísla

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

Abstrakt. V příspěvku se budeme zabývat kombinatorickými hrami s úplnou informací

(a kryptografické odbočky) IB111 Úvod do programování skrze Python

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Řetězce a řídicí struktury

IB111 Úvod do programování skrze Python Přednáška 6

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

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Gymnázium, Praha 6, Arabská 16. předmět Programování, vyučující Tomáš Obdržálek Lodě Dokumentace ročníkového projektu Martin Karlík, 1E 17.5.

Paměť počítače. alg2 1

Operační systémy. Cvičení 4: Programování v C pod Unixem

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Transkript:

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 1 Základy algoritmizace 4. Problémy, algoritmy, data doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 2 Základy algoritmizace Dnes: Řešení problému a algoritmus Rozklad problému na podproblémy Ukládání dat pole

Výpočet největšího společného dělitele Úloha Najděte největší společný dělitele přirozených čísel x a y. Řešení Vstup: dvě přirozená čísla x a y Výstup: přirozené číslo d největší společný dělitel x a y Základní varianta: def getgreatestcommondivisor(x, y): if (x<y) : d = x else: d = y while ((x % d!= 0) or (y % d!= 0)): d = d - 1 return d Pro (51851814,5185152) 185110 iterací cyklu while Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 3

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 4 Výpočet největšího společného dělitele Místo výběru menšího z čísel x a y vnoříme do těla hlavního cyklu dva cykly zmenšující hodnoty aktuálních hodnot x a y def getgreatestcommondivisorloops(x, y): while (x!= y): while (x>y): x -= y while (y>x): y -=x return x Pro (51851814,5185152) 17650 iterací vnitřních cyklů while Vnitřní cykly počítají nenulový zbytek po dělení většího čísla menším

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 5 Výpočet největšího společného dělitele Vnitřní cykly můžeme nahradit přímým výpočtem zbytku po dělení def getgreatestcommondivisoreuclid(x, y): remainder = x % y while (remainder!= 0): x = y y = remainder remainder = x % y return y Pro (51851814,5185152) 4 iterace cyklu while Euklidův algoritmus Určíme zbytek po dělení daných čísel Zbytkem dělíme dělitele a určíme nový zbytek, až dosáhneme nulového zbytku Poslední nenulový zbytek je největší společný dělitel

Jak najít správný algoritmus? Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 6

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 7 Rozklad problému na podproblémy Postupný návrh programu rozkladem na podproblémy Zadaný problém rozložíme na podproblémy Pro řešení podproblémů zavedeme abstraktní příkazy S abstraktními příkazy sestavíme hrubé řešení Abstraktní příkazy realizujeme jako funkce Příklad hra NIM První počítačová hra (1951) Hra dvou hráčů v odebírání herních kamenů (nebo zápalek)

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 8

Hra NIM Pravidla Hráč zadá počet herních kamenů Pak se střídá se strojem v odebírání Lze odebrat 1, 2, nebo 3 kameny Prohraje ten, kdo odebere poslední herní kámen Dílčí problémy Zadání počtu kamenů Odebrání kamenů hráčem Odebrání kamenů strojem Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 9

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 10 Příklad průběhu hry Zadej počet kamenů (15 až 35): 18 Stav hry Počet kamenů ve hře Kdo je na tahu počítač (P) nebo hráč (H) Průběh 1. Počet kamenů 18; Kolik odeberete? 1 (H) 2. Počet kamenů 17; Odebírám 1 (P) 3. Počet kamenů 16; Kolik odeberete? 3 (H) 4. Počet kamenů 13; Odebírám 1 (P) 5. Počet kamenů 12; Kolik odeberete? 3 (H) 6. Počet kamenů 11; Odebírám 1 (P) 7. Počet kamenů 8; Kolik odeberete? 3 (H) 8. Počet kamenů 5; Odebírám 1 (P) 9. Počet kamenů 4; Kolik odeberete? 3 (H) 10. Počet kamenů 1; Odebírám 1 (P) Hráč vyhrál, počítač odebral poslední kámen

NIM pravidla pro odebírání Počet kamenů nevýhodných pro protihráče je 1, 5, 9, Obecně 4n + 1, kde n je celé nezáporné číslo Stroj musí z počtu kamenů K odebrat x kamenů, aby platilo K x == 4n + 1 x == (K 1) 4n, tj. hledáme zbytek po dělení 4 x = (K 1) % 4 Je-li x == 0, je okamžitý počet kamenů pro stroj nevýhodný a bude-li protihráč postupovat správně, stroj prohraje Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 11

NIM hrubý návrh řešení Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 12 numberofstones = getnumberofstones(limits) machine = True while (numberofstones): if machine: machineturn() else: humanturn() machine = not machine if machine: print("machine wins!") else: print("human wins!") Podproblémy getnumberofstones, machineturn a humanturn reprezentují abstraktní příkazy, které implementujeme jako funkce vracející počet kamenů k odebrání

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 13 NIM podrobnější návrh Funkce na zadání počtu kamenů v rámci limitu Ošetříme vstup na rozsah hodnot Možno ošetřit proti špatnému zadání Zkuste si sami def getnumberofstones(min, max): n = int(input("enter number of stones in range [" + str(min)+ "," + str(max) + "]: ")) if n < min: return min if n > max: return max return n

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 14 NIM podrobnější návrh Funkce pro tah hráče Akceptujeme jen validní tahy 1, 2 nebo 3 kameny Vstupy plně ošetřeny def humanturn(n): r = "" while (r!= "1" and r!= "2" and r!= "3"): r = input("number of stones is " + str(n) + ". How many stones you will take: ") return int(r)

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 15 NIM podrobnější návrh Funkce pro tah stroje Pomocí výpočtu optimální strategie def machineturn(n): r = (n-1) % 4 if r == 0: r = 1 print("number of stones is " + str(n) + ". I take: " + str(r)) return r

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 16 NIM podrobnější návrh Finální program Vyzkoušejte si naprogramovat a otestovat pro případ, kdy začíná počítač nebo člověk Kdo vyhrává při aplikování optimální strategie? MIN_S = 15 MAX_S = 35 machine = True numberofstones = getnumberofstones(min_s, MAX_S) while (numberofstones > 0): if machine: numberofstones -= machineturn(numberofstones) else: numberofstones -= humanturn(numberofstones) machine = not machine if machine: print("machine wins!") else: print("human wins!")

Když proměnná nestačí Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 17

Stav hry U hry NIM je stav udržován v jedné proměnné Varianta multiple-heap musí udržovat více stavových proměnných heap1 = 10 heap2 = 20 heap3 = 30 Co když máme tisíc hromádek? Použijeme pole Vícerozměrná data? Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 18

Pole Vícerozměrná data pole polí Používáme seznamy, či tuple Matice, šachovnice, Příklad reprezentace piškvorky (tic-tac-toe) Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 19

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 20 Tic Tac Toe Jak se liší od hry NIM? Reprezentace dat Složitější výpočet strategie Test konce hry Test přípustnosti tahu sizeofgame = getsizeofgame(limits) machine = True while (not gamefinished()): if machine: machineturn() else: humanturn() machine = not machine if machine: print("machine wins!") else: print("human wins!")

Tic Tac Toe Příklad generování hry def getgame(): n = int(input("enter size of the game (minimum 3): ")) if n < 3: n = 3 game = [] for x in range(n): row = [] for y in range(n): row.append("-") game.append(row) return game Nebo def getgame(): n = int(input("enter size of the game (minimum 3): ")) if n < 3: n = 3 return [["-" for x in range(n)] for x in range(n)] Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 21

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 22 Tic Tac Toe Příklad vykreslování hry def printgame(game): for row in game: print(" ", end = '') for char in row: print(char+" ", end = '') print()

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 23 Tic Tac Toe Tah hráče def humanturn(game, char): x,y = -1, -1 while (not isallowed(game, x, y)): printgame(game) x = int(input("enter X position of your move: ")) y = int(input("enter Y position of your move: ")) game[x][y] = char

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 24 Tic Tac Toe Tah počítače Kde je AI???? Zacyklí se? import random def machineturn(game, char): x,y = -1, -1 while (not isallowed(game, x, y)): x = random.randint(0,len(game)-1) y = random.randint(0,len(game)-1) game[x][y] = char Udělejte si v klidu doma Statistika vs. pseudo-náhodná čísla

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 25 Tic Tac Toe Příklad testu tahu def isallowed(game, x, y): if x<0 or x >= len(game): return False if y<0 or y >= len(game): return False return game[x][y] == "-" Příklad testu remízy def boardfull(game): for row in game: for cell in row: if cell == "-": return False return True

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 26 Tic Tac Toe Test konce hry def gamefinished(game): for x in range(len(game)): for y in range(len(game)): char = game[x][y] if char == "-": continue if (y < len(game)-2 and game[x][y+1] == char and game[x][y+2]) == char: return char if (x< len(game)-2 and game[x+1][y] == char and game[x+2][y] == char): return char # add other two directions

Tic Tac Toe A celá hra. machine = True game = getgame() while True: if boardfull(game): print("no winner!") break; winner = gamefinished(game) if not winner: if machine: machineturn(game,"o") else: humanturn(game, "X") machine = not machine else: if winner == "O": print("machine wins!") else: print("human wins!") break Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 27

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 28 Tic Tac Toe Hra funguje? Nedostatky: Test pouze 3 kamenů Nekontrolujeme diagonály Slabá AI Není někde chyba? Jak to budeme testovat? Dodělejte/opravte si sami ;-) Měli jsme dobrou specifikaci hry? Je dobré si pořádně promyslet co program má dělat a za jakých podmínek

Práce s polem Seznamy a řetězce druhá přednáška Mohou být vnořené Tvoření pomocí append nebo zřetězení Přístup přes indexy array = [0 for x in range(n)] Možno modifikovat obsah Iterace pomocí cyklu for nebo while for x in array: dosomething(x) i = 0 while i<len(array): dosomething(array[i]) i+=1 Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 29

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 30 Základy algoritmizace Dnes: Řešení problému a algoritmus Příklad výpočet společného dělitele Rozklad problému na podproblémy Příklad hra NIM Ukládání dat pole Příklad hra Tic Tac Toe Příště vyhledávání a řazení