Programowanie dynamiczne

Podobne dokumenty
Programowanie dynamiczne

Uniwersytet Kazimierza Wielkiego w Bydgoszczy Zespół Szkół nr 5 Mistrzostwa Sportowego XV Liceum Ogólnokształcące w Bydgoszczy

Algorytmy i Struktury Danych

Projektowanie i analiza algorytmów

Programowanie dynamiczne cz. 2

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Wstęp do programowania

Wstęp do programowania

Strategia "dziel i zwyciężaj"

15. Macierze. Definicja Macierzy. Definicja Delty Kroneckera. Definicja Macierzy Kwadratowej. Definicja Macierzy Jednostkowej

Zaprojektować i zaimplementować algorytm realizujący następujące zadanie.

Programowanie dynamiczne (optymalizacja dynamiczna).

det[a 1,..., A i,..., A j,..., A n ] + det[a 1,..., ka j,..., A j,..., A n ] Dowód Udowodniliśmy, że: det[a 1,..., A i + ka j,..., A j,...

0 + 0 = 0, = 1, = 1, = 0.

Wstęp do programowania

Macierze. Rozdział Działania na macierzach

WZÓR OGÓLNY CIĄGU GEOMETRYCZNEGO

Złożoność obliczeniowa zadania, zestaw 2

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

Rozwiązywanie problemów z użyciem Solvera programu Excel

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Rozdział 5. Macierze. a 11 a a 1m a 21 a a 2m... a n1 a n2... a nm

Macierze - obliczanie wyznacznika macierzy z użyciem permutacji

ALGORYTMY I STRUKTURY DANYCH

Schemat programowania dynamicznego (ang. dynamic programming)

TEORETYCZNE PODSTAWY INFORMATYKI

Wstęp do Programowania potok funkcyjny

1 Macierze i wyznaczniki

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

; B = Wykonaj poniższe obliczenia: Mnożenia, transpozycje etc wykonuję programem i przepisuję wyniki. Mam nadzieję, że umiesz mnożyć macierze...

Zestaw 12- Macierz odwrotna, układy równań liniowych

Rekurencja (rekursja)

Metody i analiza danych

Teoretyczne podstawy informatyki

Wykład 14. Elementy algebry macierzy

Rozwiązywanie układów równań liniowych

Wstęp do informatyki Ćwiczenia. Piotr Fulmański

dr Mariusz Grządziel 15,29 kwietnia 2014 Przestrzeń R k R k = R R... R k razy Elementy R k wektory;

I. Podstawy języka C powtórka

Wstęp do programowania

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Układy równań liniowych. Krzysztof Patan

Programowanie Współbieżne. Algorytmy

Rekurencja/rekursja. Iluzja istnienia wielu kopii tego samego algorytmu (aktywacji) Tylko jedna aktywacja jest aktywna w danej chwili

2. Układy równań liniowych

EGZAMIN MATURALNY Z INFORMATYKI 17 MAJA 2016 POZIOM PODSTAWOWY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I WYBRANE: Czas pracy: 75 minut

CIĄGI wiadomości podstawowe

MACIERZE I WYZNACZNIKI

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

5. Rozwiązywanie układów równań liniowych

Techniki konstruowania algorytmów. Metoda dziel i zwyciężaj

Technologia informacyjna Algorytm Janusz Uriasz

Katarzyna Bereźnicka Zastosowanie arkusza kalkulacyjnego w zadaniach matematycznych. Opiekun stypendystki: mgr Jerzy Mil

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Rekurencja. Przykład. Rozważmy ciąg

Algorytmy i struktury danych.

Jarosław Wróblewski Matematyka Elementarna, zima 2014/15

Ekoenergetyka Matematyka 1. Wykład 3.

Algorytmy w teorii liczb

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

3. Wykład Układy równań liniowych.

Transformata Fouriera. Sylwia Kołoda Magdalena Pacek Krzysztof Kolago

Obliczenia iteracyjne

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

Macierzowe algorytmy równoległe

jest rozwiązaniem równania jednorodnego oraz dla pewnego to jest toŝsamościowo równe zeru.

Zaawansowane algorytmy i struktury danych

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

PODSTAWY AUTOMATYKI. MATLAB - komputerowe środowisko obliczeń naukowoinżynierskich - podstawowe operacje na liczbach i macierzach.

Matematyka Dyskretna 2/2008 rozwiązania. x 2 = 5x 6 (1) s 1 = Aα 1 + Bβ 1. A + B = c 2 A + 3 B = d

Met Me ody numer yczne Wykład ykład Dr inż. Mic hał ha Łanc Łan zon Instyt Ins ut Elektr Elektr echn iki echn i Elektrot Elektr echn olo echn

Interpolacja funkcji

Algorytmy i struktury danych

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Macierze i Wyznaczniki

(mniejszych od 10 9 ) podanych przez użytkownika, wypisze komunikat TAK, jeśli są to liczby bliźniacze i NIE, w przeciwnym przypadku.

Metoda eliminacji Gaussa. Autorzy: Michał Góra

//warunki początkowe m=500; T=30; c=0.4; t=linspace(0,t,m); y0=[-2.5;2.5];

Treść wykładu. Układy równań i ich macierze. Rząd macierzy. Twierdzenie Kroneckera-Capellego.

O MACIERZACH I UKŁADACH RÓWNAŃ

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Wykład 4. Informatyka Stosowana. Magdalena Alama-Bućko. 25 marca Magdalena Alama-Bućko Wykład 4 25 marca / 25

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Modele i narzędzia optymalizacji w systemach informatycznych zarządzania

Programowanie celowe #1

Zaawansowane algorytmy i struktury danych

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

Podstawy OpenCL część 2

Układy równań i nierówności liniowych

MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata

1 Zbiory i działania na zbiorach.

Zestaw 12- Macierz odwrotna, układy równań liniowych

Rijndael szyfr blokowy

, A T = A + B = [a ij + b ij ].

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

EGZAMIN MATURALNY Z INFORMATYKI 17 MAJA 2016 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I WYBRANE: Czas pracy: 90 minut

MATEMATYKA I SEMESTR ALK (PwZ) 1. Sumy i sumy podwójne : Σ i ΣΣ

Programowanie dynamiczne

WYRAŻENIA ALGEBRAICZNE

Transkrypt:

Programowanie dynamiczne Ciąg Fibonacciego fib(0)=1 fib(1)=1 fib(n)=fib(n-1)+fib(n-2), gdzie n 2 Elementy tego ciągu stanowią liczby naturalne tworzące ciąg o takiej własności, że kolejny wyraz (z wyjątkiem dwóch pierwszych) jest sumą dwóch poprzednich (tj. 1,1,2,3,5, 8,13, ). Obliczanie czwartego elementu ciągu Fibonacciego fib(4) fib(3) fib(2) fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) Każde pogrubione wyrażenie stanowi problem elementarny. Problem o rozmiarze n 2 zostaje rozbity na dwa problemy o mniejszym stopniu skomplikowania: n-1 i n-2. Proces dekompozycji zatrzymuje się na przypadkach elementarnych. Zaimplementuj powyższy algorytm. Wada Można dostrzec, że znaczna część obliczeń jest wykonywana więcej niż jeden raz (np. cała gałęź zaczynająca się od fib(2) jest wręcz zdublowana). Z powyższą wadą radzi sobie programowanie dynamiczne. koncepcja: dla danego problemu stwórz rekurencyjny model jego rozwiązania (wraz z jednoznacznym określeniem przypadków elementarnych). Stwórz tablicę w której będzie można zapamiętywać rozwiązania przypadków elementarnych i rozwiązania podproblemów, które zostaną obliczone na ich podstawie. inicjacja: wpisz do tablicy wartości, które odpowiadają przypadkom elementarnym progresja: na podstawie wartości wpisanych do tablicy używając formuły rekurencyjnej oblicz rozwiązanie problemu wyższego rzędu i wpisz je do tablicy. Postępuj w ten sposób aż do uzyskania pożądanej wartości.

Ciąg Fibonacciego przy użyciu programowania dynamicznego koncepcja: wzór rekurencyjny jest znany, więc pozostaje zadeklarować tablicę fib[n] do przechowywania obliczanych wartości. inicjacja: początkowymi wartościami w tablicy fib będą oczywiście warunki początkowe: fib[0]=1 oraz fib[1]=1 progresja: ten punkt zależy ściśle od wzoru rekurencyjnego, który implementujemy za pomocą tablicy. W naszym przypadku wartością fib[i] w tablicy (dla 2 i) jest suma dwóch poprzednio obliczonych wartości: fib[i-1] oraz fib[i-2]. Zaimplementuj powyższy algorytm. Współczynnik dwumianowy Newtona =!!! dla 0 k n Dla n i k, które nie są małe nie możemy obliczyć współczynnika dwumianowego bezpośrednio z tej definicji, ponieważ wartość n! jest bardzo duża nawet dla średnich wartości n. Możemy zastosować poniższy wzór rekurencyjny = 1 1 + 1 0 < < 1 = 0 = Napisz program obliczania współczynnika dwumianowego przy użyciu podejścia typu dziel i zwyciężaj. Algorytm ten jest bardzo niewydajny, oblicza 2 1 wyrazów w celu obliczenia wartości. Problem polega na tym, że te same realizacje są rozwiązywane w każdym wywołaniu rekurencyjnym. Przykładowo wywołania dwumianowy n-1,k-1 oraz dwumianowy n-1,k wiążą się z obliczeniem wartości dwumianowy n-2,k-1 i realizacja ta jest rozwiązywana niezależnie w każdym wywołaniu. Podejście typu dziel i zwyciężaj nigdy nie jest wydajne, kiedy realizacja jest dzielona na dwie mniejsze realizacje, których rozmiar jest zbliżony do rozmiaru oryginalnej realizacji. Napisz program obliczający współczynnik dwumianowy wykorzystując programowanie dynamiczne. Znamy już właściwość rekurencyjną, więc wykorzystajmy ją do skonstruowania rozwiązania wykorzystującego tablicę B, gdzie B[i][j] będzie zawierać wartość " # $ %.

Etapy tworzenia algorytmu: 1. Określamy właściwość rekurencyjną. Zapisujemy ją w kontekście użycia tablicy B,[# 1][$ 1] +,[# 1][$] 0<$<# B[i][j]=+ 1 $=0 $=# 2. Rozwiązujemy realizację problemu w porządku wstępującym, rozpoczynając od pierwszego wiersza i wyliczając po kolei wartości w wierszach tablicy B. Obliczmy wartość B[4][2]= 4 2 Obliczamy wiersz 0: Etap ten jest wykonywany wyłącznie w celu dokładnego odwzorowania algorytmu. Wartość B[0][0] nie jest potrzebna w dalszych obliczeniach. Obliczamy wiersz 1: B[1][0]=1 B[1][1]=1 Obliczamy wiersz 2: B[2][0]=1 B[2][1]=B[1][0]+B[1][1]=1+1=2 B[2][2]=1 Obliczamy wiersz 3: B[3][0]=1 B[3][1]=B[2][0]+B[2][1]=1+2=3 B[3][2]=B[2][1]+B[2][2]=2+1=3 Obliczamy wiersz 4 B[4][0]=1 B[4][1]=B[3][0]+B[3][1]=1+3=4 B[4][2]=B[3][1]+B[3][2]=3+3=6

W przykładzie tym obliczaliśmy po kolei coraz większe wartości współczynnika dwumianowego. W każdym przebiegu wartości potrzebne do wykonania bieżących działań były już obliczane i zachowane. Łańcuchowe mnożenie macierzy Rozważmy obliczenie iloczynu n macierzy M = M 1 M 2... M n, gdzie każde M i jest macierzą mającą r i-1 wierszy i r i kolumn. Bez względu na to jaki algorytm do macierzy stosujemy istotny wpływ na całkowitą liczbę operacji potrzebnych do policzenia M ma kolejność mnożenia macierzy. Przykład Przyjmujemy, że mnożenie macierzy rozmiaru p x q przez macierz rozmiaru q x r wymaga p q r operacji. Chcemy obliczyć iloczyn M = M 1 M 2 M 3 M 4 o wymiarach odpowiednio [10 x 20], [20 x 50], [50 x 1], [1 x 100], Obliczmy M wg schematu M = M 1 (M 2 (M 3 M 4 )) M34 = M 3 M4 = 50 1 100 = 5000 - koszt mnożenia, wymiar powstałej macierzy M34 [50 x 100] M 234 = M 2 M34= 20 50 100 = 100000- koszt mnożenia, wymiar macierzym 234 to [20 x 100] M 1 M 234 = 10 20 100 = 20000 - koszt mnożenia 5000 + 100000 + 20000 = 125000 - całkowity koszt mnożenia Policzmy teraz M dla schematu

Chcemy otrzymać optymalną kolejność mnożenia na podstawie powyższej tablicy s. W tym celu najpierw odwiedzamy element s[1][n], ( w naszym przykładzie n=4). Więc s[1][4]=3, co oznacza, że optymalna kolejność dla mnożenia macierzy od 3 4 do 3 5 posiada rozkład (3 4 3 6 3 7 )3 5 (s[1][4] czyli 3 jest punktem, w którym macierze powinny zostać rozdzielone w celu otrzymania czynników). Następnie chcemy określić jak wygląda rozkład dla mnożenia macierzy od 3 4 do 3 7. Zatem sprawdzamy ile wynosi s[1][3]. Widzimy, że s[1][3]=1. Więc rozkład od 3 4 do 3 7 przybiera następującą postać 3 4 (3 6 3 7 ). Zatem wiemy, że poprawna kolejność nawiasów jest następująca ((3 4 (3 6 3 7 ))3 5. Zaimplementuj powyższy algorytm łańcuchowego mnożenia macierzy.