Rówoległe algorytmy genetyczne w zastosowaniu do problemu kolor

Transkrypt

Rówoległe algorytmy genetyczne w zastosowaniu do problemu kolor
POLITECHNIKA KRAKOWSKA - WIEiK
KATEDRA AUTOMATYKI i TECHNIK INFORMACYJNYCH
Algorytmy i Struktury Danych
www.pk.edu.pl/~zk/AISD_HP.html
Wykładowca:
dr inż. Zbigniew Kokosiński
[email protected]
Wykład 9: Programowanie dynamiczne
1. Wprowadzenie.
2. Idea programowania dynamicznego.
3. Wyznaczanie wartości ciągów metodą programowania
dynamicznego: silnia, liczby Fibonacciego, współczynniki
dwumienne, liczby Stirlinga.
4. Inne algorytmy programowania dynamicznego:
dyskretny problem plecakowy, problem iloczynu łańcucha
macierzy.
5. Wymagania czasowe i pamięciowe algorytmów
programowania dynamicznego.
Pojęcie programowania dynamicznego
Programowanie dynamiczne jest to metoda rozwiązywania
problemów optymalizacyjnych dekomponowalnych rekurencyjnie
na podproblemy, obejmująca cztery podstawowe kroki:
1. scharakteryzowanie struktury rozwiązania optymalnego
2. rekurencyjne określenie kosztu rozwiązania optymalnego
3. obliczenie kosztu optymalnego metodą wstępującą
(bottom-up)
4. opracowanie rozwiązania optymalnego na postawie wyników
wcześniejszych obliczeń
Uwaga: w odróżnieniu od metody „dziel i zwycieżaj” podproblemy nie są na
ogół rozłączne a liczba różnych podproblemów jest wielomianowa.
Twórcą metody programowania dynamicznego jest Richard Bellman.
Własność optymalnej podstruktury
Własność optymalnej podstruktury – jest własnością
problemów, które można rozwiązywać za pomocą algorytmów.
Mówi się, że dany problem ma własność optymalnej
podstruktury, jeżeli jego optymalne rozwiązania jest funkcją
optymalnych rozwiązań podproblemów.
Jeżeli problem wykazuje własność optymalnej podstruktury,
to zazwyczaj można znaleźć rozwiązujący go algorytm
dynamiczny, a czasem zachłanny.
Ciągi liczbowe: silnia
Silnia (ang. Factorial)
n!=n∙(n-1)∙ … ∙2∙1= n∙(n-1)!
Program iteracyjny – s(n) obliczamy w tablicy w czasie O(n) wraz z
wszystkimi wartościami s(i), dla 0<=i<=n-1 :
s[0]=1
for (i=1; i<=n; i++)
{
s[i]= i*s[i-1];
}
Ciągi liczbowe: liczby Fibonacciego
Liczby Fibonacciego można obliczyć ze wzorów:
F(1)=1,
F(2)=1,
F(n)=F(n-1)+F(n-2), dla n>2.
Program iteracyjny – f(n) obliczamy w tablicy w czasie O(n) wraz z
wszystkimi wartościami f(i), dla 1<=i<=n-1 :
f[1]=1; f[2]:=1;
for (i=3; i<=n; i++)
{
f[i] = f[i-1]+f[i-2];
}
Współczynniki dwumienne C(n,k)
C(n,k)=0,
C(n,k)=1,
C(n,k)=C(n-1,k)+C(n-1,k-1),
dla k >n;
dla k=0 i dla k=n;
dla 0<k<n.
Program iteracyjny (m - numer wiersza trójkąta Pascala):
for (i=0; i<=m; i++)
{
C[i,0] = 1; C[i,i] = 1;
}
for (n=2; n<=m; n++)
{
for (k=1; k<=n-1; k++)
{
C[n,k]=C[n-1,k]+C[n-1,k-1];
}
}
Współczynniki dwumienne C(n,k)
Liczby Stirlinga drugiego rodzaju S(n,k)
S(n,n)=1,
dla n >= 1;
S(n,1)=1,
dla n > 1;
S(n,k)=S(n-1,k-1)+k*S(n-1,k), dla 2<k<n.
Program iteracyjny:
for (i=1; i<=m; i++)
{
S[i,1] = 1; S[i, i] = 1;
}
for (n=3; n<=m; n++)
{
for (k=2; k<=n-1; k++)
{
S[n,k]=S[n-1,k-1]+k*S[n-1,k];
}
}
Liczby Stirlinga drugiego rodzaju S(n,k)
Problem plecakowy – dyskretny i ciągły
Dane są rozmiary i wartości elementów oraz pojemność plecaka.
Wyznacz optymalne upakowanie plecaka, tak aby miał maksymalną
wartość przy nieprzekroczonej pojemności.
Warianty problemu: dyskretny (0-1), dyskretny z wieloma egzemplarzami
przedmiotów, ciągły (przedmioty są podzielne, a wartość części pozostaje
w stałej proporcji do całości przedmiotu)
Przykład:
Dyskretny problem plecakowy
(przedmioty dostępne w wielu egzemplarzach)
Dyskretny problem plecakowy
(przedmioty dostępne w wielu egzemplarzach)
Problem iloczynu łańcucha macierzy 1
Dany jest łańcuch macierzy M1M2M3 … Mn
Wyznacz optymalną kolejność wykonywania mnożeń tych
macierzy, tak aby liczba elementarnych mnożeń ich
elementów była minimalna.
Przykład:
Problem iloczynu łańcucha macierzy 2
Problem iloczynu łańcucha macierzy 3
Dowód poprawności metody:
Minimalny koszt mnożenia łańcucha macierzy MiMi+1 … Mj ,
dla 1 <= i < = n - j oraz dowolnego k, i < k < i+j,
jest wyznaczany jako suma minimalnego kosztu mnożenia
podłańcucha MiMi+1 … Mk-1 , minimalnego kosztu mnożenia
podłańcucha MkMk+1 … Mj oraz kosztu mnożenia tych dwóch
macierzy wynikowych przez siebie.
Gdyby koszt mnożenia podłańcucha MiMi+1 … Mk-1 (lub
MkMk+1 … Mj ) nie był minimalny, to mógłby być zmniejszony
do wartości minimalnej, ale to oznaczałoby, że koszt
mnożenia MiMi+1 … Mj również nie był minimalny.
Zalety programowania dynamicznego
1. Problemy o strukturze rekurencyjnej podproblemów są tą
metodą przetwarzane w czasie wielomianowym – eliminacja
wielokrotnego rozwiązywania tych samych podproblemów.
2. Rozwiązywane są wszystkie różne podproblemy danego
problemu a wyniki przechowywane w tablicy o rozmiarze
wielomianowym (najczęściej O(n^2) lub O(nm).
3. Po rozwiązaniu wszystkich podproblemów i zbudowaniu
tablicy z ich rozwiązaniami czas rozwiązywania problemu
jest zwykle liniowy, np. O(n).
4. Istnieje możliwość wyznaczenia dokładnego rozwiązania
problemu optymalizacyjnego, który czasami nie posiada
algorytmu wielomianowego (np. problem plecakowy).
Wady programowania dynamicznego
1. Istnieje potrzeba rekurencyjnego sformułowania problemu.
2. Należy dowieść własności optymalnej podstruktury.
3. Wymagana jest pamięć o wymiarach zależnych od danych
wejściowych (np. rozmiaru problemu).
4. Istnieją ograniczenia zastosowań algorytmów
programowania dynamicznego związane z wielkością liczb
występujących w przetwarzanych problemach.
Źródła wzorów, przykładów i rysunków :
1. Cormen T.H., Leiserson C.E., Rievest R.L. : Wprowadzenie do algorytmów,
WNT 1999
2. Ruskey F. : Combinatorial generation, wersja robocza książki, 2003.
3. Sedgewick R. : Algorithms in C, Addison-Wesley 1990
4. Stojmenovic I. : Recursive algorithms in computer science courses:
Fibonacci numbers and binomial coefficients, IEEE Trans. Education
43 (3), 2000, 273-276.
5. Helionica.