• Nie Znaleziono Wyników

Automatyczne strojenie algorytmów genetycznych

N/A
N/A
Protected

Academic year: 2021

Share "Automatyczne strojenie algorytmów genetycznych"

Copied!
30
0
0

Pełen tekst

(1)

Automatyczne strojenie algorytmów genetycznych

Mariusz MAKUCHOWSKI

Politechnika Wrocławska, Instytut Informatyki, Automatyki i Robotyki 50-370 Wrocław, Wybrzeże Wyspiańskiego 27,

e-mail:mariusz.makuchowski@pwr.wroc.pl

1 Wstęp

W otaczającym nas świecie niemal na każdym kroku możemy natknąć się na różnego rodzaju problemy optymalizacji dyskretnej. Możemy do nich zaliczyć zarówno wybór trasy i środka lokomocji do pracy jak i ułożenie narzędzi w szafie. Umiejętność znajdowania rozwiązań dobrych w sensie wybranego kry- terium (np. czas podróży, koszt podróży, dostępność narzędzi) zdecydowanie ułatwia nam życie. W przedstawionych przypadkach do znalezienia dobrych rozwiązań wystarcza przeważnie jakakolwiek intuicja. Inaczej jest jednakże w dużo większych przedsięwzięciach (np. planowanie ułożenia siatki rurocią- gów w dużym mieście czy wybór harmonogramu wykonywania podzespołów w produkcji masowej), gdzie znalezienie dobrego rozwiązania nie jest już takie proste. Ponadto zastosowanie lepszego rozwiązania (niż dotychczas stosowa- ne) przyniesie wyraźne korzyści (np. w postaci ilości zużytych surowców czy skrócenia czasu produkcji). Do rozwiązywania tego typu problemów stosuje się różnego typu zaawansowane algorytmy. Część z tych algorytmów dedy- kowana dla bardzo wąskiej grupy problemów nie posiada swojej analogii w innych sytuacjach. Istnieją jednak algorytmy stosowane dla szerokiej klasy problemów bazujące na wspólnej idei. Przykładem takich ogólnych schema- tów postępowania są m.in. metoda dokładna dziel i ograniczaj (ang. Branch

& Bound), metody przybliżone: poszukiwanie z zabronieniami (ang. Tabu Se- arch), symulowane wyżarzanie (ang. Simulated Annealing) czy podejście ge-

(2)

netyczne (ang. Genetic Algorithm). Schematy te nie precyzują w jaki sposób należy zdefiniować rozwiązanie, jak zaimplementować poszczególne elementy algorytmu i jak dobrać parametry sterujące dla zadanego problemu, poda- ją jedynie ogólny szkic algorytmu. Jednocześnie znana jest chęć badaczy do stworzenia algorytmu adaptującego swoje parametry dla danego problemu.

Celem pracy jest próba stworzenia uniwersalnego algorytmu genetycznego dobierającego automatycznie wszystkie istotne parametry na podstawie sta- tystycznych informacji instancji badanego problemu. Samostrojenie będzie odbywać się zarówno jednorazowo (dla danego zestawu przykładów) w fazie wstępnej algorytmu (ang. off-line) jak i na bieżąco podczas jego pracy (ang.

on-line). Jakość procedur samostrojenia algorytmu będę weryfikował przy po- mocy szerokich badań numerycznych. Konkretnie będę oceniał efektywność algorytmu genetycznego z zastosowaniem procedur samostrojenia w stosun- ku do analogicznego algorytmu wysterowanego ręcznie (możliwie najlepiej).

Ponadto przeprowadzę test porównujący algorytm genetyczny wyposażony we wszystkie techniki samostrojenia w stosunku do znanego algorytmu lite- raturowego.

2 Opis problemu

Testowane algorytmy dedykowane są dla problemu gniazdowego (ang. job shop problem) z dodatkowym ograniczeniem „bez czekania” (ang. no-wait).

Jako kryterium optymalizacji przyjmuje się moment zakończenia wykonywa- nia wszystkich zadań (ang. makespan). Rozważany problem, w trójpolowej notacji Graham’a [2], oznaczany jest przez J|no − wait|Cmax. Problem ten różni się od swego klasycznego odpowiednika (przez problem klasyczny rozu- mie się problem gniazdowy bez dodatkowych ograniczeń) wymogiem rozpo- częcia wykonywania operacji dokładnie w chwili zakończenia wykonywania się poprzednika technologicznego. Ograniczenie te najczęściej występują w gałęziach przemysłu w których przerabiany produkt zmienia szybko swoje własności fizyczno-chemiczne np. produkcja leków [8], żywności [4], wytop stali [14] czy wyrób elementów betonowych [3] choć także spotykane są w innych dziedzinach np. testowanie półprzewodników [12] czy systemach kom- puterowych [9].

(3)

2.1 Model matematyczny

Dany jest zbiór zadań J = {1, 2, . . . , n} które wykonywane są przy pomocy zbioru maszyn M = {1, 2, . . . , m}. Dodatkowo dla każdego zadania j ∈ J dany jest ciąg Ok = (o1k, o2k, . . . , orkk) zawierający rk operacji produkcyjnych.

Ilość wszystkich operacji w procesie oznaczy przez o = Pk∈Jrk. Operacja olk ∈ Ok, l ∈ {1, 2, . . . , rk}, k ∈ J składa się z pary (mlk, plk) określają- cej kolejno wykorzystywaną maszynę oraz czas trwania operacji. Ponadto w rozważanym problemie obowiązują następujące trzy typy ograniczeń:

(1) kolejnościowe: operacje zadania k należy wykonać w kolejności Ok, (2) synchroniczne: każda maszyna może wykonywać w danej chwili, co naj-

wyżej jedną operację oraz nie można w tym samym czasie wykonywać więcej niż jednej operacji danego zadania,

(3) „bez czekania”: każda nie pierwsza operacja danego zadania, musi roz- począć się dokładnie w momencie zakończenia wykonywania operacji wcześniejszej tego samego zadania.

Rozwiązanie klasycznego problemu gniazdowego zdefiniowane jest jako ze- staw momentów Skl ­ 0 rozpoczęcia wykonywania się operacji ok. Jednakże zauważmy, iż w przypadku dodatkowego ograniczenia „bez czekania”, zacho- dzi zawsze warunek

Skl+1 = Skl + plk, l ∈ (1, 2, . . . , rk− 1). (1) Z powyższej równości wynika bezpośrednio, że jednoznaczne wyznaczenie ter- minu rozpoczęcia dowolnej operacji pewnego zadania może zostać dokonane na podstawie momentu rozpoczęcia dowolnej innej operacji tego samego za- dania. Niech Sk oznacza moment rozpoczęcia zadania k z definicji równy momentowi rozpoczęcia pierwszej operacji tego zadania, Sk = Sk1. Jako roz- wiązanie problemu gniazdowego z ograniczeniem „bez czekania” przyjmuje się wektor nieujemnych terminów rozpoczęcia zadań,

S = (S1, S2, . . . , Sn).

Na podstawie wektora S moment rozpoczęcia Skl wykonywania operacji olk można wyznaczyć ze wzoru:

Skl = Sk+

Xl−1 i=1

pik. (2)

(4)

Rozwiązanie spełniające wszystkie powyższe ograniczenia nazywamy rozwią- zaniem dopuszczalnym. Niech Ckoznacza moment zakończenia wykonywania się zadania k, (moment zakończenia wykonywania się wszystkich operacji da- nego zadania),

Ck = Sk+

rk

X

i=1

pik. (3)

Długością Cmax(S) uszeregowania S nazywamy termin wykonania wszystkich zadań:

Cmax(S) = max

k∈J Ck. (4)

Problem polega na znalezieniu rozwiązania dopuszczalnego S o najmniejszej długości uszeregowania Cmax(S).

2.2 Kodowanie rozwiązania

Choć rozwiązaniem rozważanego problemu jest S wektor terminów rozpo- częcia zadań, wektor ten nie będzie zmienną decyzyjną w prezentowanych algorytmach. Wszystkie analizowane rozwiązania będą generowane przez al- gorytm pośredni zwany dalej procedurą upuchającą, natomiast zmienną de- cyzyjną będzie parametr sterujący tą procedurą zwany dalej permutacją ła- dującą.

Niech π = (π(1), π(2), . . . , π(n)) oznacza permutację wszystkich n zadań zbioru J (permutacja ładująca). Zbiór wszystkich możliwych permutacji ła- dujących będziemy oznaczali symbolem Π. Procedura pakująca składa się z n identycznych kroków. W każdym z nich na podstawie uzyskanego już we wcześniejszych krokach rozwiązania częściowego szeregowane jest kolejne zadanie. Szeregowanie pojedynczego zadania k ∈ J oznacza wyznaczenie Sk momentu jego rozpoczęcia. W i-tym kroku szeregowane jest zadanie π(i), tzn.

wyznaczana jest możliwie najmniejsza wartość Sπ(i) w taki sposób by two- rzone częściowe (lub końcowe w ostatnim kroku) uszeregowanie było rozwią- zaniem dopuszczalnym. Podczas tej czynności momenty rozpoczęcia zadań, wyznaczone w wcześniejszych krokach, nie podlegają już żadnym zmianom.

Efektywna implementacja procedury upychającej, wymaga zastosowania specyficznego sposobu kodowania bieżącego harmonogramu. Jest nim zestaw m list. Pojedynczym elementem każdej z listy jest parą (początek oraz koniec) momentów określająca przedział czasowy ciągłego wykorzystywania maszy- ny. Lista l zawiera uporządkowane chronologicznie zestaw wszystkich prze- działów czasowych wykorzystywania maszyny l. Zauważmy teraz, że wyzna-

(5)

czany moment rozpoczęcia wykonywania szeregowanego zadania, jest równy zero lub pewna operacja szeregowanego zadania rozpoczyna się dokładnie w momencie zakończenia innej operacji na tej samej maszynie (zadnie dosunię- te jest do lewej strony na osi czasu). Wynika z tego, że w celu znalezienia najmniejszego dopuszczalnego momentu Sk szeregowanego zadania k, należy sprawdzić moment zerowy oraz wszystkie momenty wynikające z rozpoczęcia operacji olk ∈ Ok we wszystkich mometach zwolnienia maszyny mlk. Zwróć- my uwagę na to, że rozpoczęcie zadania k w najpóźniejszym z analizowanych momentów tworzy zawsze (częściowe lub końcowe) rozwiązanie dopuszczalne.

Nie istnieje więc niebezpieczeństwo braku możliwości utworzenia rozwiązania dopuszczalnego. Wynika z tego, że dla każdej możliwej permutacji ładującej odpowiada dokładnie jedno rozwiązanie dopuszczalne.

Niech N oznacza największą liczbę operacji w zadaniach danej instancji, N = maxk∈Jrk; o ¬ n · N. Zauważmy teraz że, liczba możliwych momentów rozpoczęcia zadania k wynosi nie więcej niż o · N. Dodatkowo w przypadku, gdy każda z operacji dokładanego zadania k wykonuje się na innej maszynie liczba ta nie przekracza wartość o. Sytuacja ta występuje we wszystkich te- stowanych przykładach, dlatego analiza złożoności obliczeniowej poszerzona zostanie o ten specyficzny przypadek,

mak 6= mbk, 1 ¬ a < b ¬ rk, k ∈ J, (5) nazywany dalej przypadkiem szczególnym. Ponadto łatwo można zauważyć, iż w opisanej sytuacji wartość parametru N jest zawsze nie większa niż m;

N ¬ m.

Efektywny test dopuszczalności uszeregowania, zakłada analizę wszyst- kich badanych momentów w kolejności chronologicznej. Dla analizowanego momentu Sk i danej operacji olk „wykluczamy” wszystkie przedziały czasowe w liście mlk które kończą się przed Skl momentem rozpoczęcia tej operacji.

W celu weryfikacji poprawnego (w sensie narzuconych ograniczeń synchro- nicznych) położenia czynności olk wystarczy sprawdzić czy pierwszy z pozo- stawionych przedziałów rozpoczyna się nie wcześniej niż momencie Skl + plk zakończenia wykonywania operacji olk. Podczas testu wszystkich analizowa- nych momentów przedziały zajętości maszyny (dla danej operacji) testowane są kolejno a ich liczba jest nie większa niż o. Tak więc, w najgorszym przy- padku test wszystkich momentów rozpoczęcia zadania, wymaga nie więcej niż o · N analiz przedziałów (zarówno „wykluczanie” jak i sprawdzanie ogra- niczeń). Dodatkowo w przypadku szczególnym patrz wzór (5) liczba ta jest nie większa niż o.

(6)

Złożoność obliczeniowa jednego kroku procedury upychającej w przypad- ku ogólnym wynosi zatem O(oN ) = O(nN2). Dlatego cała procedura posiada złożoność O(n2N2). W przypadku szczególnym złożoność obliczeniowa jed- nego kroku wynosi O(o) = O(nm) a cała procedura ma złożoność O(n2m).

Przedstawione podejście bazujące na funkcji upychającej charakteryzuje się następującymi własnościami:

(1) dla każdej permutacji ładującej, generowane jest zawsze jedno rozwią- zanie dopuszczalne,

(2) generowane rozwiązania charakteryzują się bardzo wysoką jakością w sensie wartości funkcji celu,

(3) ilość różnych permutacji ładujących jest znacznie mniejsza niż liczba wszystkich rozwiązań aktywnych,

(4) różne permutacje ładujące mogą generować te same rozwiązania, (5) możliwości opuszczenia rozwiązania optymalnego nawet w przypadku

analizy wszystkich możliwych permutacji ładujących.

Dokładniejszą analizę, przykłady oraz badania numeryczne potwierdzające wymienione własności prezentowane są w pracy [6]. Praca [6] proponuje po- nadto stosowanie obok procedury upychającej także jej symetrycznego od- powiednika, co znacznie poprawia efektywność algorytmu. Spowodowane jest faktem iż niektóre z instancji, trudne do rozwiązania, stają się instancjami znacznie łatwiejszymi gdy przyjrzymy się ich symetrycznym lustrzanym od- powiednikom.

Ponieważ zmienną decyzyjną jest permutacja ładująca, sterująca nieba- nalną procedurą upychającą, trudno jest na wyselekcjonowanie pewnych jej cech i własności decydujących o jakości rozwiązania końcowego (np. wła- sności blokowych). Jest więc to idealny przykład problemu dla zastosowania algorytmu genetycznego, ponieważ algorytmy tego typu nie wykorzystują wcale (lub sporadycznie) specyficzne własności problemu i bazują głównie na wartości funkcji celu badanych rozwiązań.

2.3 Przykłady testowe

Wszystkie eksperymenty numeryczne przedstawione w tej pracy przeprowa- dzone zostały na 40 literaturowych przykładach testowych la01-la40. Przy- kłady te dedykowane są klasycznemu problemwi gniazdowemu i uważane są

(7)

przez badaczy za wyjątkowo trudne. Oczywiście w literaturze występuje także wiele innych zestawów trudnych przykładów testowych, jednakże dla naszych potrzeb zestaw zaproponowany przez Lawrence’a wydaje się być wystarcza- jąco duży i zróżnicowany. Jest on podzielony na osiem grupy po pięć instancji każda. W każdej grupie wszystkie przykłady charakteryzują się jednakowym rozmiarem a dokładniej jednakową liczbą zadań n, maszyn m i operacji o. Po- nadto cechą charakterystyczną tych przykładów jest to, że liczba wszystkich operacji wynosi dokładnie o = n·m oraz każde zadanie składa się dokładnie z m operacji rk = m, k ∈ J, wykonywanych na różnych maszynach spełniając warunek (5). W dalszej części pracy poszczególne grupy oznaczane są poprzez podanie rozmiaru instancji w nich zawartych n×m. Prezentowane w tabelach wyniki odnoszące się do całych grup są wartościami średnimi odpowiednich wartości otrzymanych dla wszystkich przykładów z danej grupy.

3 Algorytm genetyczny

Ogólna idea działania algorytmu genetycznego opisana jest w pracy [5] i na- śladuje ona Darwinowską teorię ewolucji wstępującą w świecie biologii. Algo- rytm taki symuluje zarówno środowisko jak i życie wirtualnych osobników.

Każdy z osobników identyfikowany jest z jednym rozwiązaniem, a jakość przy- stosowania oceniana się na podstawie wartości funkcji celu. Po zakończeniu symulacji danej liczby pokoleń algorytm kończy swe działanie, a jako rozwią- zanie końcowe przyjmuje się rozwiązanie odpowiadające najlepszemu osobni- kowi który pojawił się podczas całej symulacji. Właściwie dobrane parametry algorytmu genetycznego w szczególności odpowiednio dobrany mechanizm dziedziczenia wraz z selekcją promującą osobniki o żądanej cesze gwarantu- ją iż w symulowanym świecie pojawi się ewolucja. Ewolucja rozumiana jest tutaj jako tendencja do generowania pokoleń z coraz lepiej przystosowanymi osobnikami. Zmieniając definicję przystosowania czyli sposobu oceny danego osobnika możemy dokonać wyboru kierunku ewolucji. W praktyce wartość przystosowania danego osobnika przyjmuje wartość optymalizowanej funkcji celu dla odpowiadającego mu rozwiązania. W życiu pojedynczego pokolenia, osobniki najsłabiej przystosowane giną zazwyczaj bezpotomnie, natomiast najlepiej przystosowane stają się rodzicami nowego pokolenia. Nowo powsta- łe osobniki dziedziczą geny (pewne atrybuty rozwiązań) swoich rodziców.

Dzięki temu powstałe rozwiązania są kombinacją najlepszych rozwiązań po- kolenia wcześniejszego. W celu uniknięcia zwyrodnienia pokolenia w którym

(8)

wszystkie nowo generowane osobniki są do siebie bardzo podobne, stosuje się niewielką ich mutację. Dzięki mutacji algorytm bada coraz to nowe ob- szary przestrzeni rozwiązań co sprzyja opuszczaniu minimów lokalnych oraz umożliwia wygenerowanie osobnika o pewnej zatraconej w całej populacji cesze.

W każdym algorytmie genetycznym możemy więc wyróżnić następujące bazowe elementy:

(1) generacja populacji startowej: generacja osobników pierwszego pokole- nia,

(2) selekcja: wybór rodziców z całego pokolenia

(3) krzyżowanie: generowanie nowych osobników na podstawie materiału genetycznego rodziców

(4) mutacja: wprowadzenie niewielkich zmian w materiale genetycznym no- wo powstałych osobników

(5) kryterium stopu: określa warunek zatrzymujący pracę algorytmu (naj- częściej jest maksymalna liczba symulowanych pokoleń lub czas pracy algorytmu).

Sprecyzowanie wymienionych elementów algorytmu GA, jest podstawo- wym problemem z jakim musi poradzić sobie projektant danej implementacji algorytmu ewolucyjnego. W dalszej części pracy proponuję uniwersalny spo- sób doboru najbardziej korzystnych wariantów poszczególnych elementów.

3.1 Poziom mutacji

Zanim przejdę do omówienia poszczególnych metod samostrojenia algoryt- mu genetycznego wprowadzę najpierw pojęcie poziomu mutacji. Byt ten jest bezpośrednio powiązany z dobrze znanym z literatury prawdopodobieństwem mutacji. Różnice pomiędzy nimi mogą wydawać się subtelne jednakże są bar- dzo istotne ze względu na badania przeprowadzane w dalszej części pracy.

Poziom mutacji L określa z definicji względną liczbę mutacji wykonywanych w całym pokoleniu, (liczba wszystkich mutacji = L · liczba wszystkich genów), natomiast prawdopodobieństwo mutacji P z definicji jest prawdopodobień- stwem tego, że pojedynczy gen zostanie zmutowany.

(9)

Zauważmy teraz, że w zależności od sposobu kodowania rozwiązania i sto- sowanego operatora mutacji, mutowany gen może zmieniać wartość w bar- dzo ograniczony sposób, podczas gdy w losowym rozwiązaniu wartość tego genu może przyjmować wartości z znacznie liczniejszego zbioru. W takim przypadku nawet dla P = 1 (każdy gen zostaje zmutowany) istnieje duże podobieństwo pomiędzy genotypem pierwotnym a zmutowanym.

Przykładem powyższego zjawiska jest sytuacja w którym cały genotyp składa się z jednego chromosomu będącego permutacją. Jeżeli w takim przy- padku mutacja polega na zamianie w permutacji miejscami dwóch sąsiednich elementów, wówczas nawet podczas mutacji każdego genu istnieje duże podo- bieństwo permutacji pierwotnej x i permutacji zmutowanej y. Dowodem tego jest odległość pomiędzy tymi permutacjami d(x, y), rozumiana jako najmniej- sza liczba zamian sąsiednich potrzebna do przeprowadzenia permutacji x w permutację y. Z definicji odległości oraz ilości wykonanych mutacji równej ilości n elementów w permutacji, maksymalna odległość pomiędzy x i y może wynosić co najwyżej n; d(x, y) ¬ n, podczas gdy średnia odległość pomiędzy losową permutacją z a permutacją x wynosi AV E(d(x, z)) = n · (n − 1)/4, przy czym największa możliwa odległość pomiędzy permutacjami jest dwa razy większa. Oznacza to, że permutacja x i otrzymana poprzez mutację każdego genu permutacja y są do siebie (w sensie odległości d) podobne.

Z powyższej własności wynika bezpośrednio, że mutowanie zmutowanych już wcześniej genów, powoduje wprowadzanie jeszcze większych zakłóceń w genotypie osobnika. Fakt ten w żaden sposób nie jest uwzględniany przez pa- rametr P który informuje o prawdopodobieństwie przynajmniej jednokrotnej mutacji genu. Przeciwnie poziom mutacji o wartości większej niż 1 świadczy, że statystycznie w jednym osobniku dokonuje się więcej mutacji niż posiada on genów. W praktyce jednak optymalny poziom mutacji L jest na poziomie do kilku procent i w przybliżeniu jest równy P , a rozważania dla wartości L zbliżających się do 1 i większych mają charakter tylko teoretyczny.

Przy założeniu, iż każda mutacja zmienia dokładnie k genów, można na- pisać zależność prawdopodobieństwa mutacji P od ilości g wszystkich genów w pokoleniu i L poziomu mutacji,

P (η, L) = 1 − g − k g

!g·L

. (6)

Z przedstawionego wzoru 6 wynika, iż przy ustalonym poziomie mutacji L, ilość genów w pokoleniu nie ma dużego wpływu na wartość P . Ponadto dla

(10)

małego poziomu mutacji (takie poziomy stosowane są w poprawnie wystero- wanych algorytmach) jego wartość odpowiada niemal dokładnie prawdopo- dobieństwu mutacji P ≈ L, L < 0, 1.

Dodatkową subiektywną zaletą uzależnienia testowanych w dalszej części parametrów algorytmu od poziomu mutacji zamiast od prawdopodobieństwa jest duża większa przejrzystość generowanych charakterystyk.

3.2 Wybór operatora mutacji

Na wstępnie chciałbym przypomnieć, że algorytmy genetyczne nie pracują bezpośrednio na rozwiązaniach tylko na ich zakodowanych reprezentacjach (kodach). Istnieje więc potencjalna możliwość w której osobniki różniące się kodem reprezentują dokładnie te same rozwiązanie. Tłumacząc to na język biologii można powiedzieć, że istnieją różne genotypy którym odpowiada do- kładnie ten sam fenotyp. W takim przypadku możliwa jest mutacja w której zmutowany osobnik mimo zmiany kodu, generuje rozwiązanie dokładnie te samo co osobnik pierwotny. Taką mutację będę nazywał mutacją jałową.

Ponadto, niech ξ oznacza efektywność operatora z definicji równą prawdopo- dobieństwu, że losowo wykonana mutacja nie będzie mutacją jałową.

Pomimo, iż mutacja w algorytmach genetycznych zachodzi sporadycznie, ma ona ogromne znaczenie dla efektywności całego algorytmu. Podstawowe cele mutacji to:

(1) tworzenie osobników różniących się częściowo ale w istotny sposób od rodziców, co umożliwia przeniesienie poszukiwań w coraz to nowe część przestrzeni rozwiązań,

(2) utworzenie osobnika posiadającego cechę niewystępującą w pokoleniu, co umożliwia znalezienie rozwiązania lokalnie optymalnego nawet w przypadku zatracenia się w pokoleniu pewnej cechy tego rozwiązania, (3) przeciwdziałanie stagnacji obliczeń, to znaczy sytuacji w której całe

pokolenie zdominowane jest przez jeden rodzaj mało różniących się między sobą osobników.

Aby zmutowany osobnik miał dużą szansę zostania rodzicem (warunek niezbędny do osiągnięcia celu 1), wartość jego przystosowania nie może być dużo gorsza niż pozostałych rozwiązań w pokoleniu. Wynika z tego, że muta- cja powinna generować osobniki istotnie różniące się od osobnika pierwotnego

(11)

(w sensie kodu), jednocześnie wartość przystosowania zmutowanych osobni- ków powinna być podobna do wartości przystosowania osobnika mutowanego.

Zróżnicowanie funkcji przystosowania mutowanych osobników możemy zmierzyć tak zwaną autokorelacją przestrzeni rozwiązań [13]. Definiowana jest ona dla danej przestrzeni Π, funkcji celu C(π), π ∈ Π i miary odległości d(x, y), x, y ∈ Π,

%(d) = 1 − AV E(C(x) − C(y))2

d(x,y)=d

AV E(C(x) − C(y))2 , (7) gdzie AV E((C(x) − C(y))2)d(x,y)=d oznacza wartość średnią (C(x) − C(y))2 wszystkich par x, y ∈ Π takich, że odległość d(x, y) wynosi dokładnie d, na- tomiast AV E((C(x) − C(y))2) oznacza wartość analogiczną dla wszystkich możliwych par. Wartość %(d) zmienia się od 0 do 1 i określa korelację roz- wiązań oddalonych od siebie o d.

Z naszego punktu widzenia para osobników x, y ∈ Π, x 6= y gdzie y powstał z mutacji osobnika x, oddalona jest od siebie o 1 w mierze odpo- wiadającej danej mutacji (miarę tę można zdefiniować jako minimalną liczbę mutacji transformującą osobnika x w osobnika y). Wynika z tego, że intere- sujące nas zróżnicowanie funkcji przystosowania mutowanych osobników jest ściśle związane z wartością %(1) odpowiedniej miary odległości. Wartość %(1) bliska 1 oznacza małe zróżnicowanie, w sensie wartości funkcji celu, muto- wanych osobników względem osobnika pierwotnego. Przeciwnie wartość %(1) bliska 0 oznacza, brak relacji wartości funkcji celu pomiędzy zmutowanymi rozwiązaniami a rozwiązaniem pierwotnym.

W celu wyznaczenia przybliżonej wartości %(1), oznaczanej dalej przez

% proponuje się wyznaczyć zbiór X = {x1, x2, . . .} losowych osobników oraz zbiór Y = {y1, y2, . . .} mutantów, gdzie yi powstał porzez zmutowanie osob- nika xi. Wartość % można teraz wyznaczyć poprzez:

%(1) ≈ % = 1 − AV E(C(xi) − C(yi))2

2AV E(C(xi)2) − AV E(C(xi))2. (8) Zauważmy, że mała efektywność skutecznie zmniejsza chropowatość prze- strzeni rozwiązań (zwiększa współczynnik %). Jako jedno z kryterium wyboru operatora mutacji, proponuje się przyjąć zmodyfikowną szorstkość przestrze- ni rozwiązań danego operatora zdefiniowaną jako %. Oblicza ją się analogicz- nie jak wartość % z tą różnicą, że nie uwzględnia się sytuacji w których pary

(12)

osobników xii yi reprezentują te same rozwiązania. Operatory o dużej warto- ści % mają dużą szansę na to, że stworzone przez nie osobniki (reprezentujące zupełnie nowe rozwiązania) zakwalifikują się do puli rodzicielskiej. Oznacza to, że operatory te skutecznie będą realizować powierzone im zadania.

Podsumowując, z zestawu operatorów mutacji wśród operatorów o naj- większych wartościach parametru ξ należy wybrać ten operator dla którego wartość % jest największa. Dodatkową sugestią jest aby wyboru operato- ra dokonać jednorazowo przed uruchomieniem wysterowanego algorytmu. W przypadku przeciwnym, to jest zmiany operatora (on-line) w trakcie pra- cy algorytmu należy pamiętać także o zmianie wartość prawdopodobieństwa mutacji. Jest to potrzebne ze względu na to, iż dla różnych operatorów opty- malna wartość prawdopodobieństwa mutacji jest różna. Pewnym ułatwieniem jest zastosowanie automatycznego doboru poziomu mutacji opisanego w dal- szej części pracy.

Badania numeryczne

Wszystkie prezentowane testy przeprowadzone został na komputerze klasy PC wyposażonym w procesor Athlon 2000+ (1667MHz) w środowisku wie- lozadaniowym Windows XP. Wszystkie opisane algorytmy zostały zaprogra- mowanie w języku C++ i skompilowane przez Dev C++ w wersji 4.9.9.1.

Ponieważ zmienną decyzyjną jest permutacja (konkretnie permutacja ła- dująca) do przetestowania wybrałem następujące cztery powszechnie stoso- wane (dla permutacji) operatory mutacji:

(1) small swap: polegający na zamianie losowych dwóch sąsiednich elemen- tów permutacji, oznaczany dalej w skrócie przez SSw,

(2) swap: polegający na zamianie miejscami dwóch różnych losowych ele- mentów permutacji, oznaczany dalej w skrócie prze Swp,

(3) insert: polegający na wyciągnięciu losowego elementu z permutacji i ponownym włożeniu go na losową pozycję (z wykluczeniem pierwotnej pozycji), oznaczany dalej w skrócie przez Ins,

(4) invert: polegający na odwróceniu kolejności elementów losowej części permutacji, oznaczany dalej w skrócie przez Inv.

Pierwszy z testów polega na zbadaniu chropowatości %, zmodyfikowa- nej chropowatości % oraz efektywności ξ wymienionych operatorów mutacji.

(13)

Tabela 1: Średnia wartości parametrów %, % oraz ξ dla testowanych opera- torów mutacji

Grupa % % ξ

n × m SSw Swp Ins Inv SSw Swp Ins Inv SSw Swp Ins Inv 10 × 5 0.56 0.37 0.43 0.31 0.42 0.29 0.36 0.24 0.72 0.92 0.90 0.93 15 × 5 0.66 0.41 0.46 0.34 0.48 0.32 0.39 0.28 0.64 0.93 0.89 0.94 20 × 5 0.70 0.44 0.51 0.38 0.54 0.42 0.44 0.33 0.61 0.94 0.88 0.94 10 × 10 0.55 0.30 0.37 0.29 0.36 0.24 0.27 0.22 0.70 0.92 0.88 0.93 15 × 10 0.62 0.35 0.39 0.29 0.43 0.28 0.32 0.24 0.66 0.94 0.89 0.94 20 × 10 0.64 0.35 0.41 0.34 0.44 0.33 0.35 0.27 0.61 0.94 0.89 0.95 30 × 10 0.68 0.39 0.45 0.32 0.45 0.35 0.36 0.27 0.58 0.96 0.89 0.96 15 × 15 0.60 0.30 0.34 0.30 0.39 0.27 0.30 0.25 0.69 0.94 0.90 0.95 wszystkie 0.63 0.37 0.42 0.32 0.44 0.31 0.35 0.26 0.65 0.94 0.89 0.94

Średnie wartości otrzymanych parametrów dla poszczególnych grup przykła- dów przedstawiono w tabeli 1. Po dokładnej analizie danych można zauważyć szereg następujący prawidłowości.

Wraz ze wzrostem n liczby zadań wartość % ma tendencję malejącą (dla wszystkich badanych operatorów). Dokładnie przeciwny wpływ na ten para- metr wywiera m liczba maszyn w problemie, wraz z jej wzrostem wartość % także rośnie. Jednakże decydujący wpływ na parametr % ma rodzaj zasto- sowanego operatora mutacji. Najbardziej wyróżniającym się operatorem jest SSw dla którego generowana przestrzeń rozwiązań jest dużo bardziej gład- ka (duże %) niż w przypadku pozostałych operatorów. Spowodowane jest to dwoma czynnikami: (1) operator SSw często zmienia tylko genotyp osobnika nie zmieniając jego fenotypu (wskazuje na to mała wartość ξ), (2) operator SSw jest szczególnym przypadkiem (możliwie najmniejszą wersją) każdego z pozostałych trzech operatorów. Kolejność wszystkich operatorów względem chropowatości generowanej przestrzeni rozwiązań (według nierosnącego %) to SSw, Ins, Swp i Inv.

Analiza wartości zmodyfikowanych chropowatości % pokazuje dużą do- datnią korelację z wartością %. Wszystkie własności zaobserwowane dla % od- noszą się także do wartości zmodyfikowanej %. Jednakże tym razem, wpływ operatora mutacji ma nieco mniejsze znaczenie a wartość % operatora SSw nie odbiega już tak bardzo od analogicznej wartości pozostałych operatorów.

(14)

-5 0 5 10

0,0001 0,001 0,01 0,1 1 10 100

L ρ [%]

SSw Swp Ins Inv

Rysunek 1: Zależność średniej jakość % w stosunku do poziomu mutacji L dla testowanych operatorów mutacji

Tłumaczy to bezpośrednio z fakt, iż zmodyfikowana wartość chropowatości przestrzeni nie zależy (w przeciwieństwie do wartości niezmodyfikowanej) od efektywności operatora ξ.

Analizując wartości efektywności poszczególnych operatorów można za- uważyć, że wartość ξ mocno zależy od wybranego operatora. Operator SSw jest niezwykle mało efektywny, średnio aż 35% mutacji nie zmienia w naj- mniejszym stopniu rozwiązania (pomimo zmian w permutacji ładującej od- powiadające mu rozwiązanie nie ulega zmianie).

Drugi z testów pokazuje wpływ wartości poziomu mutacji danego opera- tora na jakość generowanych rozwiązań. Jakość rozwiązania rozumiana jest tutaj jako błąd względny otrzymanego rozwiązania x względem rozwiązania referencyjnego x0,

ρ = Cmax(x) − Cmax(x0)

Cmax(x0) · 100%. (9)

Jako rozwiązanie referencyjne przyjmuje się rozwiązanie utrzymane al- gorytmem GASA opisanym w pracy [11]. Testowany algorytm uruchmiany był z następującymi parametrami: liczba symulowanych pokoleń - 1000, licz- ba osobników w pokoleniu - 50, operator krzyżowania - P M X, selekcja - metoda ruletki.

Wykres na rysunku 1 przedstawia średnią wartość ρ jakości generowanych

(15)

rozwiązań uzyskaną dla różnych wartości L poziomów mutacji wszystkich testowanych operatorów mutacji.

Ocena wyników

Z wykresu zamieszczonego na rysunku 1 wynika, że szeregując operatory mutacji według średniej jakości ρ (przy optymalnym dla danego operatora poziomie mutacji) uzyskujemy następującą kolejność: SSw, Ins, Swp, Inv.

Zauważmy, że sekwencja ta została już wcześniej wytypowana na podstawie parametru %.

Drugim narzucającym się spostrzeżeniem jest fakt, iż dla przykładów w których n = 10 (przykłady te charakteryzują się stosunkowo małą prze- strzenią rozwiązań) najmniejsza osiągana wartość ρ jest tylko nieznacznie mniejsze niż w przypadku wartości ρ odpowiadającej dużym wartością po- ziomu L. Spowodowane jest to bardzo małą przestrzenią rozwiązań, w której

„algorytmy losowe” (sprawdzające stosunkowo dużą, zadaną, ilość rozwiązań losowych) radzą sobie całkiem nieźle oraz faktem iż algorytm genetyczny przy bardzo dużym poziomie mutacji staje się właśnie takim losowym algorytmem.

Można więc powiedzieć, że zastosowanie w analizowanym problemie podej- ścia bazującego na algorytmie pakującym, tak silnie redukującego przestrzeń rozwiązań z (n!)m do n! spowodowało, iż tylko w grupach 20 × 5, 20 × 10, 15 × 15, 30 × 10, zawierających większe instancje dobrze uwidaczniają się wszystkie własności algorytmów GA.

Trzecim spostrzeżeniem jest fakt, iż rodzaj zastosowanego operatora mu- tacji nie ma decydującego wpływu na efektywność algorytmu. Z wykresu 1 wynika, że dla optymalnych poziomów mutacji (innego dla każdego opera- tora) jakość generowanych rozwiązań jest zbliżona. Jednocześnie zauważyć można, że źle dobrany poziom mutacji zdecydowanie obniża jakość znajdo- wanych rozwiązań. Dlatego w dalszej części pracy przedstawiony jest pewien sposób jego automatycznego doboru.

Z przedstawionych tu spostrzeżeń, w szczególności oceny operatorów mu- tacji które są prawie niezależne od instancji oraz stosunkowo małego wpływu operatora mutacji na efektywność algorytmu wynika, iż nie ma potrzeby au- tomatycznego doboru operatora metodą „on-line” (na bieżąco podczas pracy algorytmu). Ostatecznie dla konkretnego algorytmu genetycznego dedyko- wanego danemu problemowi proponuję przeprowadzenie jednego wstępne- go badania „off-line” w wyniku którego na podstawie efektywności ξ oraz zmodyfikowanej chropowatości % wybierze się jeden, potencjalnie najlepszy

(16)

4000 4200 4400 4600 4800 5000

0 100 200 300 400 500 600 700 800 900 1000

nr. pokolenia f. celu

L = 0,0002 L = 0,0100 L = 0,5000

Rysunek 2: Przebieg przykładowego algorytmu genetycznego dla różnych wartości poziomu mutacji. Przykład LA31

operator mutacji, niezmiennie stosowany przez cały przebieg algorytmu.

3.3 Dobór prawdopodobieństwa mutacji

Z badań przeprowadzonych w wcześniejszym punkcie, niektóre z spostrzeżeń dotyczą bezpośrednio poziomu mutacji. Najważniejszym z nich jest fakt, iż wartość poziomu mutacji ma decydujący wpływ na efektywność algorytmu.

Poza tym, optymalna wartość poziomu mutacji zależy od stosowanego ope- ratora jak i od danych problemu (patrz rysunek ??). Relacje optymalnych wartości poziomu mutacji różnych operatorów są proste do przewidzenia, to znaczy wraz z wzrostem efektywności stosowanego operatora, optymalny poziom mutacji spada oraz wraz z wzrostem chropowatości krajobrazu prze- strzeni danego operatora (zmniejszaniem %) wartość optymalnego poziomu mutacji także nieznacznie spada.

W celu dokładniejszego zrozumienia zjawisk zachodzących w algorytmie genetycznym na rysunku 2 przedstawiono przebieg takiego algorytmu o zbyt małym, względnie dobrym i zbyt dużym poziomie mutacji.

Przy zbyt małej wartości poziomu mutacji w algorytmie GA następuje stagnacja obliczeń (patrz pierwszy przebieg na rys. 2). Dzieje się tak dlate- go, ponieważ pokolenie zdominowane jest przez tak zwane super osobniki, dominujące zarówno jakościowo jak i ilościowo. Osobniki te są praktycznie

(17)

identyczne, co najwyżej różnią między sobą w sposób nieistotny dla roz- wiązania i kryterium funkcji celu. Super osobniki są na tyle dobre w sen- sie wartości funkcji przystosowania iż, często dochodzi do krzyżowania się ich między sobą, tworząc nowego super osobnika w następnym pokoleniu.

Wszystkie pozostałe krzyżowania w pokoleniu generują potomstwo słabsze w sensie wartości funkcji przystosowania, w konsekwencji po selekcji natural- nej nowe pokolenie zdominowane jest znowu przez super osobniki identyczne jak w pokoleniu wcześniejszym. W tej sytuacji, możliwe są tylko trzy dalsze scenariusze symulowanego życia: (1) pewien zmutowany osobnik, będzie le- piej przestosowany niż super osobniki, (ze względu na to iż super osobniki charakteryzują się bardzo wysoką funkcją przystosowania oraz faktem nie- licznych mutacji w pokoleniu wariant ten jest mało prawdopodobny), (2) w nowym pokoleniu nie pojawią się super osobniki (wariant ten jest także mało prawdopodobny, gdyż istnieje duża szansa wzięcia do krzyżowania dwóch su- per osobników), (3) nowo powstałe pokolenie będzie tak samo zdominowane przez super osobniki, jak pokolenie wcześniejsze (wariant najbardziej praw- dopodobny). Nastąpiła więc stagnacja obliczeń, algorytm wpadł w pewien rodzaj optimum lokalnego z bardzo małymi szansami na jego opuszczenie.

Przy zbyt wysokiej wartości poziomu mutacji, algorytm GA wykazuje ce- chy algorytmu sprawdzającego losowe rozwiązania (patrz trzeci przebieg na rys. 2). Jest tak dlatego, iż w nowo powstających osobnikach zachodzi sto- sunkowo duża liczba mutacji co skutkuje tym, że zatraca się większość cechy przeniesionych z rodziców. Przestaje więc działać mechanizm dziedziczenia, a w jego miejscu pojawia się generowanie losowych rozwiązań. W tej sytu- acji nowo powstające pokolenie nie jest coraz lepszą odmianą osobników z wcześniejszych pokoleń, lecz zbiorem losowych rozwiązań mających niewiele wspólnego z wcześniejszymi pokoleniami.

Sytuację w której poziom mutacji jest prawidłowy, czyli na tyle duży by nie zaszło zjawisko stagnacji obliczeń oraz na tyle mały by nowo powstają- ce osobniki dziedziczyły cechy swoich rodziców, przedstwiony jest w drugim przebiegu rysunku 2. Na wykresie tym widać podstawowe zjawiska zacho- dzące w poprawnie wysterowanym algorytmie genetycznym. Są nim szybkie

„schodzenie” algorytmu do minimum lokalnego oraz efektywna dywersyfika- cja obliczeń uwidaczniająca się opuszczaniem znalezionych minimów lokal- nych.

Ponieważ dokładne wyznaczenie optymalnej wartości poziomu mutacji w sposób analityczny na dzisiejszym poziomie wiedzy jest niemożliwe, jedyna metoda jego wyznaczenia to eksperymenty numeryczne. A ponieważ dla róż-

(18)

nych instancji optymalna wartość poziomu mutacji jest różna, dobór właści- wego poziomu należ dokonywać dla każdego przykładu z osobna lub zmieniać go na bieżąco podczas pracy (on-line) obserwując przebieg sterowanego algo- rytmu. Niemniej w niniejszej pracy proponowany sposób mutacji nieznacznie odbiega od jego klasycznego pierwowzoru. Dokładniej, zamiast dokonywać mutacji genów z ustalonym (na stałe lub dynamicznie zmienianym) prawdo- podobieństwem, proponuje się wstępną analizę populacji a następnie na jej podstawie wyznaczonenie osobników które należy zmutować. Metoda ta nie tylko dobiera automatycznie ilość mutacji w pokoleniu, ale także wskazuje osobniki które należy poddać mutacji.

Proponowana strategia bazuje na dwóch prostych spostrzeżeniach:

(1) W przypadku, gdy cała populacja jest mocno zróżnicowana nie ma po- trzeby mutowania jej osobników. Mutacja w takim przypadku pozbawia ich tylko odziedziczonych cech.

(2) W przypadku, pojawienia się w pokoleniu kilku super osobników, należy dokonać ich mutacji. Taka mutacja zapewnia uniknięcia stagnacji ob- liczeń poprzez eliminację identycznych osobników. Ponadto umożliwia szybkie dojście do optimum lokalnego (w przypadku gdy super osobni- cy reprezentują rozwiązanie bliskie rozwiązaniu lokalnie optymalnemu.

Ponadto umożliwia łatwe opuszczenie minimum lokalnego.

Strategia postępowania wydaje się więc oczywista. Należy zidentyfikować wszystkie klony, a następnie dokonać ich mutacji. Klonem nazywamy osob- nika podobnego w pewnym sensie do innego osobnika istniejącego w danym pokoleniu. Takie podejście choć intuicyjne nie ma swojego odpowiednika w świecie przyrody. Przy implementacji proponowanej strategii, do rozstrzy- gnięcia pozostaje między innymi sposób detekcji klonów.

W rozważanym problemie zastosowanie kodowania rozwiązania w postaci permutacji ładującej, skutecznie utrudnia efektywne porównanie rozwiązań (porównaie na podstawie permutacji ładującej bez wywoływania procedury upychającej). Dlatego do detekcji klonów zastosowano najprostrzą metodę to znaczy poprzez porównywanie wartości funkcji przystosowania osobników.

Osobnicy o tej samej wartości funkcji przystosowania traktowani są jak klony.

Ponadto klony wybrane do mutacji, powinny zostać zmutowane efektywnie, to znaczy w taki sposób by mutacja rzeczywiście zmieniła nie tylko genotyp ale także fenotyp osobnika. W tym celu można przykładowo kontrolować zmianę wartość funkcji przystosowania mutowanych osobników.

(19)

4000 4200 4400 4600 4800 5000

0 100 200 300 400 500 600 700 800 900 1000

nr. pokolenia f. celu

L = 0,0100 L = auto "SINGLE"

Rysunek 3: Przebieg przykładowego algorytmu genetycznego z optymalną oraz automatycznie dobieraną wartością poziomu mutacji. Przykład LA31

Efektami ubocznym wynikającym z wykrywania klonów oraz testowaniem zmiany mutowanego osobnika na podstawie wartości funkcji celu odpowia- dających im rozwiązań jest możliwość stwierdzenia identyczności osobników mimo różnych fenotypów oraz dodatkowe bardzo czasochłonne obliczenia wyznaczające wartość funkcji celu zmutowanego klona. Pierwsze z wymie- nionych zjawisk zachodzi stosunkowo rzadko i nie powoduje żadnych poważ- nych zaburzeń w algorytmie, natomiast drugie zdecydowanie spowalnia jego pracę. Zaproponowana wcześniej strategia mutacji osobnika polegająca na jego mutacji, aż do zmiany wartości funkcji celu, jest bardzo wolna i zostaje nazwana strategią F U LL. Przyśpieszenie pracy algorytmu, można dokonać poprzez jej redukcję do strategii, nazwanej SINGLE, polegającej na jedno- krotnej mutacji i jednokrotnego obliczenia zmodyfikowanej wartości funkcji przystosowania (bez względu na to czy nastąpiła zmiana jej wartości czy też nie). Ostatnią strategią praktycznie niespowalniającą pracę algorytmu jest strategia BLIN D polegająca na jednokrotnej mutacji danego osobnika bez ponownego wyliczenia wartości funkcji przystosowania. Tak zmutowany osobnik podlega selekcji według pierwotnej wartości funkcji przystosowania.

(20)

Badania numeryczne

Pierwszy z testów polega na wygenerowaniu przebiegu algorytmu genetyczne- go, to znaczy wykreśleniu wartości funkcji celu rozwiązania odpowiadającego najlepszemu osobnikowi w bieżącym pokoleniu. Na rysunku 3 przedstawiony jest przykładowy przebieg algorytmu genetycznego z automatyczną mutacją i strategią SIN GLE oraz dla porównania przebieg algorytmu z klasyczną mutacją przy prawidłowo dobranym poziomie mutacji. Z przebiegów tych wi- dać, iż algorytm genetyczny z automatyczną mutacją generuje rozwiązania statystycznie lepsze niż w przypadku stałego (poprawnie dobranego) pozio- mu mutacji. Przewaga automatycznego doboru mutacji nad jego klasycznym odpowiednikiem widoczna jest także po osiągnięciu przez algorytm minimum lokalnego. W przypadku klasycznej mutacji algorytm pozostaje przez kilka- dziesiąt iteracji zdominowany przez te same rozwiązania (fragmentami prosta linia wykresu), efekt ten prawie nie występuje przy automatycznej mutacji.

Drugi z testów polega na porównaniu średniej wartości błędu ρ generowa- nych przez algorytm genetyczny wysterowany przez dobrany poziom mutacji L oraz automatyczną mutacją ze strategią SINGLE, F ULL i BLIND. Do- bierany eksperymentalnie poziom mutacji L wybierany jest ze zbioru L ∈ { 0.0001, 0.0002, 0.0005, 0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100 } jako poziom dla którego pojedynczy przebieg algorytmu okazał się najbardziej korzystny. Ze względu, iż wartość poziomu L wyzna- czana jest eksperymentalnie jest ona tylko pewnym przybliżeniem wartości optymalnego poziomu L∗∗.

Omawiane badania został wykonane dla każdego z testowanych operato- rów mutacji a wszystkie otrzymane wyniki zamieszczone zostały w tabelach 2 i 3. Kolejno, tabela 2 zawiera wartość optymalnego poziomu L i średnią jakość ρ dla algorytmu o mutacji na poziomie L natomiast tabela 3 za- wiera średnie wartości ρ algorytmu z automatyczną mutacją typu F U LL, SINGLE i BLIND. Wartość ρ obliczana jest ze wzoru (9) względem roz- wiązania otrzymanego literaturowym [11] algorytmem GASA. Ponadto ko- mentarza wymagają dwa ostatnie wiersze wszystkie i średnia zawarte w tabeli 2. Pierwszy z nich zawiera wartości parametrów uzyskane dla najlepiej do- branego, jednakowego dla wszystkich grup, poziomu mutacji. Ostatni wiersz zawiera natomiast średnie wartości parametrów uzyskane w przypadku gdy dla każdej z grup przykładów poziom mutacji wyznaczany był indywidualnie.

(21)

Tabela 2: Wyznaczony poziom mutacji L oraz odpowiadająca mu średnia jakość generowanych rozwiązań ρ [%], testowanych operatorów mutacji

Grupa Optymalny poziom mutacji L Średni błąd ρ dla mutacji L n × m SSw Swp Ins Inv SSw Swp Ins Inv 10 × 5 2.00 0.20 0.10 0.10 -1.91 -2.63 -1.56 -1.47 15 × 5 0.50 0.10 0.10 0.10 0.31 1.94 1.29 1.77 20 × 5 1.00 0.05 0.05 0.05 -0.28 -2.01 -0.16 -1.22 10 × 10 1.00 0.50 0.20 1.00 -5.40 -5.29 -5.29 -5.47 15 × 10 0.50 0.10 0.10 0.10 -1.39 0.09 -0.73 0.78 20 × 10 0.50 0.05 0.10 0.05 -1.22 -2.69 -2.10 -2.15 30 × 10 0.20 0.05 0.05 0.05 -5.68 -4.69 -6.54 -3.88 15 × 15 1.00 0.05 0.10 0.10 -1.74 -1.86 -2.06 -0.56 wszystkie 0.50 0.05 0.10 0.05 -1.72 -0.83 -1.27 -0.86 średnia 0.84 0.14 0.10 0.19 -2.16 -2.14 -2.14 -1.53

Tabela 3: Średnia jakość ρ [%] generowanych rozwiązań dla badanych metod automatycznej mutacji, testowanych operatorów

Grupa mutacja F U LL mutacja SIN GLE mutacja BLIN D n × m SSw Swp Ins Inv SSw Swp Ins Inv SSw Swp Ins Inv

10 × 5 2.25 -1.79 -1.84 -1.68 1.61 -1.77 -2.47 -1.99 6.12 -2.04 -1.96 -1.65 15 × 5 6.45 1.16 1.29 2.87 5.64 0.69 1.46 2.72 6.14 0.64 1.06 0.32 20 × 5 2.61 -1.77 -1.80 -0.71 2.77 -0.68 -1.68 -1.82 5.13 -1.80 -1.67 -0.95 10 × 10 -0.25 -3.08 -2.39 -3.94 -0.90 -3.93 -3.53 -3.89 -0.77 -2.71 -3.44 -3.39 15 × 10 5.51 0.46 -0.74 -0.79 5.91 -0.34 2.16 0.69 5.63 0.62 1.04 0.33 20 × 10 1.90 -2.11 -1.99 -1.08 5.28 -0.56 -0.90 -1.58 3.94 -1.33 -0.93 -0.56 30 × 10 -2.96 -6.47 -6.19 -4.90 -1.03 -6.15 -7.55 -5.33 0.17 -6.79 -5.05 -5.80 15 × 15 4.82 -0.45 -2.35 -2.19 5.09 -1.93 -0.73 -0.15 7.05 -0.77 0.67 -0.97 wszystkie 2.54 -1.76 -2.00 -1.55 3.05 -1.83 -1.66 -1.42 4.18 -1.77 -1.29 -1.58

Ocena wyników

Na początku rozdziału dotyczącego wyboru operatora mutacji, wypunkto- wane zostały główne cele stosowania mutacji w algorytmach genetycznych.

(22)

Z obserwacji przykładowego przebiegu algorytmu z automatycznie dobieraną mutacją (rysunek 3) widać dokładnie, iż w prezentowanym przykładzie speł- nia ona wszystkie wymagania dotyczące prawidłowej mutacji. Główną wadą zaproponowanego podejścia okazał się fakt, iż istnieją operatory mutacji (w rozważanym przypadku operator SSw) dające mierne rezultaty prezento- wanego automatycznego doboru mutacji. Niemniej dla pozostałych trzech operatorów Swp, Ins i Inv, wyniki zaproponowanej automatycznej mutacji są bardzo dobre.

Ograniczając się do analizy wyżej wymienionych trzech operatorów mu- tacji, z porównania tabel 2 i 3 wynika, iż w rozważanym problemie, każdy z wariantów automatycznej mutacji jest statystycznie lepszy niż najlepiej dobrana mutacja klasyczna. Co więcej w przypadku gdy najlepszy możliwy poziom mutacji dobierany jest indywidualnie dla każdej z grup przykładów, algorytmy z automatyczną mutacją wypadają tylko nieznacznie słabiej. Na- leży tu zauważyć, że ostatnie z porównań stawia automatyczną mutację w niekorzystnej pozycji. Jest tak dlatego, gdyż omawiany test polegał na jed- nokrotnym uruchomieniu wszystkich algorytmów i otrzymane wyniki są czę- ściowo losowe.W algorytmie o stałym poziomie mutacji zdarza się, że dla jakiegoś poziomu mutacji L (statystycznie słabszego niż poziom L0 bliższy poziomowi optymalnemu L∗∗) wartości ρ z pojedynczych przebiegów będą korzystniejsze niż dla poziomu L0. W takim przypadku do oceny porównaw- czej uwzględnia się najlepsze z otrzymanych rezultatów, to jest przebiegi dla poziomu L zamiast przebieg dla poziomu L0. Eksperyment ten eliminuje więc pojedyncze „wpadki” algorytmu klasycznego dla poziomu L0 oraz wy- biera wyjątkowo „udane przypadki” przebiegów o innych poziomach mutacji w szczególności o poziomie L. Natomiast w algorytmie z automatyczną mu- tacją do oceny podawany jest zawsze tylko jeden z przebiegów który mógł wypaść słabiej lub lepiej niż w przypadku średnim.

3.4 Wybór operator krzyżowania

Zadaniem operatorów krzyżowania jest tworzenie nowych osobników z roz- wiązań rodzicielskich. Pomimo, iż w procesie tworzenia nowego osobnika wy- stępuje pewna losowość, w prawidłowo dobrane operatory krzyżowania za- pewniają, iż powstające osobniki dziedziczą geny (pewne własności reprezen- towanych rozwiązań) po swoich rodzicach.

Pewną analogią tłumaczącą znaczenie krzyżowania jest przyrównanie da- nego osobnika do pomysłu tworzącego rozwiązanie a całej populacji do ze-

(23)

stawu idei rozwiązań. W analogii tej nowy osobnik jest niczym innym jak innowacyjnym pomysłem. Zastanawiając się czym są nowatorskie pomysły dochodzimy do wniosku, iż są to najczęściej różnego rodzaju kombinacje kon- cepcji sprawdzających się w przeszłości. Tak też, generowane nowe osobniki są pewnego rodzaju krzyżówką najlepszych rozwiązań z przeszłości (klasycznie krzyżówką najlepiej przystosowanych osobników poprzedniego pokolenia).

Sposób oceny przydatności operatorów krzyżowania wydaje się więc oczy- wisty. Operator jest tym lepszy im z danej populacji początkowej generuje lepsze w sensie wartości funkcji przystosowania osobniki. Ponieważ klasycznie operatory krzyżowania łączą ze sobą parę osobników, w celu utworzenia osob- nika będącego krzyżówką więcej niż dwóch rozwiązań należy przeprowadzić kilka iteracji krzyżowań. Drugim z kryterium oceny operatora krzyżowania jest szybkość (liczona w pokoleniach algorytmu) znajdowanego minimum lo- kalnego. Na podstawie wyżej wymienionych spostrzeżeń, do oceny jakości operatora krzyżowania proponuję przyjąć wartość funkcji celu znalezionego rozwiązania w próbnym uruchomieniu algorytmu genetycznego bez mutacji z ustaloną stosunkowo niewielką liczbą symulowanych pokoleń. Taka ocena pro- muje operatory szybko znajdujące dobre minima lokalne. Zwiększając liczbę symulowanych pokoleń w testowym przebiegu algorytmu zmniejszamy wagę przywiązywaną do szybkości znajdowania minimum lokalnych koncentrując się na ich jakości. Pozwala to na ustalenie żądanych priorytetów pomiędzy szybkością i jakością znajdowanych rozwiązań.

Ponieważ, w algorytmie genetycznym tak jak w ekosystemie istnieją bar- dzo różne i subtelne powiązania pomiędzy jego elementami, wydaję się, iż dobrze byłoby uwzględnienie wyboru operatora krzyżowania od wcześniej dobranych już parametrów mutacji. Druga, bardzo intuicyjna metoda do- boru operatora krzyżowania polega na uruchomieniu wpełni wysterowanego algorytmu genetycznego na pewną liczbę iteracji dla wszystkich testowanych operatorów krzyżowania na pewnej puli przykładów testowych. Taki test jest oczywiście czasochłony i proponuje się wykonanie go jednorazowo dla nowo badanego problemu.

Badania numeryczne

Badaniom podane zostaną następujące operatory krzyżowania: {LX, RX, LRX, MX }. Pierwsze dwa są operatorami jedno-punktowymi, natomiast kolejne dwa to operatory dwu punktowe. Przed szczegółowym opisem po- szczególnych operatorów zdefiniuję najpierw bazowe operacje na ciągach.

(24)

Operator ⊕ łączący dwa ciągi w jeden poprzez ułożeniu kolejno wszystkich elementów ciągu będącego po lewej stronie operatora a następnie wszyst- kich elementów z ciągu będącego po prawej stronie operatora. Operator tworzący ciąg z elementów ciągu będącego po lewej stronie operatora po- mniejszonego o elementy występujące w ciągu po prawej stronie operatora.

Oba z operatorów są lewostronnie łączne oraz posiadają jednakowy prio- rytet kolejności wykonywania działań. Ponadto niech dla dowolnego ciągu X = (x0, x1, . . . , xn) symbol X[j,k), 0 ¬ j ¬ k ¬ n + 1 oznacza ciąg X[j,k) = (xj, xj+1, . . . , xk−1). Oznaczenia rodzicielskich permutacji ładujących to odpowiednio A = (a0, a1, . . . , an−1) oraz B = (b0, b1, . . . , bn−1). Dodatkowo niech j oznacza punkt krzyżowania dla operatorów jedno-punktowych oraz k oznacza drugi punkt krzyżowania dla operatorów dwu-punktowych. Stosując wprowadzoną notację opis testowanych operatorów krzyżowania przedstawić można zwięźle w postaci:

LX(A, B, j) = A[0,j)⊕ (B A[0,j)), (10) lewa część tworzonej permutacji skopiowana jest z rodzica A a pozostałe elementy permutacji ułożone są w kolejności występowania w rodzicu B.

RX(A, B, j) = (B A[j,n)) ⊕ A[j,n), (11) prawa część tworzonej permutacji skopiowana jest z rodzica A a pozostałe elementy permutacji ułożone są w kolejności występowania w rodzicu B.

LRX(A, B, j, k) = A[0,j)⊕ (B A[0,j) A[k,n)) ⊕ A[k,n), (12) lewa oraz prawa część tworzonej permutacji skopiowana jest z rodzica A zaś środek uzupełniany jest brakującymi elementami w kolejności występowania w B.

MX(A, B, j, k) = (B A[j,k))[0,j)⊕ A[j,k)⊕ (B A[j,k))[j,j−k+n), (13) środkowa część tworzonej permutacji skopiowana jest z rodzica A a lewa i prawa strona permutacji uzupełniana jest brakującymi elementami w kolej- ności występowania w rodzicu B.

W tabeli 4 przedstawiono wartości jakości ρ rozwiązań uzyskanych dla przebiegu wstępnego i właściwego. Przebieg wstępny jest próbą oceny przy- datności poszczególnych operatorów krzyżowania natomiast w przebiegu wła- ściwym następuje dokładna weryfikacja tej oceny. Przebieg wstępny uzyski- wany jest poprzez uruchomienie algorytmu genetycznego bez mutacji oraz

(25)

Tabela 4: Ocena operatorów krzyżowania na podstawie ρ [%] z próbnego przebiegu algorytmu bez mutacji oraz jakość ρ [%] algorytmu właściwego

Grupa ρ [%] iter = 10 ρ [%] przebieg właściwy

n × m LX RX M X LRX LX RX M X LRX

10 × 5 6.73 9.20 10.36 10.02 -2.62 -1.11 -0.55 -0.92 15 × 5 13.65 14.49 12.68 12.15 1.54 1.49 3.14 0.84 20 × 5 11.67 12.77 12.44 11.89 -1.85 -0.74 -1.75 -0.14 10 × 10 6.32 6.10 6.20 3.31 -3.82 -3.46 -2.92 -3.81 15 × 10 12.35 13.04 11.97 13.04 2.28 0.09 0.82 1.80 20 × 10 10.29 13.54 10.65 11.55 -1.05 -1.04 -1.14 0.05 30 × 10 5.92 6.24 7.14 7.62 -8.75 -6.06 -6.40 -7.01 15 × 15 12.73 11.38 10.13 13.45 -0.79 -1.98 0.55 -0.78 wszystkie 9.96 10.85 10.20 10.38 -1.88 -1.60 -1.03 -1.25

Tabela 5: Ocena operatorów krzyżowania na podstawie ρ [%] z próbnych przebiegów algorytmu w pełni wysterowanego

Grupa ρ [%] iter = 10 ρ [%] iter = 100

n × m LX RX M X LRX LX RX M X LRX

10 × 5 7.09 6.37 5.96 6.47 -0.29 -0.38 2.60 0.14 15 × 5 13.42 12.93 10.35 11.10 6.33 7.11 5.53 2.90 20 × 5 11.05 9.97 10.12 9.47 3.00 4.94 4.12 2.87 10 × 10 5.81 6.65 3.05 6.48 -0.25 -2.12 -0.60 -1.90 15 × 10 13.13 12.49 12.52 10.84 5.53 6.13 4.49 7.10 20 × 10 11.53 10.49 11.05 10.84 5.36 3.93 3.22 5.23 30 × 10 5.30 4.67 5.15 6.69 -1.81 0.06 -1.44 -0.47 15 × 15 12.19 13.42 10.45 12.42 3.53 3.99 4.42 3.42 wszystkie 9.94 9.62 8.58 9.29 2.67 2.96 2.79 2.41

z bardzo małą liczbą pokoleń 10, natomiast przebieg weryfikujący uzyskany jest poprzez uruchomienie w pełni wysterowanego algorytmu genetycznego z mutacją typu IN S dobieraną automatycznie według strategii SINGLE przy liczbie pokoleń wynoszącej 1000. W tabeli 5 przedstawiono wartości ρ otrzy-

(26)

manych rozwiązań przy pracy algorytmu genetycznego z mutacją opisaną wyżej, dla pierwszych 10 i 100 pokoleń.

Ocena wyników

Z wyników zamieszczonych w tabeli 4, na podstawie wstępnego przebiegu spodziewać się można, iż w badanym problemie najbardziej obiecującym operatorem krzyżowania jest LX. Tezę tę potwierdzają wyniki dalszej część badań, w których to w pełni wysterowany algorytmy genetyczny z wspo- mnianym operatorem LX generuje najlepsze rozwiązania spośród analogicz- nych algorytmów z pozostałymi operatorami. Jednakże kolejne typowania na podstawie przebiegu wstępnego odnośnie pozostałych operatorów nie znala- zły potwierdzenia w teście weryfikującym. Jest to częściowo spowodowane faktem, iż wszystkie testowane operatory są w przybliżeniu jednakowo do- bre w sensie efektywności badanego algorytmu i ostatecznie w dużej mierze przypadek decyduje który z nich jest w danych warunkach lepszy. W celu potwierdzenia tego stwierdzenia dokonałem dodatkowych testów weryfiku- jących z zastosowaniem mutacji na stałym poziomie. Otrzymane wynik (nie zamieszczone w pracy) wykazały inną hierarchię przydatności poszczególnych operatorów co potwierdza słuszność tezy o losowości jakości testowanych ope- ratorów.

Słabość testu oceniającego stosowane operatory krzyżowania nie wynika z jego powieszchowności tylko z faktu, iż testowane operatory są porównyw- lanie dobre i w takim przypadku pozostałe elementy algorytmu genetyczne- go takie jak rodzaj mutacji, liczba osobników w pokoleniu, rodzaj selekcji, ilość symulowanych pokoleń oraz pewna losowść ma decycujący wpływ na względną jakość poszczególnych operatorów krzyżowania. Pojęcie względnej jakości operatorów krzyżowania rozumiana jest tu jako jakość generowanych rozwiązań przez algorytm genetyczny z badanym operatorem krzyżowania względem analogicznej wartości drugiego operatora.

W badanym problemie spośród testowanych operatorów krzyżowania nie można jednoznacznie stwierdzić który z nich należy stosować. Operator krzy- żowania który w pewnych warunkach jest najlepszy z puli dostępnych ope- ratorów, przy zmianie parametrów sterujących algorytmu może okazać się operatorem mniej efektywnym od pozostałych. Przykładem tego są wyniki algorytmu właściwego zamieszczonego w tabeli 4 oraz wyniki przy ograni- czonej liczbie iteracji do 10 i 100 zamieszczone w tabeli 5. Dla liczby itera- cji wynoszącej 10 statystycznie najlepszym operatorem okazał się MX dla

(27)

liczby pokoleń 100 średnio najlepsze wyniki przypadły dla operatora LRX natomiast przy symulacji 1000 pokoleń najlepsze uzyskane rezultaty dotyczą operatora LX.

3.5 Skalowanie wartości funkcji przystosowania

Selekcja naturalna występująca w realnym ekosystemie w pewnym stopniu jest dziełem przypadku jednakże promuje osobniki przystosowane lepiej od innych. Przystosowanie w naturze można interpretować jako sumę elemen- tów mających wpływ na przetrwanie danego osobnika w środowisku a są nimi np. odporność na choroby, umiejętność zdobywania pożywienia, umie- jętność unikania drapieżników i wiele innych. Oczywiste jest, że osobniki lepiej przystosowane mają większą szansę na przetrwanie i wydanie w swoim życiu większej liczby potomków. W algorytmach genetycznych wartość funk- cji przystosowania osobnika oblicza się na podstawie wartości funkcji celu rozwiązania mu odpowiadającego.

Procedurę selekcji można wykonać na wiele sposobów, jednakże najbar- dziej popularną jest metoda używająca odpowiednio wykalibrowanego koła ruletki. Polega ona na przydzieleniu każdemu osobnikowi pewnego wycinka koła o powierzchni proporcjonalnej do wartości funkcji przystosowania tego osobnika w taki sposób aby wszystkie osobniki w pokoleniu wypełniły całą powierzchnię. Następnie losowanie osobnika odbywa się poprzez obrót wir- tualnego wskaźnika o losowy kąt z przedziału [0, 2π) i wybraniu osobnika odpowiadającego fragmencie koła przez niego wskazywanego.

W metodach selekcji często stosuje się pewną funkcję f bezpośrednio przekształcającą wartości funkcji celu rozwiązania w wartość przystosowania danego osobnika. Najczęściej jest to funkcja liniowa postaci f (x) = ax + b.

W pracy [1] potrzeba automatycznego doboru parametrów a i b dla każdego pokolenia wyjaśniona jest w następujący sposób:

Często zdarza się, że na początku przebiegu w populacji występu- je kilku ponad przeciętnych osobników, podczas gdy reszta zalicza się pośredniej kategorii. Gdyby zastosować normalną regułę selek- cji, te ponad przeciętne osobniki uzyskały by znaczący udział w skończonej populacji w ciągu jednego pokolenia, a to jest zjawi- sko niepożądane, główna przyczyna przedwczesnej zbieżności. W późniejszej fazie mamy doczynienia z zupełnie odmiennym pro- blemem. Może się zdarzyć, że pod koniec przebiegu populacja

(28)

zachowała znaczą różnorodność, ale średni wskaźnik przystosowa- nia niewiele odbiega od maksymalnego. Jeśli na to nie zareaguje- my, to osobniki przeciętne i osobniki najlepsze będą otrzymywać prawie tę samą liczbę potomstwa w następnych pokoleniach, co prowadzi zasadę przeżycia najlepiej przystosowanych do poziomu błądzenia przypadkowego wśród przeciętniaków.

Jako antidotum na wyżej opisane dwie niekorzystne sytuacje, proponuje się automatyczny dobór parametrów a i b funkcji f . Proponowany dobór pa- rametrów polega na tym aby wartość średnia favg funkcji przystosowania odpowiadała średniej wartości cavg funkcji celu oraz wartość przystosowania najlepszego osobnika fbest wynosiła Cmult średniej wartości przystosowania,

favg = a · cavg+ b, fbest = a · cbest+ b,

favg = cavg,

fbest = Cmult· favg.

(14)

Zauważmy tu, że z powyższych zależności na podstawie średniej cavg oraz naj- lepszej cbest wartości funkcji celu i przyjętego parametru Cmult można jedno- znacznie wyznaczyć parametry a i b. Niestety skalowanie takie prowadziłoby w niektórych sytuacjach do nadawania ujemnych wartości funkcji przysto- sowania najsłabszym osobnikom (z definicji wartość przystosowania danego osobnika jest liczbą nieujemną). W celu uniknięcia takich sytuacji w pra- cy [1] proponuje się dodatkową modyfikację parametru Cmult w taki sposób aby najmniejsza wartość funkcji przystosowania odpowiadająca najgorszemu rozwiązaniu w pokoleniu wynosiła nie mniej niż 0.

W prezentowanych algorytmach proponuje się trochę inną strategię unik- nięcia ujemnych wartości funkcji przystosowania. Raz wyznaczone w poko- leniu wartości a i b zgodnie wzorami (14) nie ulegają już modyfikacjom, a ewentualne ujemne wartości funkcji przystosowania zamieniane są na war- tość równe 0. Tak więc ostatecznie proponuję zastąpienie liniowej funkcji f funkcją f0 postaci

f0(x) = max{0, ax + b} (15)

gdzie wartości a i b wyznaczone są z zależności 14. Metodę selekcji można re- gulować poprzez zmianę parametru Cmult. Dla parametru Cmult = 1 wszystkie osobniki mają jednakową szansę na ich wylosowanie. Stopniowo zwiększając wartość tego parametru coraz bardziej promuje się osobniki lepsze (lepsze w sensie wartości funkcji celu odpowiadającym im rozwiązaniom).

Cytaty

Powiązane dokumenty

nazwa funkcji – łańcuch zawierający nazwę funkcji (może to być również funkcja zdefiniowana przez użytkownika). x1, x2, ..., xn –

break - kończy wykonywanie najbliższej otaczającej pętli lub instrukcji warunkowej, w której występuje.. Jeśli po końcu przerwanej instrukcji występuje kolejna,

return - kończy wykonywanie funkcji i zwraca sterowanie do funkcji wywołującej (lub do systemu operacyjnego, jeśli kontrola zostanie przeniesiona z funkcji

Pole wektorowe ~ w, kt´ ore jest jednocze´ snie bezwirowe i bez´ zr´ od lowe nazywamy

@private atrybut widoczny jedynie dla metod klasy, która go zadeklarowała. @protected Atrybut widoczny dla metod klasy, która go zadeklarowała, oraz dla klas

@private atrybut widoczny jedynie dla metod klasy, która go zadeklarowała. @protected Atrybut widoczny dla metod klasy, która go zadeklarowała, oraz dla klas

Gdzie n jest jednostkowym wektorem normalnym do powierzchni, a da jest polem nieskończenie małego płata stycznego do tej powierzchni.. Rysunek 2.4.1 a) wektory pola

Na przykład, każda funkcja K ciągła (a nawet tylko mierzalna i ograniczo- na) na kwadracie [0, 1] × [0, 1] definiuje względem miary Lebesgue’a operator całkowy zwarty T K.