Laboratorium 4
Transkrypt
Laboratorium 4
Nazwa przedmiotu: Algorytmy i złoŜoność (Laboratorium) Prowadzący zajęcia: mgr inŜ. Przemysław Pardel Laboratorium 4 LP 4. Zakres materiału Czas realizacji Techniki projektowania algorytmów: dziel i zwyciężaj, programowanie dynamiczne, algorytmy zachłanne, przeszukiwanie z nawrotami, heurystyki. 8 Czas realizacji zadań: 3 godziny Teoria: Programowanie dynamiczne Programowanie dynamiczne jest techniką lub strategią projektowania algorytmów, stosowaną przeważnie do rozwiązywania zagadnień optymalizacyjnych, dla których nie istnieją algorytmy zachłanne. Wynalazcą techniki jest amerykański matematyk Richard Bellman, uhonorowany za to odkrycie medalem IEEE (ang. medal of honour) w 1979 roku. Programowanie dynamiczne opiera się na podziale rozwiązywanego problemu na podproblemy względem kilku parametrów. W odróżnieniu od techniki dziel i zwyciężaj podproblemy w programowaniu dynamicznym nie są na ogół rozłączne, ale musi je cechować własność optymalnej podstruktury. Zagadnienia odpowiednie dla programowania dynamicznego cechuje również to, że zastosowanie do nich metody siłowej (ang. brute force) prowadzi do ponadwielomianowej liczby rozwiązań podproblemów, podczas gdy sama liczba różnych podproblemów jest wielomianowa. Algorytmy programowania dynamicznego są stosowane między innymi w informatyce, matematyce, bioinformatyce, ekonomii, i logistyce. Oto niektóre przykłady zastosowań programowania dynamicznego: • Algorytm CYK • Algorytm Viterbiego • algorytmy znajdujące najdłuższy wspólny podciąg • algorytmy rozwiązujące zagadnienie plecakowe • Algorytm Earleya • znajdowanie rozwiązania problemu optymalnego nawiasowania macierzy • Algorytm Floyda-Warshalla • obliczanie odległości Levenshteina • Algorytm Needlemana-Wunscha (dopasowywanie ciągów) • Wybór instrukcji niskiego poziomu w kompilatorach (ang. instruction selection) Algorytm zachłanny Algorytm zachłanny (ang. greedy algorithm) – algorytm, który w celu wyznaczenia rozwiązania w każdym kroku dokonuje zachłannego, tj. najlepiej rokującego w danym momencie wyboru rozwiązania częściowego. Innymi słowy algorytm zachłanny nie patrzy czy w kolejnych krokach jest sens wykonywać dane działanie, dokonuje decyzji lokalnie optymalnej, dokonuje on wyboru wydającego się w danej chwili najlepszym, kontynuując rozwiązanie podproblemu wynikającego z podjętej decyzji. Typowe zadanie rozwiązywane metodą zachłanną ma charakter optymalizacyjny. W dziedzinie sztucznej inteligencji zachłanna odmiana przeszukiwania lokalnego jest nazywana "podchodzeniem pod wzgórze". Nie istnieje ogólna metoda dowodzenia, czy dla danego problemu rozwiązanie zachłanne (zawsze) odnajduje poprawny (i optymalny) wynik. Istnieją jednak stosujące się do samego problemu kryteria, pozwalające sądzić, iż dla owego problemu istnieje rozwiązanie zachłanne. Przykłady algorytmów zachłannych: • • • Algorytm Kruskala Algorytm Dijkstry Algorytm szeregowania zadań Zadania do realizacji: 1. Napisać program realizujący znajdywanie n - tego wyrazu ciągu Fibonacciego metodą programowania dynamicznego. Wykorzystać szkielet przedstawiony poniŜej. public class Main { public static int[] tab = new int[100]; public static void main(String[] args) { int n = 0; //poprosić urzytkownika o podanie wartości n i przypisaćdo zmiennej n //wywołanie funkcji dynamicznej FibDynamic(n); //wypisanie wartości wynikowej na ekran } public static void FibDynamic(int n) { //tutaj kod do wyznaczania kolejnych wartości ciągu Fibonacciego z wykorzystaniem tablicy globalnej tab } } 2. Napisz program symulujący pracę bankomatu (w bankomacie mogą znajdować się tylko banknoty o nominałach 10, 20, 50, 100, 200 PLN. Bankomat ma za zadanie wypłacać pieniądze z wykorzystaniem algorytmu zachłannego. • zaimplementować zasobnik, w którym poszczególne nominały mogą się skończyć np. brak nominału 20PLN. Jak zachowa się algorytm zachłanny?