Techniki projektowania algorytmów

Podobne dokumenty
Struktury danych i złożoność obliczeniowa Wykład 2. Prof. dr hab. inż. Jan Magott

Algorytmy i Struktury Danych

Optymalizacja. Wybrane algorytmy

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Wybrane podstawowe rodzaje algorytmów

Zaawansowane algorytmy i struktury danych

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

Algorytmy i struktury danych.

Projektowanie i analiza algorytmów

Algorytmy i Struktury Danych

Temat: Algorytmy zachłanne

Algorytmy metaheurystyczne podsumowanie

Programowanie dynamiczne cz. 2

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Technologie informacyjne Wykład VII-IX

Wstęp do programowania

Techniki optymalizacji

Schemat programowania dynamicznego (ang. dynamic programming)

Wstęp do programowania

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,

TEORETYCZNE PODSTAWY INFORMATYKI

Zadania laboratoryjne i projektowe - wersja β

Strategia "dziel i zwyciężaj"

Wykład 10 Grafy, algorytmy grafowe

Złożoność algorytmów. Wstęp do Informatyki

Sortowanie danych. Jolanta Bachan. Podstawy programowania

1. LICZBY DZIAŁ Z PODRĘCZNIKA L.P. NaCoBeZu kryteria sukcesu w języku ucznia

Programowanie Równoległe i Rozproszone. Algorytm Kung a. Algorytm Kung a. Programowanie Równoległe i Rozproszone Wykład 8. Przygotował: Lucjan Stapp

9. Schematy aproksymacyjne

Programowanie dynamiczne

Zaawansowane algorytmy i struktury danych

Heurystyczne metody przeszukiwania

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

INFORMATYKA WYBRANE ALGORYTMY OPTYMALIZACYJNE KRYPTOLOGIA.

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

Podstawy programowania. Podstawy C# Przykłady algorytmów

Wstęp do programowania

Opis problemu i przedstawienie sposobu jego rozwiązania w postaci graficznej. Gimnazjum nr 3 im. Jana Pawła II w Hrubieszowie 1

Optymalizacja. Algorytmy dokładne

Wykład 8. Rekurencja. Iterować jest rzeczą ludzką, wykonywać rekursywnie boską. L. Peter Deutsch

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Analiza algorytmów zadania podstawowe

Algorytmy zrandomizowane

Plan wykładu. Przykład. Przykład 3/19/2011. Przykład zagadnienia transportowego. Optymalizacja w procesach biznesowych Wykład 2 DECYZJA?

Optymalizacja. Symulowane wyżarzanie

Algorytmy i Struktury Danych.

Wstęp do programowania

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

Algorytmy i struktury danych

PROBLEM: SORTOWANIE PRZEZ ODWRÓCENIA METODA: ALGORYTMY ZACHŁANNE

Informatyka A. Algorytmy

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

Zadania obliczeniowe, algorytmy i złożoność obliczeniowa

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

Wstęp do programowania

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

Optymalizacja. Algorytmy dokładne

ALGORYTMY EWOLUCYJNE W OPTYMALIZACJI JEDNOKRYTERIALNEJ

Optymalizacja. Przeszukiwanie lokalne

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

Rozdział 2 PROGRAMOWANIE LINIOWE CAŁKOWITOLICZBOWE

Algorytmika w bioinformatyce

Algorytmika w bioinformatyce

Wymagania edukacyjne z matematyki dla klasy I gimnazjum wg programu Matematyka z plusem

Algorytm i złożoność obliczeniowa algorytmu

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Projektowanie i analiza algorytmów

W wielu obliczeniach w matematyce bądź fizyce wykonanie niektórych kroków zależy od spełnienia warunku.

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podejście zachłanne, a programowanie dynamiczne

Algorytmy w teorii liczb

Techniki optymalizacji

Statystyka podstawowe wzory i definicje

Metoda podziału i ograniczeń

Struktury danych i złożoność obliczeniowa Wykład 7. Prof. dr hab. inż. Jan Magott

Wstęp do programowania

Programowanie liniowe. Tadeusz Trzaskalik

Programowanie liniowe metoda sympleks

Metody Optymalizacji: Przeszukiwanie z listą tabu

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Wykład 3. Metoda dziel i zwyciężaj

Programowanie dynamiczne (optymalizacja dynamiczna).

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

Metody Programowania

Rekurencja (rekursja)

Grupowanie Witold Andrzejewski, Politechnika Poznańska, Wydział Informatyki 201/633

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Obrazy rekurencyjne. Zastosowanie rekurencji w algorytmice. AUTOR: Martin Śniegoń

Algorytmy komputerowe. dr inŝ. Jarosław Forenc

Algorytmy komputerowe. dr inż. Jarosław Forenc

5. Rekurencja. Przykłady

PLAN WYNIKOWY Z MATEMATYKI DLA II KL. GIMNAZJUM do podręcznika GWO Matematyka z plusem. PODSTAWOWE Uczeń zna: POTĘGI I PIERWIASTKI

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

I. Podstawy języka C powtórka

Elementy Modelowania Matematycznego

Struktury danych i złożoność obliczeniowa Wykład 5. Prof. dr hab. inż. Jan Magott

Sortowanie przez scalanie

Programowanie w Logice

Transkrypt:

Techniki projektowania algorytmów Dziel i zwyciężaj (divide and conquer) rekursja Redukcja (reduction, transform and conquer) Programowanie liniowe (linear programming) Programowanie zachłanne (greedy method) Programowanie dynamiczne (dynamic programming) Algorytmy przeszukujące (trial and error) Algorytmy probabilistyczne i heurystyki (probabilistic, heuristic)

Rekursja Rekursja zobacz: Rekursja ;-) Rekursja jeśli ciągle nie wiesz co to jest, zobacz: Rekursja ;-) PHP PHP: Hypertext Preprocessor GNU GNU's Not Unix AMARA Amara Means A Recursive Acronym

Rekursja P IF B THEN P[S,P] END P program P kompozycja (złożenie) S sekwencja rozkazów nie zawierająca P Wieże Hanoi, algorytm Euklidesa znajdowania NWD, definicja drzewa patrz Matematyka dyskretna Dziel i zwyciężaj - quicksort, mergesort

Kiedy nie używać rekursji? P IF B THEN S; P END (P na samym początku lub końcu) Silnia: n! = n * (n-1)! 0! = 1 PROCEDURE F(I:INTEGER):INTEGER; BEGIN IF I>0 THEN RETURN I*F(I-1); ELSE RETURN 1; END; END F; I := 0; F := 1; WHILE I < n DO I := I+1; F := I*F; END;

Kiedy nie używać rekursji? Ciąg Fibonacciego: F(i) = F(i-1) + F(i-2) Powtarzamy niepotrzebnie wiele obliczeń PROCEDURE F(n:INTEGER): INTEGER; BEGIN IF n=0 THEN RETURN 0; ELSE IF n=1 THEN RETURN 1; ELSE RETURN F(n-1)+F(n-2) END; END; END F; i := 1; x := 1; y := 0; WHILE i < n DO x := x+y; y := x-y; i := i+1; END;

Krzywa Hilberta (Hilbert curve) Krzywa H i rzędu i składa się z czterech instancji krzywych H i-1 dwukrotnie pomniejszonych, obróconych i połączonych odcinkami. H 0 jest pusta, stąd H 1 składa się tylko z trzech odcinków. A i : D i-1 A i-1 A i-1 B i-1 B i : C i-1 B i-1 B i-1 A i-1 C i : B i-1 C i-1 C i-1 D i-1 D i : A i-1 D i-1 D i-1 C i-1

H 1 D 1

H 2 C 1 A 1 D 2 D 1 D 1

H3

Krzywa Sierpińskiego Główny schemat różni się od schematów rekursji S n : A n B n C n D n A i : A i-1 B i-1 D i-1 A i-1 B i : B i-1 C i-1 A i-1 B i-1 C i : C i-1 D i-1 B i-1 C i-1 D i : D i-1 A i-1 C i-1 D i-1 S 0 kwadrat obrócony o 45 stopni (A 0,B 0,C 0,D 0 są puste)

S 1 D D A A A B D C C B B A A D B D B C C C

S2

S3

Trójkąt Sierpińskiego Weź dowolny kształt (zwykle trójkąt). Jeśli procedura osiągnęła założony poziom narysuj kształt. W przeciwnym przypadku zmniejsz rozmiar kształtu dwukrotnie. Wywołaj procedurę trzykrotnie na planie trójkąta.

Trójkąt Sierpińskiego

Redukcja (reduction) transform and conquer transformuj i zwyciężaj np. zadanie znalezienia mediany w zbiorze liczb możemy rozwiązać następująco: sortujemy zbiór (droga operacja) wybieramy element środkowy (tania operacja) Chcemy pomnożyć dwie liczby. Mamy gotowe układy które potrafią: dodawać, odejmować, podnosić do kwadratu, dzielić przez 2. a*b = ((a+b) 2 - a 2 - b 2 )/2

Programowanie liniowe (linear programming) Optymalizacja liniowej funkcji celu podlegającej liniowym ograniczeniom w postaci równości lub nierówności. Forma kanoniczna: Maksymalizuj: c T x przy ograniczeniach: Ax b gdzie: x 0 x wektor zmiennych c,b wektory współczynników A macierz współczynników

Forma standardowa składa się z trzech części: liniowej funkcji celu, np. maksymalizuj c 1 x 1 +c 2 x 2 ograniczeń, np. a 11 x 1 +a 12 x 2 b 1 a 21 x 1 +a 22 x 2 b 2 a 31 x 1 +a 32 x 2 b 3 nieujemnych zmiennych np. x 1 0, x 2 0 Ograniczenia inne niż mniejszościowe ( ) możemy zamienić na mniejszościowe: ograniczenie równościowe na dwa i ograniczenie większościowe prze negację zmiennych.

Przykład Rolnik ma pole o powierzchni A hektarów na którym może posadzić pszenicę lub jęczmień w dowolnej proporcji. Rolnik może zużyć maksymalnie F ton nawozu i P ton środka owadobójczego. Do uprawy pszenicy potrzeba F 1 a do jęczmienia F 2 ton nawozu na hektar. Do uprawy pszenicy potrzeba P 1 a do jęczmienia P 2 ton środka owadobójczego na hektar. Uprawa pszenicy daje S 1, a jęczmienia S 2 złotych z hektara. Ile hektarów ma rolnik obsadzić pszenicą, a ile jęczmieniem aby uzyskać maksymalny zysk?

Przykład maksymalizuj: S 1 x 1 + S 2 x 2 (funkcja celu = zysk) ograniczenia: x 1 + x 2 A F 1 x 1 + F 2 x 2 F P 1 x 1 + P 2 x 2 P (wielkość pola) (ilość nawozu) (ilość środka owadobójczego) nieujemne zmienne (nie da się uprawiać pola o ujemnej powierzchni): x 1 0 (powierzchnia uprawy pszenicy) x 2 0 (powierzchnia uprawy jęczmienia)

Programowanie liniowe metody rozwiązywania Algorytm simplex w najgorszym przypadku złożoność wykładnicza Metoda elipsoid złożoność wielomianowa, ale w praktyce gorszy niż simplex Algorytm Karmarkara złożoność wielomianowa, lepszy w praktyce niż simplex

Bajka o trzech złodziejach Złodziej włamuje się do domu i widzi cztery wartościowe rzeczy: biżuterię o wadze 1 kg i wartości 15 PLN, żyrandol o wadze 5 kg i wartości 10 PLN, obraz o wadze 3 kg i wartości 9 PLN, radio o wadze 4 kg i wartości 5 PLN. Jego plecak może udźwignąć max. 8 kg (obie ręce musi mieć wolne, żeby wyjść przez okno na piętrze). Co powinien zapakować do plecaka? Mamy trzech złodziei: chciwego, powolnego i sprytnego.

Problem plecakowy (wersja 0-1) Maksymalizuj: n i=1 p i x i przy ograniczeniach: n i=1 w i x i c x i {0,1} i=1,...,n W wersji ciągłej można dzielić przedmioty pakowane do plecaka na części. Wówczas algorytm zachłanny jest optymalny.

Algorytm zachłanny (greedy) Wrzucamy przedmioty do plecaka zaczynając od przedmiotu o największej wartości (albo stosunku wartość/waga lepsze, dla problemu ciągłego daje rozwiązanie optymalne). Złodziej wrzuca więc kolejno biżuterię (1 kg, 15 PLN) i żyrandol (5 kg, 10 PLN). Plecak może jeszcze udźwignąć 2 kg, ale nie ma tak lekkich przedmiotów, więc złodziej ucieka, unosząc przedmioty o wartości 25 PLN.

Algorytm brute force Brute force brutalna siła, sprawdzamy wszystkie rozwiązania. Powolny złodziej zaczyna sprawdzać wszystkie możliwe rozwiązania. Złożoność problemu wynosi O(2 n ), gdyż tyle mamy możliwych do utworzenia podzbiorów. Zanim złodziej policzył odpowiednie sumy wartości i wag przedmiotów, wpadła policja i go aresztowano.

Programowanie dynamiczne (dynamic programming) A(i,j) definiujemy jako maksymalną wartość plecaka o wielkości j, rozpatrując tylko i pierwszych przedmiotów. Szukamy A(n,c). Możemy je znaleźć z następującej zależności rekurencyjnej: dla i=0 lub j=0 A i, j ={0 A i 1, j dla w i j max {A i 1, j, p i A i 1, j w i } dla w i j} A więc badamy, czy warto dołożyć i-ty przedmiot do plecaka o w i mniejszego

Programowanie dynamiczne (dynamic programming) p i /w i 15/1 10/5 9/3 5/4 j i=0 i=1 i=2 i=3 i=4 0 0 0 0 0 0 1 0 15 15 15 15 2 0 15 15 15 15 3 0 15 15 15< 15 4 0 15 15 24 24< 5 0 15 15< 24 24< 6 0 15 25 25< 25< 7 0 15 25 25< 25< 8 0 15 25 25< 29

Programowanie dynamiczne (dynamic programming) Sprytny złodziej uzyskał plecak o wartości 29 PLN (4 PLN lepiej niż jego chciwy kolega), zabierając biżuterię, obraz i radio, ważące w sumie 8 kg. Złożoność wynosi O(n*c) w porównaniu z O(2n ) algorytmu brute force. Programowanie dynamiczne możemy wykorzystać np. także w problemie obliczania ciągu Fibonacciego, poprzez zapamiętywanie kolejnych wyrazów ciągu.

Algorytmy przeszukujące przestrzeń rozwiązań (trial and error) Brute force brutalna siła, sprawdzamy wszystkie rozwiązania. Backtracking przeszukiwanie z nawrotami, wykorzystujemy własności zadania aby ograniczyć przeszukiwaną przestrzeń. Branch and bound algorytm podziału i ograniczeń, wykorzystujemy własności zadania aby ograniczyć przeszukiwaną przestrzeń.

Problem ośmiu hetmanów Rozstawić osiem hetmanów na tradycyjnej szachownicy 8x8 tak, aby wzajemnie się nie atakowały (w pionie, poziomie i po przekątnej) Są 92 rozwiązania, 12 jeśli wykluczymy symetryczne i obrócone Źródło: wikipedia.org

Rozwiązanie problemu brute force Generujemy na ślepo wszystkie 64 8 =2 48 =281,474,976,710,656 możliwych ustawień hetmanów. Ponieważ dwa (i więcej) hetmany nie mogą zajmować jednego pola, możemy ograniczyć ilość możliwych ustawień do 64!/56 = 178,462,987,637,760 Jeszcze lepiej wygenerować wszystkie permutacje (pozycje w danym wierszu lub kolumnie) których jest 8!=40320, co eliminuje ataki w pionie i poziomie (jak dla wieży)

Rozwiązanie problemu backtracking Przeszukujemy drzewo rozwiązań oparte na permutacjach. Stosujemy metodę przeszukiwania w głąb. Wystąpienie konfliktu po przekątnej powoduje odcięcie całego poddrzewa rozwiązań, dzięki czemu przeszukujemy tylko 15720 ustawień.

Algorytm podziału i ograniczeń (branch and bound) Dzielimy problem na podproblemy (branching), a następnie obliczamy górne i dolne ograniczenia (bounding) i obcinamy (pruning) niektóre gałęzie drzewa przeszukiwań. Dla problemu maksymalizacji: jeśli dla danego poddrzewa T jego górne ograniczenie (upper bound) jest mniejsze od dolnego ograniczenia (lower bound) dowolnego innego poddrzewa, to nie ma sensu testować rozwiązań w T. Dolne ograniczenie to zwykle najlepsze dotąd znalezione rozwiązanie.

PROCEDURE Try(i, tw, av: INTEGER); VAR av1: INTEGER; BEGIN (*dołączamy przedmiot i do rowiązania*) IF tw + obj[i].weight <= limw THEN s := s + {i}; IF i < n THEN Try(i+1, tw + obj[i].weight, av) ELSIF av > maxv THEN maxv := av; opts := s END ; s := s - {i} END ; (*wyłączamy przedmiot i z rozwiązania*) IF av - obj[i].value > maxv THEN IF i < n THEN Try(i+1, tw, av - obj[i].value) ELSE maxv := av - obj[i].value; opts := s END END END Try; maxv najlepsze rozwiązanie (dolne ograniczenie) totv suma wszystkich przedmiotów av górne ograniczenie (możliwe maksimum) limw wielkość plecaka Wywołanie: maxv := 0; s := {}; opts := {}; Try(1, 0, totv); Źródło: N.Wirth

maxv=0 tw=0 av=39 29 i=1 0 tw=1 av=39 25 29>29 i=2 tw=6 av=39 tw=1 av=29 0 0 25 29 i=3 tw=9 tw=6 av=30 tw=4 av=29 20>29 0 0 25 29 i=4 tw=10 tw=6 maxv=25 s={1,2} tw=8 maxv=29 s={1,3,4} 24>29

Jak widać, przeszukiwanie przestrzeni rozwiązań metodą podziału i ograniczeń możliwe jest tylko dla problemów optymalizacyjnych. Nie nadaje się na przykład dla problemu ośmiu hetmanów. Można stosować inne metody obliczania ograniczeń. Np. można posortować przedmioty według stosunku wartość/waga, a następnie jako górne ograniczenie przyjąć wynik algorytmu zachłannego dla ciągłego problemu plecakowego.

Złożoność algorytmu w najgorszym przypadku jest taka, jak brute force. Zwykle nadaje się do średniej wielkości instancji problemu. Dla problemu plecakowego metoda ta ma tę zaletę, iż pojemność plecaka i wagi przedmiotów nie muszą być całkowitoliczbowe (w przeciwieństwie np. do programowania dynamicznego).

Heurystyki Heurystyka - algorytm, który nie gwarantuje znalezienia optymalnego rozwiązania. Metaheurystyka ogólna metoda rozwiązywania szerokiej klasy problemów, nie gwarantująca znalezienia optymalnego rozwiązania. Algorytm polega zwykle na przeszukiwaniu w odpowiedni sposób przestrzeni rozwiązań.

Metaheurystyki Przeszukiwanie losowe Przeszukiwanie lokalne (local search) Simple hill climbing Steepest ascent hill climbing Gradient descent/ascent Przeszukiwanie tabu (tabu search) Symulowane wyżarzanie (simulated annealing) Algorytmy genetyczne (genetic algorithms)

No free lunch Średnia wydajność dowolnej pary algorytmów na wszystkich możliwych problemach jest identyczna.