Algorytmy stochastyczne laboratorium 03 Jarosław Piersa 10 marca 2014 1 Projekty 1.1 Problem plecakowy (1p) Oznaczenia: dany zbiór przedmiotów x 1,.., x N, każdy przedmiot ma określoną wagę w(x i ) i wartość v(x i ), 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 ō = [o 1,.., o N ], o i = 1 zabieramy x i do plecaka, krzyżowanie i mutacje: klasyczne... (plus naprawa niepoprawnego osobnika) w wypadku przekroczenia wagi usuwamy losowe przedmioty aż do zmieszczenia się w limicie. (lub kara) w wypadku przekroczenia wagi zmniejszamy wartość osobnika o c ( W ) 2, gdzie W = max(0, ( i w io i ) 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 (v i, v j ) / E to można przyjąć w((v i, v j )) = określone, ale duże np w((v i, v j )) = max k l w((v k, v l )) po określonych wagach, Cel: znaleźć cykl w grafie o minimalnej długości 1.2.1 Reprezentacja ścieżkowa osobnika ō = [o 1, o 2, o 3, o 4 ], gdzie o i = 1..N numer miasta, odwiedzamy miast v i 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
wybieramy pod-odcinek: p = [p 1...p 2 p 3...p 4 p 5..p 6 ], q = [q 1...q 2 q 3...q 4 q 5..q 6 ] potomkowi ustawiamy pod-odcinek z q: r := [... q 3, q 4...] uzupełniamy głowę i ogon o miasta z p (zachłannie kopiujemy na wolne miejsca tam gdzie jest to możliwe): r := [p 1... q 3, q 4 p 5...] (tak aby nie zniszczyć cyklu!) uzupełniamy pozostałe miasta z p aby powstał poprawny cykl, r = [p 1 r 2 q 3, q 4 p 5 r 6 ], krzyżowanie nie wyprowadza poza zbiór poprawnych cykli! Analogicznie można utworzyć drugiego potomka r 2. 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 = [p 1...p 2 p 3...p 4 p 5..p 6 ], q = [q 1...q 2 q 3...q 4 q 5..q 6 ] wstawiamy potomkowi odcinek z q: r = [... q 3,...q 4...] uzupełniamy głowę i ogon o miasta z p ale zachowując kolejność odwiedzeń: r = [p 1... q 3,...q 4 p 5...], zaczynamy od pozycji p 5 (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 p i ), na początku i = 1 jeżeli p i q i, to zablokowaliśmy możliwość wyboru q i, musimy zatem wziąć to miasto również z rodzica p z pozycji j, tj p j 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 a ij = 1 / wersja tablicowa A[i, j] = 1, a i,i = 0 zawsze, relacja jest przechodnia zatem jeżeli a ij = 1 i a jk = 1 to również a ik = 1, w tablicy jest dokładnie N(N 1)/2jedynek Mutacja zamieniamy parę miast miejscami a ij := 1 a ij, a ji := 1 a ji. Krzyżowania: Rodzice P oraz Q potomek R, R = min(p, Q) (po współrzędnych), resztę dopełniamy losowo, jeżeli r ij = r ji = 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 r ij = r ji = 0, to losowy z nich ustawiamy na 1 Krzyżowanie 2 Blokowe Rodzice P oraz Q potomek R Potomek [ P R = I rand 1 rand tr Q II dwa bloki diagonalne z rodziców, pozostałe uzupełniamy ] może wygenerować potomka z poza zbioru (tzn. r ij = r jk = 1, ale r ik = 0) 3
1.3 Wyszukiwanie ścieżek na R 2 (2p) dana para punktów na płaszczyźnie: S = (x s, y s ), D = (x d, y d ) dane przeszkody na płaszczyźnie: np. zbiór kół: K i = ((x i, y i ), r i ), wielokątów wypukłych (np trójkątów, reprezentacja wektorowa) lub piskeli (rastrowa). a 3 a 2 D S a 1 a 4 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 R 2, O = [a 0 = S, a 1, a 2..., a k = D], długość listy może być zmienna, interpretacja: ścieżka S = a o a 1 a 2 a k = D, długość ścieżki: gdzie, oznacza zwykłą odległość k L(O) = a i 1, a i, i=1 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 k 1 M(O) := M(a i ) i=1 gładkość(x i ) = π kąt pomiędzy sąsiednimi krawędziami α a i a i+1 a i 1 gładkość(o) = k 1 i=1 gładkość(x i) 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], I 2 ), 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