Algorytmy stochastyczne — laboratorium 01
Transkrypt
Algorytmy stochastyczne — laboratorium 01
Algorytmy stochastyczne — laboratorium 01 Jarosław Piersa 21 lutego 2014 1 Zadanie na zajęcia Zaimplementuj podstawową wersję algorytmu genetycznego, która znajduje maksimum funkcji f (x, y) = 32 + x · sin(4πx) + y · sin(10πy) dla x, y ∈ [0, 16] Krok po kroku: 1. rozwiązaniem będzie ciąg zero-jedynkowy długości 2N bitów o = [o0 , o1 , · · · , oN −1 , oN +0 , on+1 , ..., o2N −1 ] 2. możemy ustalić kodowanie x = o0 · 23 + o1 · 22 + · · · + o4 · 20 + o5 · 2−1 + · · · + oN −1 2−N +4 y = oN · 23 + oN +1 · 22 + oN +3 · 21 + oN +4 · 20 + on+5 · 2−1 + · · · + o2N −1 2−N +4 3. zaimplementuj funkcję, która dla osobnika o (ciągu zero-jedynkowego) oblicza, x, y oraz ostatecznie f (x, y) 4. zaimplementuj funkcję, która dla osobnika o oraz prawdopodobieństwa mutacji pm losowo z prawdopodobieństwem pm zamienia każdy bit o 5. zaimplementuj funkcję, która dla osobników o1 oraz o2 generuje potomka o3 , który składa się z głowy jednego rodzina i ogona drugiego, podzielonych w losowym punkcie cięcia (i ewentualnie o4 ) 6. populacja liczy P osobników 7. populację wygodnie można reprezentować jako tablica 2N × P 8. z aktualnej populacji (krok1: startowa; krok 2 i później: stara rozszerzona o potomków i zmutowana) wybieramy nową liczności ponownie P osobników 9. prawdopodobieństwo, że osobnik ok znajdzie się w nowej populacji na danej pozycji wynosi X P(ok ) = f (ok )/ f (ol ) l 10. z prawdopodobieństwem krzyżowania pc wybieramy osobnika do krzyżowania 11. z par osobników ok oi tworzymy nowego potomka (lub dwóch) i dołączamy ich do populacji 12. każdego z osobników poddajemy mutacji z małym prawdopodobieństwem pm 2 Projekty 2.1 Minimalizowanie funkcji (1p) Za pomocą algorytmów genetycznych znajdź minimum następujących funkcji: • f (x, y) = x · sin(4πx) + y · sin(7πy) na przedziale (x, y) ∈ [−2, 5] × [3, 10] Funkcje De Jonga: • • • • Pn 2 i=1 xi , dla n = 2 jest to funkcja na płaszczyźnie, −5.12 ≤ xi ≤ 5.12 Pn−1 (trudne) f (x) = i=1 100(x2i − xi+1 )2 + (1 − xi )2 , dla −5.12 ≤ xi ≤ 5.12 Pn (trudne) f (x) = (5 · n+) i=1 bxi c, dla −5.12 ≤ xi ≤ 5.12 Pn f (x) = i=1 i · x4i i−1 h P25 , dla −65.536 ≤ xi ≤ 65.536, gdzie: f (x) = 0.002 + i=j P2 (x1 −a )6 • (prosta) f (x) = i=1 i i,j a1i = [−32, −16, 0, 16, 32] itd. ciąg powtórzony pięć razy a2i = [−32, ..., −32, −16, ..., −16, 0, ..., 0, 16, ..., 16, 32, ..., 32] (każdy wyraz powtórzony po pięć razy) 1 2.2 Dylemat więźnia (2p) Dwaj więźniowie grają w powtarzalną grę: • obaj więźniowie podejmują jednocześnie swoje decyzje: milczenie lub zdrada, • więzień pamięta ostatnie trzy zagrania swoje i drugiego więźnia, ale nie może znać aktualnego zagrania drugiego (w szczególności nie zna jego taktyki), • tabela nagród i kar w zależności od zagrania decyzja W1 M M Z Z decyzja W2 M Z M Z nagroda W1 3 0 5 1 nagroda W2 3 5 0 1 • liczba powtórzeń gry jest ograniczona (ok. 10-20 powtórzeń), ale więźniowie nie znają liczby powtórzeń (wbrew pozorom jest to ułatwienie) Więzień pamięta ostatnie trzy ruchy przeciwnika i swoje, i na ich podstawie decyduje czy w następnym ruchu zdradzi, czy będzie milczał, zatem określenie decyzji dla każdej możliwej historii jest taktyką więźnia. Może być co najwyżej 64 różnych historii (= 26 ), każdej odpowiada binarna decyzja (z lub m). Zatem taktyka więźnia, to ciąg 64 bitów (jak kto woli: 4 bajty / 2 inty). Różnych taktyk jest „trochę więcej”, bo 264 . Wygrywa ten więzień, który wygrywa najwięcej w grach z innymi (średnio! sumaryczna wypłata zależy od długości gry!). Napisz symulację całej populacji więźniów, którzy grają z losowymi przeciwnikami i dostosowują taktykę pomiędzy rozgrywkami (mówiąc mniej poetycko: algorytm genetyczny, który znajdzie najlepsze strategie). 2.3 Dylemat zasp śnieżnych (ang. snowdrift dillema), (2p) Dla tych, którzy wolą praworządnych... Dwóch kierowców stoi przed zaspą śnieżną, która blokuje im drogę. Zaspa sama się nie chce się usunąć, do wiosny daleko więc mają możliwości: siedzieć dalej, odśnieżyć. decyzja K1 decyzja K2 nagroda K1 nagroda K2 C C 0 0 5 1 C O O C 1 5 O O 3 3 Uwaga! Problem jest podobny do dylematu więźnia, ale funkcje wypłaty są zmienione (P — wypłata, d — decyzja samolubna, c — współpraca): PD (Prisioner’s Dillema): Pdc > Pcc > Pdd > Pcd natomiast SDD (Snowdrift Dillema): Pdc > Pcc > Pcd > Pdd . Reszta jak wyżej. Zadanie: napisz symulację zachowań kierowców na kole podbiegunowym (uwagi jak wyżej). 2.4 Cykl Hammiltona w grafie Klasycznie — trudny. TODO 2.5 Wyszukiwanie ścieżek na płaszczyźnie Algorytmy genetyczne w dziedzinach ciągłych. TBU 3 Rozwiązanie w Octave UWAGA! Nie kopiować copy-pastem! A jeżeli już, to należy sprawdzić czy nie zostały przekłamane następujące symbole: • mnożenie *, potęgowanie ^, minus -, cudzysłowia ’ oraz ’’, polskie ogonki • spacje pomiędzy tablicą a nawiasami np tab (3); (w Matlabie dostęp do elementu tablicy jest przez ()) Pojedynczy osobnik: osobnik.m function r = osobnik ( w ) r = randi (2 , 1 , w ) -1; end 2 Populacja osobników: populacja.m function P = populacja ( liczbaOsobnikow , dlugosc ) P = randi (2 , liczbaOsobnikow , dlugosc ) -1; end Funkcja do optymalizacji funkcja.m function r = funkcja (x , y ) r = 32 + x * sin (3* pi * x ) + y * sin (5* pi * y ); end ocena dostosowania osobnika ocenOsobnika.m function f = ocenOsobnika ( o ) cut = floor ( length ( o ) / 2); % % [ x1 , x2 , x3 , x4 ,... , y1 , y2 , y3 , y4 ...] % % ox = o (1: cut ); oy = o ( cut +1: end ); offset = 3; x = y = sum ( ox .* sum ( oy .* (2 .^ ( offset : -1: offset - length ( ox ) +1))); (2 .^ ( offset : -1: offset - length ( oy ) +1))); f = funkcja (x , y ); end Mutacja osobnika (zwraca kopię) mutacja.m function om = mutacja ( pm , osobnik ) tmp = rand (1 , length ( osobnik )); I = find ( tmp < pm ); om = osobnik ; om ( I ) = 1 - om ( I ); end Mutacja całej populacji (zwraca kopię populacji) mutujPopulacje.m function Q = mutujPopulacje (P , pm ) Q = P; for i =1: w ielkos cPopul acji ( P ); os = wybierzOsobnika (P , i ); om = mutacja ( pm , os ); Q = ustawOsobnika (Q , om , i ); end end Krzyżowanie dwóch wybranych osobników (zwraca potomka) krzyzowanie.m function pot = krzyzowanie ( o1 , o2 ) i = randi ( length ( o1 ) -1); pot = [ o1 (1: i ) , o2 ( i +1: end )]; end Krzyżowanie osobników w całej populacji (zwraca nową rozszerzoną populację) krzyzujPopulacje.m function Q = krzyzujPopulacje (P , pk ) koniec = length ( P (: ,1)); koniec ; 3 % JP mozna probowac wektorowo , ale dla klarownosci zrobimy to % w petli for o1 = -1; o2 = -1; ktory = 1; Q = P; for i = 1: length ( P ) if ( rand () > pk ) continue ; end if ktory == 1 o1 = wybierzOsobnika (P , i ); ktory = 2; else o2 = wybierzOsobnika (P , i ); ktory = 1; Pot = krzyzowanie ( o1 , o2 ); Q = ustawOsobnika (Q , Pot , koniec +1); koniec ++; end end end Selekcja (zwraca nową populację z osobnikami, które przeżyły) selekcja.m function Q = selekcja (P , wielkoscWynikowa ) % % daloby sie to zrobic ladniej ale na razie chodzi o to aby bylo to czytalne % % alpha = 1.9; ruletka = zeros (1 , w ielkos cPopul acji ( P )); for i =1: w ielkos cPopul acji ( P ) ruletka ( i ) = ocenOsobnika ( wybierzOsobnika (P , i )) ^ alpha ; end % normalizujemy ruletka = ruletka / sum ( ruletka ); cs = cumsum ( ruletka ); % tworzymy pusta nowa populacje Q = populacja (1 , length ( wybierzOsobnika (P ,1))); for i =1: wielkoscWynikowa r = rand (); zwyciezca = find ( cs >= r ); % odkomentuj aby zobaczyc ktory wygral % zwyciezca (1) Z = wybierzOsobnika (P , zwyciezca (1)); Q = ustawOsobnika (Q , Z , i ); end end ga.m function ret = ga () p = 22; 4 n = 20; T = 100; P = populacja (p , n ); pm = 0.05; pc = .5; r = [1 ,2 ,3]; for t = 1: T P = krzyzujPopulacje (P , pc ); P = mutujPopulacje (P , pm ); P = selekcja (P , p ); r(t) = ocenPopulacje ( P ); end figure (1); wykresPopulacji ( P ) figure (2); plot (1: t , r ); dekodujWyniki ( P ); ret = P ; end Pominięto pomocnicze funkcje. 5