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