You are on page 1of 11

Algorytmy genetyczne

1. Czym są?
Istnieje wiele problemów, dla których nie ma optymalnego, szybkiego rozwiązania. Szukamy
zatem metod i sposobów, aby znaleźć algorytm, który w rozsądnym czasie potrafi znaleźć
rozwiązanie przybliżone (niedalekie od optymalnego). Jedną z możliwości jest zastosowanie
algorytmów probabilistycznych. Jednak i te nie dają stu procentowej pewności, że znajdziemy
rozwiązanie optymalne. Możemy zminimalizować prawdopodobieństwo wystąpienia błędu poprzez
wybranie odpowiednio dużej liczby losowo wybranych „przedstawicieli”. Często jest tak, że
narzucającą się metodą jest znalezienie wszystkich rozwiązań i sprawdzenie, które z nich jest
optymalne. Metoda sprawdza się jednak tylko w przypadku małej liczby możliwości. W innych w
sytuacjach musimy szukać bardziej wyrafinowanych sposobów na znalezienie rozwiązania, które
jeżeli nie będzie optymalne, to chociaż do niego zbliżone. Takie problemy pozwala rozwiązywać
zastosowanie elementów sztucznej inteligencji, między innymi algorytmów genetycznych. Opierają
się one na obserwacji natury i pojęciach takich jak: dziedziczenie genetyczne czy darwinowska
walka o przeżycie.
Opis algorytmów genetycznych opiera się na terminologii zaczerpniętej z genetyki naturalnej:
• rozwiązanie zadania – genotyp, osobnik, chromosom, który zawiera odpowiednie geny
• zbiór pewnych rozwiązań problemu – populacja osobników
• rozwiązanie zbliżone do optymalnego – osobnik, który wykazuje najlepsze cechy w jednym
z kolejnych pokoleń
Algorytmy genetyczne znalazły zastosowanie między innymi w optymalizacji zapytań w
bazach danych, w problemie komiwojażera, w optymalizacji funkcji matematycznych, w
rozgrywaniu gier i innych.

2. Algorytmy genetyczne a inne metody:


Algorytm genetyczny:
• zachowanie całej populacji potencjalnych rozwiązań
• połączenie algorytmów losowych z metodami bezpośredniego wyszukiwania
• potencjalnie dobre rozwiązania w populacji reprodukują się, podczas gdy złe wymierają
Algorytm wzrostu:
• polega na wyborze punktu z otoczenia punktu bieżącego i sprawdzenie jego funkcji celu
(jeżeli wartość jest lepsza, to nowy punkt zastępuje bieżący, jeżeli nie, to wybiera się nowy
punkt i porównuje z bieżącym. Algorytm jest wykonywany do momentu, gdy nie następuje
już poprawa)
• prowadzi najczęściej do lokalnych rozwiązań optymalnych
• rozwiązanie zależy od wyboru punktu startowego
• w celu zwiększenia szansy na znalezienie optymalnego rozwiązania wybiera się kilka
punktów startowych
Algorytm symulowanego wyżarzania:
• eliminuje niektóre wady algorytmu wzrostu
• wprowadzone zostaje prawdopodobieństwo akceptacji nowego punktu
• rozwiązanie nie zależy od wyboru punktu startowego
• prawdopodobieństwo jest zależne od wartości funkcji celu dla bieżącego i nowego punktu
oraz wartości parametru T (temperatury)
• im mniejsza temperatura tym mniejsza szansa na zaakceptowanie nowego punktu
• temperatura jest ciągle obniżana (algorytm kończy pracę, gdy jest na tyle niska, że wybór
nowego punktu jest prawie niemożliwy)

1. Opis działania poszczególnych algorytmów (na przykładzie) w


celu pokazania wyższości algorytmów genetycznych:
Rozpatrzymy funkcję f (v )=∣11×one (v )−150∣ , gdzie one(v) oznacza liczbę jedynek w
łańcuchu binarnym „v”. Jest to prosta funkcja liniowa, którą wykorzystamy do pokazania różnic
między wymienionymi metodami. Ustalamy, że długość „v” wynosi 30, co oznacza, że wektory „v”
są łańcuchami 0, 1 o długości 30. One(v) zmienia się zatem od 0 do 30 i taka jest dziedzina tej
funkcji, której wykres przedstawiam poniżej:
200
180
160
140
120
100
80
60
40
20
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Jak łatwo można zauważyć funkcja ma globalne minimum w punkcie 14 (to jest dla wektora o 14
jedynkach), lokalne maksimum w punkcie 0 oraz globalne maksimum w punkcie 30.

2. Działanie algorytmu wzrostu MAX:


• t=0
• local
• while (t < MAX)
◦ local = false
◦ wybór losowego łańcucha bieżącego Vc
◦ ocena wybranego łańcucha
◦ do
▪ wybierz 30 łańcuchów z otoczenia Vc poprzez wymianę pojedynczych bitów w Vc
▪ wybierz łańcuch Vn spośród nowych łańcuchów, dla którego funkcja celu przyjmuje
największą wartość
▪ if(f(Vc) < f(Vn))
• Vc = Vn
▪ else local = true
◦ while (local == true)
◦ t++
Spróbujmy rozważyć ten algorytm, jeżeli punktem startowym będzie łańcuch o 13 jedynkach.
Śledząc kolejne instrukcje w algorytmie można dostrzec zbieżność do lokalnego rozwiązania (a co
za tym idzie ucieczkę od rozwiązania optymalnego). Zatem w przypadku algorytmów wzrostu
istnieje szansa, że nasze kroki będą prowadziły w zupełnie niewłaściwym kierunku. Gdyby funkcja
miała więcej maksimów lokalnych, byłoby jeszcze trudniej wybrać chromosom początkowy, który
poprowadziłby nas do globalnego, optymalnego rozwiązania.
3. Działanie algorytmu symulowanego wyżarzania:
• t=0
• początkowa temperatura T
• losowe wybranie bieżącego łańcucha Vc
• ocenianie Vc
• while(KRYTERIUM_STOPU)
◦ while(warunek zakończenia)
▪ wybierz łańcuch Vn z otoczenia Vc, który będzie utworzony poprzez zmianę
losowego bitu w Vc
▪ if(f(Vc) < f(Vn))
• Vc = Vn
V c −V n
▪ else if(RANDOM[0, 1) < e T )
• Vc = Vn
◦ T = g(T,t) – funkcja (malejąca) zależna od poprzedniej temperatury i iteracji
◦ t++
W tym przypadku jest już większa szansa na to, że rozwiązania będą się zbiegać do
optymalnego wyniku. Jest to możliwe, ponieważ wprowadziliśmy funkcję RANDOM, która losuje
liczbę z danego przedziału. Zatem, gdybyśmy wybrali punkt startowy tak jak w metodzie algorytmu
wzrostu i ustalili temperaturę T na 20, to szansa wyboru łańcucha z większą liczbą jedynek (to
znaczy łańcucha, który jest bliżej optymalnego rozwiązania) będzie większa niż 50%.
Algorytm genetyczny radzi sobie w tej sytuacji, ponieważ z dwóch słabych osobników, może
powstać potomek, który znacznie zbliży się do optymalnego rozwiązania. Pozwala na to
zachowanie całej populacji rozwiązań.

4. Struktura prostego algorytmu genetycznego:


• algorytm w każdej iteracji zachowuje populację potencjalnych rozwiązań w postaci zbioru
chromosomów (łańcuchów, osobników, wektorów): P(t) = {x1t, x2t,, … , xnt}
• każde rozwiązanie xit z populacji P(t) jest oceniane pod względem „dopasowania”
(sprawdzana jest wartość funkcji celu dla danego rozwiązania)
• w kolejnej iteracji formuje się nową populację osobników lepiej dopasowanych, w której
niektóre chromosomy powstają z poprzednich (rodziców) poprzez działanie krzyżowania
lub też poprzez mutacje
◦ krzyżowanie polega na wymianie odcinków chromosomów rodziców, przez co potomek
zachowuje cechy przodka
◦ mutacja polega na losowej zmianie jednego lub więcej genów w chromosomie
(wprowadzenie dodatkowej zmienności w populacji)

5. Podstawowe elementy algorytmu genetycznego:


1. podstawowa reprezentacja potencjalnych rozwiązań zadania
2. sposób tworzenia początkowej populacji potencjalnych rozwiązań
3. funkcja celu (oceny), która pełni rolę środowiska i sprawdza rozwiązania pod kątem
„dopasowania”
4. podstawowe operatory, które wpływają na kolejne pokolenie (krzyżowanie, mutacja,
inwersja)
5. wartości różnych parametrów używanych w algorytmie genetycznym (wielkość populacji,
wiek, prawdopodobieństwa użycia operatorów genetycznych)
3. Dlaczego algorytmy genetyczne działają?

1. Schematy
Ogólne informacje o schematach:
• Schemat to łańcuch, w którym geny mogą być reprezentowane przez „*”. Oznacza ona, że
nieistotne jest to, co w tym miejscu się znajduje. Aby łańcuch pasował do schematu, musi
się z nim zgadzać na wszystkich miejscach poza tymi, które są zaznaczone symbolem
gwiazdki. Przykłady:
◦ (10101011) – do tego schematu pasuje tylko jeden łańcuch (odpowiadający schematowi)
◦ (*0101001) – do tego schematu pasują łańcuchy (10101001) oraz (00101001)
• Liczbę łańcuchów pasujących do danego schematu o „m” pozycjach z gwiazdkami
obliczamy poprzez wzór: 2 m
• Dla danego łańcucha o długości „m” możemy stworzyć 2 m różnych schematów
• Wszystkich schematów dla łańcucha długości „m” jest 3m
• W populacji o liczebności „n” może być reprezentowanych od 2 m do n×2 m różnych
schematów

2. Właściwości schematów:
• rząd schematu (liczba 0 lub 1 w łańcuchu; inaczej długość bez liczby pozycji nieistotnych
(gwiazdek)), używany do obliczenia prawdopodobieństwa przeżycia schematu po mutacji
◦ (01011) – rząd (oznaczenie O) = 5
◦ (**1011*) - rząd (oznaczenie O) = 4
• długość definiująca (odległość między pierwszą a ostatnią ustaloną pozycją w schemacie;
ustalona pozycja to ta, która nie zawiera gwiazdki), używana do obliczenia
prawdopodobieństwa przeżycia schematu po krzyżowaniu
◦ (***0101*01) – długość definiująca (oznaczenie ∂) = 10 – 4 = 6
◦ (*1010*11**) - ∂ = 7 – 2 = 5
• średnie dopasowanie schematu w chwili „t” eval(t) – jest to średnia arytmetyczna
wszystkich łańcuchów z populacji pasujących do schematu w danej chwili „t”
Jak już wcześniej wspominaliśmy podstawowa struktura algorytmu genetycznego ma
następującą postać:
• t++
• wybierz P(t) z P(t – 1)
• zastosuj operatory mieszania do P(t)
• oceń P(t)
Zastanówmy się teraz, jaki wpływ mają poszczególne etapy na żywotność schematów. Przez
ζ(t) oznaczymy liczbę łańcuchów pasujących do schematu w iteracji „t”. Niech popSize będzie
liczbą osobników w populacji. Chcemy obliczyć prawdopodobieństwo, że dany schemat pojawi się
wśród nowych potomków po wykonaniu wyszczególnionych kroków. Zajmijmy się kolejnymi
instrukcjami w punktach:
• t++ - tylko zwiększa licznik i nie ma wpływu na żywotność schematu
• selekcja:
eval (v i )
◦ prawdopodobieństwo wybrania łańcucha „i” jest równe p i= , gdzie
F (t)
popSize
F (t)= ∑ eval (v i) jest średnim dopasowaniem populacji w iteracji „t”, zaś
1
eval ( vi ) jest dopasowaniem wektora vi
ζ (t )×eval (t)× popSize
◦ spodziewamy się zatem, że ζ(t + 1) = , co po podstawieniu
F (t)
ζ (t )×eval (t )
̄ (t)= F (t) daje nam wzór: ζ(t + 1) =
F
popSize ̄ (t)
F
◦ innymi słowy liczba łańcuchów pasujących do danego schematu jest proporcjonalna do
stosunku średniego dopasowania schematu do średniego dopasowania populacji.
Oznacza to, że schemat, który będzie oceniany powyżej średniej (to jest stosunek
eval (t )
̄ (t) będzie większy od jedynki) uzyska więcej łańcuchów, które do niego pasują
F
w następnej populacji. Analogiczne rozumowanie doprowadza nas do wniosków
dotyczących przypadku, gdy schemat jest oceniany poniżej średniej. Wtedy liczba
pasujących do niego łańcuchów zmaleje w kolejnym pokoleniu
◦ załóżmy teraz, że schemat ma dopasowanie większe od średniego dopasowania
̄
populacji o ε%, to jest: eval(t) = F ̄ (t)+ ε× F (t) wtedy z powyższego równania
100
możemy wyciągnąć długoterminowe wnioski, które doprowadzają nas do nowej postaci
równania: ζ(t) = ζ (0)×(1+ ε)t
◦ otrzymane równanie nazwiemy równaniem wzrostu schematu. Możemy teraz
powiedzieć, że w każdym kolejnym pokoleniu przybędzie łańcuchów, które pasują do
schematu ocenianego powyżej średniej
• krzyżowanie:
◦ długość definiująca ma duży wpływ na prawdopodobieństwo przetrwania lub
zniszczenia schematu podczas krzyżowania. Ponieważ w łańcuchu „m” elementowym
możemy wybrać punkt cięcia na „m – 1” możliwych sposobów, to naturalne wydaje się
ustalenie prawdopodobieństwa zniszczenia schematu w następujący sposób:

pd= , gdzie ∂ jest wspomnianą wcześniej długością definiującą danego
m−1
schematu. Idąc dalej możemy z łatwością obliczyć prawdopodobieństwo przetrwania

schematu: p s =1−
m−1
◦ warto jednak zwrócić uwagę na fakt, że nie wszystkie chromosomy ulegną
krzyżowaniu. Prawdopodobieństwo wyboru osobnika do krzyżowania wynosi pc,
∂× p c
zatem nowe ps wynosi: p s =1−
m−1
◦ należy jednak zwrócić uwagę także na fakt, że schemat może przetrwać nawet wtedy,
gdy punkt cięcia został wybrany w nieodpowiednim miejscu. Rozważmy następujący
przykład i poprawmy wzór na prawdopodobieństwo przetrwania schematu w danej
populacji:
▪ Niech dany będzie schemat S = (11******10) oraz dwa pasujące do niego łańcuchy
S1 = (1111111110) oraz S2 = (1100000010). Wybieramy punkt cięcia „c” = 4. Przy
takim wyborze i takich specyficznych łańcuchach cięcie nie prowadzi do destrukcji
schematu, ponieważ oba chromosomy mają takie same końcówki
∂× p c
◦ poprawiony wzór wygląda następująco: p s ⩾ 1−
m−1
◦ otrzymaliśmy zatem zmodyfikowany wzór na liczbę pasujących do schematu łańcuchów
w kolejnej populacji z uwzględnieniem selekcji oraz krzyżowania ζ(t + 1) =
ζ (t )×eval (t) ∂× pc
ζ (t+ 1)⩾ ×(1− )
̄ ( t)
F m−1
◦ z równania wynika, że schemat, który będzie oceniany powyżej średniej oraz będzie
miał mała długość definiującą, będzie miał coraz więcej przedstawicieli w kolejnych
populacjach.
• Mutacja:
◦ jak wiemy z poprzednich rozważań mutacja to zmiana losowo wybranego bitu w
łańcuchu. Może się zdarzyć, że łańcuch ulegnie mutacji więcej niż raz. Istnieje wtedy
możliwość zmiany więcej niż jednego bitu, co zwiększa szansę na zniszczenie schematu
(zmiana choć jednego ustalonego, „ważnego” bitu schematu zniszczy go).
◦ oczywiście liczba „ważnych” bitów w danym schemacie jest określona za pomocą
rzędu schematu
◦ prawdopodobieństwo zmiany pojedynczego bitu jest równe pm, zatem 1 – pm jest równe
prawdopodobieństwu przeżycia danego bitu. Aby schemat przeżył mutację, to O
(oznaczenie rzędu) bitów musi zostać niezmienionych. Zatem prawdopodobieństwo
przeżycia schematu wynosi: p s =(1− p m)O ≈O× p m
◦ ostatnia już modyfikacja wzoru na liczbę łańcuchów pasujących do danego schematu w
kolejnej populacji daje nam w rezultacie postać:
ζ (t )×eval (t) ∂× pc
ζ (t+ 1)⩾ ×(1− −O× p m)
̄ ( t)
F m−1
Z powyższego wzoru i naszych rozważań wynika następujące twierdzenie:
Krótkie, niskiego rzędu i oceniane wyżej niż przeciętnie schematy uzyskują wykładniczo
rosnącą liczbę łańcuchów w kolejnych pokoleniach.

4. Metody próbkowania, czyli próba znalezienia złotego środka między naporem


selekcyjnym a różnorodnością populacji.
Nie trudno jest zauważyć, że napór selekcyjny wpływa na szybkość wykonywania się algorytmu.
Wtedy duży nacisk kładziony jest na wybór super osobników, przez to szybko zmniejsza się
różnorodność populacji. Istnieje wtedy ryzyko, że otrzymamy rozwiązanie sub-optymalne
(zjawisko zawodu), ponieważ dane mocne osobniki mogły źle ukierunkować rozwój populacji. Z
drugiej jednak strony, gdybyśmy chcieli rozpatrywać większą populację z większą liczbą
różnorodnych osobników i zastosować powolny proces ewolucji, rozwiązanie mogłoby zostać
znalezione w nierozsądnym czasie, a komputer wykorzystywałby ogromne ilości swoich zasobów.
Ważne jest zatem, aby znaleźć punkt pośredni między tymi pojęciami. Metody próbkowania
podają sposoby, jak można podejść do tego typu problemów.

1. Odmiany selekcji:
• model elitarny – w tym modelu kładzie się duży nacisk na utrzymanie najlepszych
chromosomów
• model wartości oczekiwanej – za każdym razem, gdy chromosom jest wybierany do
reprodukcji zmniejszane jest prawdopodobieństwo wybrania go po raz kolejny w tej samej
iteracji w celu rozmnożenia. Kiedy prawdopodobieństwo spadnie poniżej zera, to
chromosom jest pomijany przy selekcji
• elitarny model wartości oczekiwanej – połączenie modelu elitarnego i modelu wartości
oczekiwanej
• model ze współczynnikiem zatłoczenia – nowo wygenerowany chromosom wymienia
starego, a ten z kolei jest wybierany z tych, które są podobne do nowego
• model oparty na wprowadzeniu sztucznych wag – opiera się na założeniu, że super
osobniki nie pozwalają rozmnażać się słabszym, co prowadzi czasami do rozwiązania
lokalnie optymalnego i utraty wartościowego materiału genetycznego
• model z selekcją turniejową – ustala się „k” ( zwykle „k” = 2) elementowe zbiory
osobników z danej populacji. Następnie z danego zbioru wyłania się najlepszego osobnika i
dołącza do nowego pokolenia. Procedurę tą wykonuje się popSize razy. Wybór większego
„k” wpływa na zwiększenie naporu selekcyjnego

5. Zmodyfikowany algorytm genetyczny:

1. Opis działania:
• t=0
• wybierz populację P(t)
• oceń P(t)
• while(not WARUNEK_ZAKOŃCZENIA)
◦ t++
◦ wybierz „r” rodziców z P(t). Każdy z wybranych chromosomów jest przeznaczony do
jednej z operacji genetycznych (krzyżowanie, mutacja lub inwersja (losowy wybór
odcinka w chromosomie i odwrócenie kolejności bitów w wybranym fragmencie))
◦ wybierz popSize - „r”osobników z P(t) i przekopiuj je do P(t + 1)
◦ niech „r” chromosomów „rodziców” stworzy „r” potomków i dodaj je do populacji P(t
+ 1)
◦ oceń P(t)

2. Porównanie algorytmu klasycznego ze zmodyfikowanym:


Genetyczny algorytm klasyczny Genetyczny algorytm zmodyfikowany
Może generować wielokrotne kopie takich Wrażliwy na generowanie wielokrotnych kopii
samych chromosomów w kolejnych populacjach chromosomów w kolejnych populacjach

6. Algorytmy genetyczne ze zmienną liczebnością populacji:


Liczebność populacji jest bardzo ważnym parametrem, który najczęściej jest podawany przez
użytkownika. To właśnie od niego zależy napór selekcyjny oraz różnorodność populacji. Musimy
mieć na uwadze fakt, że wybranie odpowiedniej liczby osobników do populacji początkowej jest
bardzo ważne dla znalezienia poprawnego rozwiązania. Wyznaczenie zbyt dużej populacji może
niepotrzebnie wydłużyć czas oczekiwania na wyniki i zużywać zbyt duże zasobów komputerowych,
które są przecież ograniczone. Z drugiej jednak strony, wybranie zbyt małej populacji wpłynie na
różnorodność osobników i za szybkie zbieganie do rozwiązania, być może optymalnego tylko
lokalnie. Widzimy zatem, że odpowiednia liczba osobników w populacji ma bardzo duże znaczenie.
Postanowiono więc spróbować wprowadzenia zmiennej liczby chromosomów. Ta część pracy
będzie poświęcona właśnie temu zagadnieniu.
W odróżnieniu od poprzednich algorytmów genetycznych, proces selekcji zastąpiony zostaje
poprzez wiek chromosomów, który jest równoważny z liczbą lat, przez które chromosom pozostaje
żywy. Wiek ustalany jest w zależności od stopnia dopasowania danego osobnika i wpływa na
liczebność populacji. Takie podejście wydaje się być bardziej bliskie rozwiązaniu jakie występuje w
środowisku naturalnym. W końcu w przyrodzie organizmy giną i rodzą się, co wpływa na
liczebność populacji. Podstawą takiego podejścia jest także próba optymalizacji liczebności danej
populacji i założenie, że liczba osobników może mieć inną optymalną wartość w zależności od
aktualnej iteracji algorytmu.
W kolejnej chwili „t + 1” tworzy się nową (pomocniczą) populację z P(t) o liczebności
proporcjonalnej do popSize. Liczbę chromosomów w pomocniczej populacji będziemy oznaczać
przez auxPopSize: auxPopSize= popSize× p , gdzie „p” nazywane jest współczynnikiem
reprodukcji. Każdy chromosom może zostać wybrany z jednakowym prawdopodobieństwem do
populacji pomocniczej (reprodukcji). Prawdopodobieństwo nie jest zależne od dopasowania
danego chromosomu. Jak widzimy nie występuje tutaj normalny proces selekcji. Wprowadzamy
natomiast wiek osobnika i parametr długości życia.

1. Struktura algorytmu genetycznego ze zmienną liczebnością


populacji:
• t=0
• wybierz początkową populację P(t)
• oceń P(t)
• while (not WARUNEK_ZAKOŃCZENIA)
◦ t++
◦ podnieś wiek każdego osobnika o 1
◦ wykonaj operacje rekombinacji na P(t)
◦ oceń P(t)
◦ usuń z P(t) wszystkie osobniki o wieku większym niż ich czas życia
Każdemu chromosomowi przydzielany jest czas życia w procesie oceny. Jest to działanie
jednorazowe. Raz przydzielony okres egzystowania pozostaje niezmieniony dopóki dany
chromosom nie zostanie usunięty po „zestarzeniu się”. Inaczej rzecz biorąc chromosom będzie
utrzymywany w populacji do chwili, gdy jego wiek przekroczy ustawioną na początku długość
życia (liczbę iteracji, które chromosom przeżywa). Liczebność populacji po iteracji wynosi zatem:
popSize (t+ 1)= popSize( t)+ auxPopSize−D( t) , gdzie D(t) jest liczba chromosomów, które
wyginęły w pokoleniu „t”.
Ustawienie czasu życia dla danego chromosomu wymaga pewnych obliczeń i obserwacji jak
dany sposób wpływa na działanie algorytmu. Oczekujemy jednak, aby obliczenia prowadziły nas do
następujących wydarzeń:
• wzmacnianie osobników z wyższym niż średnie dopasowaniem i osłabianie osobników z
mniejszym niż średnie dopasowaniem
• dostrajanie liczebności populacji w zależności od danej iteracji (w szczególności
pilnowanie, aby populacja nie rozrastała się ciągle w zawrotnym tempie)
Osobnik, który ma dopasowanie powyżej przeciętnego powinien otrzymać dłuższy czas życia
i tym samym zostać dłużej w populacji. Należy również zwrócić uwagę na złożoność obliczeniową
przy ustalaniu czasu życia. Nie powinny one zbytnio obciążać zasobów komputera.
Przyporządkowanie czasu życia może się odbywać między innym na podstawie jednej z
poniższych metod:
n× fitness[i ]
• przyporządkowanie proporcjonalne: min (MinLT + , MaxLT )
AvgFit
◦ MinLT (minimal lifetime) – minimalna długość życia
◦ MaxLT (maximal lifetime) - maksymalna długość życia
◦ AvgFit - przeciętne dopasowanie w danej populacji
◦ Fitness[i] - dopasowanie i-tego osobnika
1
◦ n= ( MaxLT −MinLT )
2
◦ wada: nie korzystamy z informacji dotyczącej najlepszego dopasowania znalezionego
do tej pory
2×n×( fitness [i ]−absFitMin)
• przyporządkowanie liniowe: MinLT −
( absFitMax−absFitMin)
◦ absFitMin – najmniejsze dopasowanie znalezione do tej pory
◦ absFitMax – największe dopasowanie znalezione do tej pory
◦ wada: w przypadku, gdy istnieje dużo osobników o zbliżonym dopasowaniu do
najlepszego obliczane są duże czasy życia, co prowadzi do powiększania się populacji
n×( fitness[i]−MinFit)
• przyporządkowanie biliniowe: MinLT −
( avgFit−minFit)

7. Rozszerzenie operatorów genetycznych:


• krzyżowanie wielopunktowe (pozwala na zachowanie pewnych schematów, których nie
jest w stanie zachować operator jednopunktowy)
• krzyżowanie odcinkowe – opiera się na prawdopodobieństwie, że odcinek zakończy się w
danym bicie chromosomu (liczba cięć jest zmienna)
• krzyżowanie tasowe:
◦ losowe ustawienie miejsc bitów w dwóch dobranych łańcuchach
◦ wymiana odcinków między punktami cięć
◦ przywracanie miejsc bitów w łańcuchach
• krzyżowanie jednorodne – otrzymuje się dwóch potomków (pierwszy potomek otrzymuje
bity od jednego z rodziców w zależności od prawdopodobieństwa, drugi potomek otrzymuje
bit od pozostałego rodzica)
◦ V1 = (00100001101001), V2 = (1110110001000)
◦ z powyższych rodziców możemy otrzymać następujących potomków przy
prawdopodobieństwie 0,5: V1' = (001011010100), V2' = (1110001001001)
• Rekombinacja puli genów – dopuszcza się tak zwane orgie (potomek może powstać z
wielu rodziców poprzez wybranie losowo genów z puli genów wybranych rodziców)
Eksperymenty wykazały, że wybór operatora zależy od konkretnego zadania i nie można dać
jednoznacznej odpowiedzi, który z nich jest najlepszy.

8. Nieporządny algorytm genetyczny:


• każdy bit jest oznaczony numerem (nazwą): (numer pozycji, wartość bitu)
• łańcuchy nie muszą mieć kompletu genów i mogą być różnej długości:
◦ V1 = ((7, 1), (1, 0))
◦ V2 = ((3, 1), (9, 0), (3, 1), (3, 1), (3, 1))
• nadmiarowość – zachodzi, gdy na danej pozycji znajduje się kilka bitów
• niedookreślenie – jeżeli założymy, że łańcuch powinien mieć 10 bitów, to podane
przykłady chromosomów V są niedookreślone
• stosowanie innych niż dotychczas operatorów:
◦ łączenie – łączone są dwa chromosomy z pewnym prawdopodobieństwem (połączenie
V1 z V2 da nam w rezultacie: ((7, 1), (1, 0), (3, 1), (9, 0), (3, 1), (3, 1), (3, 1)))
◦ cięcie – rozcinamy dany łańcuch na pewnej pozycji tworząc dwa nowe łańcuchy
◦ operator mutacji nie ulega zmianie
• zamiast zwykłego procesu selekcji używana jest selekcja turniejowa

9. Optymalizacja funkcji za pomocą algorytmu genetycznego:


W tym rozdziale chcę się zająć konkretną funkcją i sprawdzić, jak poradzi sobie algorytm
genetyczny z wyszukaniem maksimum tej funkcji w przedziale domkniętym. We wstępie
obliczymy drogą analityczną wszystkie ekstrema funkcji, znajdziemy maksimum lokalne, a
następnie porównamy wyniki, które otrzymaliśmy po uruchomieniu algorytmu genetycznego
zmodyfikowanego oraz algorytmu ze zmienną liczebnością populacji. Zacznijmy od obliczeń.
Niech będzie dana funkcja f ( x )=sin(10x)+ 5x określona w przedziale domkniętym [0,2].
Obliczymy pochodną tej funkcji w celu znalezienia wszystkich ekstremów:
f ' ( x)=10cos (10x)+ 5
Obliczamy miejsca zerowe pochodnej:
10cos(10x )+ 5=0
1
cos (10x)=−
2
2∏ 4∏
10x= + 2k ∏ lub 10x= + 2k ∏
3 3
2∏ k ∏ 4∏ k ∏
x= + lub x= +
30 5 30 5
Ponieważ „x” może być z przedziału domkniętego [0,2], to:
0⩾ x⩾2
2∏ k ∏ 4∏ k ∏
0⩾ + ⩾2 lub 0⩾ + ⩾2
30 5 30 5
2 k 4 k
0⩾∏ ( + )⩾2 lub 0⩾∏ ( + )⩾2
30 5 30 5
Wyliczamy w obu przypadkach „k”:
1 10 1 2 10 2
− ⩾k ⩾ − lub − ⩾k ⩾ −
3 ∏ 3 3 ∏ 3
Po podstawieniu za ∏ wartości przybliżonej 3,14 otrzymujemy:
−0,3⩾k⩾2,85 lub −0,6⩾k ⩾2,52
Oczywiście „k” jest liczbą całkowitą zatem:
0⩾k ⩾2 dla obu przypadków. Dostajemy zatem 6 różnych rozwiązań w danym przedziale:
x 1≈0,209 , x 2≈0,837 , x 3≈1,465 , x 4≈0,419 , x 5≈1,047 , x 6≈1,675
Obliczamy drugą pochodną, aby sprawdzić, w których punktach jest maksimum (minima nas
nie interesują, ponieważ szukamy maksimum globalnego):

Ponieważ interesuje nas tylko znak drugiej pochodnej (f''(x) < 0 oznacza maksimum)
pozwolimy sobie na przybliżenia:
f ' ' (x 1 )= f ' ' (0,209)=−100sin(2,09)≈−100×0.909⩾0 maksimum
f ' ' (x 2)= f ' ' (0,837)=−100sin (8,37)≈−100×0.989⩾0 maksimum
f ' ' ( x 3 )= f ' ' (1,465)=−100sin(14,65)≈−100×0.990⩾0 maksimum
f ' ' (x 4)= f ' ' (0,419)=−100sin (4,19)≈−100×−0.757⩾ 0 minimum
f ' ' ( x 5 )= f ' ' (1,047)=−100sin(10,47)≈−100×−0.544⩾ 0 minimum
f ' ' ( x 6 )= f ' ' (1,675)=−100sin(16,75)≈−100×−0.288⩾0 minimum
Musimy także wyliczyć wartości funkcji na krańcach przedziału oraz w punktach maksimów
(które kandydują do stanowiska globalnego maksimum):
f ( x 1 )=sin(2,09)+ 5×0,209≈0,909+ 1,045=1,954
f ( x 2 )=sin (8,37)+ 5×0,837≈0,989+ 4,185=5,184
f ( x 3 )=sin(14,65)+ 5×1,465≈0,990+ 7,325=8,315
f ( x l )=sin (0)+ 5×0≈0+ 0=0 Wartość w lewym punkcie brzegowym
f ( x p)=sin (2)+ 5×2≈0,909+ 10=10,909 Wartość w prawym punkcie brzegowym
Z powyższych obliczeń wynika, że maksimum globalne funkcja osiąga w punkcie
brzegowym „x” = 2, które wynosi około 10,909.
Bardzo łatwo można by było znaleźć maksimum patrząc na wykres funkcji. Skoro
znaleźliśmy drogą analityczną maksimum lokalne, czas aby algorytm genetyczny pokazał na co go
stać. Poniżej przedstawiam wyniki, które otrzymałem w wyniku uruchomienia algorytmu ze
zmienną liczebnością populacji i algorytmu zmodyfikowanego.

You might also like