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?

Podobne dokumenty