Algorytmy stochastyczne — laboratorium 03
Transkrypt
Algorytmy stochastyczne — laboratorium 03
Algorytmy stochastyczne — laboratorium 03 Jarosław Piersa 10 marca 2014 1 Projekty 1.1 Problem plecakowy (1p) Oznaczenia: • dany zbiór przedmiotów x1 , .., xN , • każdy przedmiot ma określoną wagę w(xi ) i wartość v(xi ), • plecak ma ograniczoną pojemność maxW , • przedmiot może być zapakowany tylko jeden raz, ale może się znaleźć w dwóch różnych egzemplarzach na liście. Cel: wybrać podzbiór przedmiotów o maksymalnej wartości i mieszczący się w limicie wagowym maxW . Kodowanie: • osobnik ō = [o1 , .., oN ], oi = 1 ⇐⇒ zabieramy xi do plecaka, • krzyżowanie i mutacje: klasyczne... • (plus naprawa niepoprawnego osobnika) w wypadku przekroczenia wagi usuwamy losowe przedmioty aż do zmieszczenia się w limicie. P ˙ • (lub kara) w wypadku przekroczenia wagi zmniejszamy wartość osobnika o c(∆W )2 , gdzie ∆W = max(0, ( i wi oi ) − maxW ) = przekroczenie wagi. 1.2 Problem komiwojażera (2p) Dany jest graf G = (V, E), oraz wagi krawędzi w (w wersji prostej: w(e) = długość krawędzi). Oznaczenia: • v ∈ V — wierzchołek w grafie, • e ∈ E — krawędź w grafie, • w(e) ∈ R+ — waga / długość krawędzi / odległość między miastami, • jeżeli (vi , vj ) ∈ / E to można przyjąć w((vi , vj )) = określone, ale duże np w((vi , vj )) = maxk wagach, Cel: znaleźć cykl w grafie o minimalnej długości 1.2.1 Reprezentacja ścieżkowa osobnika • ō = [o1 , o2 , o3 , o4 ], gdzie oi = 1..N — numer miasta, • odwiedzamy miast vi w i-tym kroku cyklu, • np. ō = [3, 2, 4, 1] odpowiada cyklowi 3 → 2 → 4 → 1 → 3, • UWAGA! ten sam cykl odpowiada osobnikom [2, 4, 1, 3], [4, 1, 3, 2], ..., Mutacje: • transpozycja (zamieniamy miejscami dwa losowe miasta), • odwrócenie podciągu (odwracamy losowo wybrany fragment cyklu). Krzyżowanie PMX (ang. partialy mapped crossover ): 1 P l w((vk , vl )) po określonych • wybieramy pod-odcinek: p̄ = [p1 ...p2 |p3 ...p4 |p5 ..p6 ], q̄ = [q1 ...q2 |q3 ...q4 |q5 ..q6 ] • potomkowi ustawiamy pod-odcinek z q: r := [...|q3 , q4 |...] • uzupełniamy głowę i ogon o miasta z p̄ (zachłannie kopiujemy na wolne miejsca tam gdzie jest to możliwe): r := [p1 ...|q3 , q4 |p5 ...] (tak aby nie zniszczyć cyklu!) • uzupełniamy pozostałe miasta z p aby powstał poprawny cykl, r = [p1 r2 |q3 , q4 |p5 r6 ], • krzyżowanie nie wyprowadza poza zbiór poprawnych cykli! Analogicznie można utworzyć drugiego potomka r2 . Kolejne kroki PMX: • p = [5, 7, 8|1, 4, 2|6, 3] • q = [4, 3, 1|2, 6, 5|8, 7] • r = [., ., ., |2, 6, 5|., .] (kopiujemy z q) • r = [., 7, 8|2, 6, 5|., 3] (kopiujemy z p) • r = [1, 7, 8|2, 6, 5|4, 3](uzupełniamy nieodwiedzonymi z p) Krzyżowanie OX (order-based crossover ): • wybieramy pod-odcinek: p̄ = [p1 ...p2 |p3 ...p4 |p5 ..p6 ], q̄ = [q1 ...q2 |q3 ...q4 |q5 ..q6 ] • wstawiamy potomkowi odcinek z q: r = [...|q3 , ...q4 |...] • uzupełniamy głowę i ogon o miasta z p̄ ale zachowując kolejność odwiedzeń: r = [p1 ...|q3 , ...q4 |p5 ...], zaczynamy od pozycji p5 (następna po wstawionym bloku z q) Podobnie można utworzyć drugiego potomka zamieniając role p i q. Kolejne kroki OX: • p = [5, 3, 2|1, 4, 8|6, 7] • q = [4, 3, 1|2, 6, 5|8, 7] • r = [., ., ., |2, 6, 5|., .] (kopiujemy z q) • r = [., ., ., |2, 6, 5|7, .] (kopiujemy z p) • r = [., ., ., |2, 6, 5|7, 3] • r = [1, ., ., |2, 6, 5|7, 3] • r = [1, 4, ., |2, 6, 5|7, 3] • r = [1, 4, 8, |2, 6, 5|7, 3] Krzyżowanie CX (cycle-based crossover ): • Pomysł: każde wystąpienie musi pochodzić od któregoś z rodziców • pierwszą wolną pozycje bierzemy od jednego z rodziców (np pi ), na początku i = 1 • jeżeli pi 6= qi , to zablokowaliśmy możliwość wyboru qi , • musimy zatem wziąć to miasto również z rodzica p z pozycji j, tj pj • jeżeli zamknęliśmy cykl i potomek jest zakończony to zakończ. • jeżeli zamknęliśmy cykl, ale osobnik nie jest zakończony do Pkt 2, ale wybierz wolną pozycję z drugiego rodzica (jak był p, to teraz q). • jeżeli jeszcze nie zamknęliśmy cyklu to i := j i punkt 3. Kolejne kroki CX: • p = [1, 3, 2, 5, 4, 8, 6, 7] • q = [2, 3, 1, 4, 6, 5, 8, 7] 2 • r = [1, ...] (kopiujemy z p) • r = [1, ., 2, ...] (koniec cyklu) • r = [1, 3, 2, ...] (następny cykl, jeden element) • r = [1, 3, 2, 4...] (kopiujemy z q) • r = [1, 3, 2, 4, ., 5, ...] • r = [1, 3, 2, 4, ., 5, 8, .] • r = [1, 3, 2, 4, 6, 5, 8, .] (koniec cyklu) • r = [1, 3, 2, 4, 6, 5, 8, 7] 1.2.2 Reprezentacja macierzowa osobnika • reprezentacja: macierz kwadratowa A wymiaru N × N , N = liczba miast, • jeżeli miasto i leży na ścieżce przed miastem j to aij = 1 / wersja tablicowa A[i, j] = 1, • ai,i = 0 zawsze, • relacja jest przechodnia zatem jeżeli aij = 1 i ajk = 1 to również aik = 1, • w tablicy jest dokładnie N (N − 1)/2jedynek Mutacja • zamieniamy parę miast miejscami • aij := 1 − aij , • aji := 1 − aji . Krzyżowania: • Rodzice P oraz Q → potomek R, • R = min(P, Q) (po współrzędnych), • resztę dopełniamy losowo, • jeżeli rij = rji = 0, to losowy z nich ustawiamy na 1, • krzyżowanie może prowadzić poza zbiór poprawnych osobników. Krzyżowanie 1 — przekrój • Rodzice P oraz Q → potomek R • R = min(P, Q) (po współrzędnych) • resztę dopełniamy losowo • jeżeli rij = rji = 0, to losowy z nich ustawiamy na 1 Krzyżowanie 2 — Blokowe • Rodzice P oraz Q → potomek R • Potomek R= PI 1 − randtr rand QII dwa bloki diagonalne z rodziców, pozostałe uzupełniamy • może wygenerować potomka z poza zbioru (tzn. rij = rjk = 1, ale rik = 0) 3 1.3 Wyszukiwanie ścieżek na R2 (2p) • dana para punktów na płaszczyźnie: S = (xs , ys ), D = (xd , yd ) • dane przeszkody na płaszczyźnie: np. zbiór kół: Ki = ((xi , yi ), ri ), wielokątów wypukłych (np trójkątów, reprezentacja wektorowa) lub piskeli (rastrowa). a3 a2 D S a1 a4 Cel • znaleźć ścieżkę z S do D • o minimalnej długości • bez ostrych zakrętów • omijającą przeszkody (z pewnym marginesem bezpieczeństwa R) Reprezentacja osobnika • lista punktów na R2 , • O = [a0 = S, a1 , a2 ..., ak = D], długość listy może być zmienna, • interpretacja: ścieżka S = ao → a1 → a2 → · · · → ak = D, • długość ścieżki: L(O) = k X |ai−1 , ai |, i=1 gdzie |−, −| oznacza zwykłą odległość • margines bezpieczeństwa: niech 0 jeżeli w promieniu R od punktu a nie ma żadnej przeszkody M (a) = R − odległość do najbliższej przeszkody oraz dla całej ścieżki M (O) := k−1 X M (ai ) i=1 • gładkość(xi ) = π− kąt pomiędzy sąsiednimi krawędziami α ai+1 ai ai−1 • gładkość(O) = Pk−1 i=1 gładkość(xi ) Krzyżowania: • (dwoje rodziców P,Q → dwoje potomków) złączenie początku ścieżki P i końca ścieżki Q, drugi potomek — symetrycznie, punkt łączenia — losowy, P i Q mogą mieć różne długości! 4 Mutacje: • przesunięcie punktu pośredniego o wektor z rozkładu normalnego x = x + N ([0, 0], I2 ), • przesunięcie punktu pośredniego do losowej pozycji z dopuszczalnego zakresu, • dodanie / usunięcie wierzchołka pośredniego (uwaga! dodawanie pomiędzy losową parę może powodować niestabilności numeryczne, należy dodawać jeżeli segment drogi jest za długi, a usuwać gdy jest za krótki). 5