440 likes | 637 Views
Systemy Wspomagania Decyzji. Algorytmy genetyczne i ewolucyjne (c.d.). Przykład. Kolejny przykład to ewoluowanie chromosomów tak, aby zwiększała się liczba jedynek.
E N D
Systemy Wspomagania Decyzji Algorytmy genetyczne i ewolucyjne (c.d.)
Przykład Kolejny przykład to ewoluowanie chromosomów tak, aby zwiększała się liczba jedynek. Oznacza to, że funkcja przystosowania dla chromosomu jest obliczana jako liczba wszystkich jedynek, które występują w tym chromosomie. Na przykład jeżeli ch=[101001100], to f(ch)=4. Przykład ten ma pokazać, że jeżeli wylosujemy jakąś pulę chromosomów, a funkcja przystosowania jest określona jako liczba jedynek (genów o wartości 1) w chromosomie, to w kolejnych iteracjach statystycznie średnia liczba jedynek powinna rosnąć (ściślej: nie powinna maleć).
Przeprowadzimy symulację dla następujących parametrów krzyżowania i mutacji: pk=0,75; pm=0,02. Załóżmy, że chromosomy składają się z 9 genów, a wielkość populacji wynosi 8 chromosomów. Na przykład, wylosowana początkowa pula (populacja) jest następująca: ch1=[100111001], ch2=[001011000], ch3=[010100110], ch4=[101011110], ch5=[110100010], ch6=[100101001], ch7=[010011011], ch8=[001010011]. Wartości funkcji przystosowania wynoszą f(ch1)=5, f(ch2)=3, f(ch3)=4, f(ch4)=6, f(ch5)=4, f(ch6)=4, f(ch7)=5, f(ch8)=4. Średnia wartość funkcji przystosowania dla tej populacji wynosi 4,375.
Obliczamy procentowe wagi dla każdego chromosomu w początkowej populacji (będzie to potrzebne do metody koła ruletki):
Poniżej pokazane są te same wartości co na poprzednim slajdzie, ale tym razem przedstawione w formie wykresu kołowego. Losowanie można sobie wyobrazić jako przypadkowy wybór dowolnego punktu w kole. Potem sprawdzamy do którego sektora wpadliśmy – to daje wybór (selekcję) chromosomu do ewentualnego krzyżowania w następnym etapie.
Selekcja (wybór) Dokonujemy teraz losowania 8 liczb z przedziału „procentowego” [0, 100]. Dzięki temu wybierzemy chromosomy do potencjalnego krzyżowania. Załóżmy, że wylosowano następujące liczby: 67 7 84 50 68 38 83 11 Zatem selekcja jest następująca: ch6 ch1 ch7 ch4 ch6 ch4 ch7 ch1 Będziemy je krzyżowali parami: (ch6 ch1) (ch7 ch4) (ch6 ch4) (ch7 ch1)
Krzyżowanie Wybraliśmy już pary do potencjalnego krzyżowania. To czy faktycznie dojdzie do krzyżowania (czyli „rozmnażania” z przekazaniem części genów) zależy jeszcze od dodatkowego czynnika losowego – określonego przez prawdopodobieństwo krzyżowania pk. W przykładzie założyliśmy, że pk=0,75. Mamy cztery potencjalne pary do krzyżowania: (ch6 ch1) (ch7 ch4) (ch6 ch4) (ch7 ch1) Więc losujemy cztery liczby z przedziału [0, 1]. Używając funkcji LOS() w Excelu otrzymano: 0,44 0,33 0,29 0,68 Następnie porównujemy z pk. Jeżeli wartość jest mniejsza od pk, to dana para się krzyżuje. W tym przypadku wszystkie pary będą się krzyżowały: (ch6 ch1) (ch7 ch4) (ch6 ch4) (ch7 ch1)
Krzyżowanie (c.d.) Zastosujemy najprostszy sposób krzyżowania – krzyżowanie jednopunktowe. Dla każdej pary losujemy punkt krzyżowania. Ponieważ nasze chromosomy mają po 9 bitów (genów), więc potencjalnych punktów krzyżowania jest 8. Dlatego dla każdej pary losujemy jedną liczbę lk ze zbioru {1,2,3,4,5,6,7,8}. Powiedzmy, że wylosowaliśmy następujące punkty krzyżowania: lk: 4, 7, 3, 5. Krzyżowanie oznacza wymianę odpowiedniej porcji genów. Na przykład dla pierwszej pary mamy ch6=[100101001] ch1=[100111001] lk=4 Ch6=[100111001] Ch1=[100101001] krzyżowanie
Przeprowadzając analogiczną operację z pozostałymi parami (punkty krzyżowania 7, 3, 5) otrzymujemy następujący stan populacji: Ch1=[100111001], Ch2=[100101001], Ch3=[010011010], Ch4=[101011111], Ch5=[100011110], Ch6=[101101001], Ch7=[010011001], Ch8=[100111011]. Kolejnym krokiem jest przeprowadzenie ewentualnych mutacji, zależnych od prawdopodobieństwa mutacji pm.
Mutacja Po krzyżowaniu osobniki (chromosomy) mogą jeszcze podlegać mutacji. W najprostszym przypadku mutacja oznacza zmianę pojedynczego bitu: 10 lub 01. Ponieważ mutacje są rzadszym zjawiskiem niż krzyżowanie, zatem prawdopodobieństwo jest na ogół małe. Tutaj przyjęliśmy pm=0,02. Bierzemy kolejne chromosomy i dla każdego bitu (genu) losujemy liczbę z przedziału [0, 1]. Jeżeli jest ona mniejszapm, to dany bit (gen) podlega mutacji. Oto przykładowa symulacja (tylko dwa geny zostały zmutowane w całej populacji): 0,45 0,52 0,89 0,02 0,67 0,01 0,28 0,51 Ch1=[100111001], Ch2=[100101001], Ch3=[010011010], Ch4=[111011111], Ch5=[100011110], Ch6=[101101101], Ch7=[010011001], Ch8=[100111011],
Obliczamy ponownie funkcje przystosowania dla poszczególnych osobników oraz średnią dla całej (nowej) populacji: Ch1=[100111001], Ch2=[100101001], Ch3=[010011010], Ch4=[111011111], Ch5=[100011110], Ch6=[101101101], Ch7=[010011001], Ch8=[100111011], f(Ch1)=5, f(Ch2)=4, f(Ch3)=4, f(Ch4)=8, f(Ch5)=5, f(Ch6)=6, f(Ch7)=4, f(Ch8)=6. Średnia wartość funkcji przystosowania wynosi teraz: 5,25. Poprzednia wartość wynosiła: 4,375.
Przykład (problem plecakowy) W przykładzie tym zobaczymy jak można zastosować klasyczny algorytm genetyczny do tzw. problemu plecakowego. Jest to znany problem z teorii algorytmów, który należy do klasy NP-zupełnych. Tutaj zajmiemy się pewnym wariantem tego zadania, określanym czasem jako zero-jedynkowy problem plecakowy (ang. 0/1 knapsack problem). Mamy plecak, który ma określoną pojemność C (ang. capacity). Możemy do niego włożyć n przygotowanych przedmiotów, o wagach (lub objętościach) w1,…,wn oraz o „ważności” określonej przez liczby p1,…,pn. Chcemy tak załadować plecak, aby całkowita ważność była jak największa, ale jednocześnie nie możemy przekroczyć ustalonej, górnej granicy pojemności C.
Formalnie problem plecakowy możemy zdefiniować tak: dane są: szukamy liczb nieujemnych takich, że funkcja osiąga maksimum, przy następującym warunku
W przypadku zero-jedynkowego problemu plecakowego, zakładamy dodatkowo, że liczby xi są równe zero lub jeden: Interpretacja jest wtedy taka, że xi=1 oznacz, że przedmiot o numerze „i” jest wsadzony do plecaka, a xi=0 oznacza, że go tam nie umieściliśmy. W przypadku zero-jedynkowym możemy od razu zastosować klasyczny algorytm genetyczny, gdyż problem kodowania jest automatycznie zapewniony. Problem naturalnie kodujemy ciągiami binarnymi x=[x1…xn]. Szukamy więc takiego wektora binarnego x=[x1…xn], że oraz dla którego jest maksymalna.
Problem plecakowy tym się różni od dwóch poprzednich, że mamy tu dodatkowo warunek ograniczający dopuszczalne osobniki. Tylko takie ciągi binarne x=[x1…xn] nas interesują, które spełniają ograniczenie Przy implementacji genetycznego algorytmu optymalizacji z powyższym ograniczeniem, na ogół wprowadzamy je do metody rozwiązywania poprzez tzw. funkcję kary, Pen(x). Oznacza to, że funkcja dostosowania jest obliczana wg wzoru gdzie funkcja kary Pen(x) zawiera wbudowane ograniczenie.
Istnieje wiele strategii ustalania funkcji kary. Poniżej przedstawiane są trzy przypadki, w których wzrost kary wraz ze stopniem przekroczenia ograniczeń jest odpowiednio liniowy, logarytmiczny i kwadratowy: [Na podstawie Michalewicz, ArabasGeneticAlgorithms for the 0/1 Knapsack Problem]
We wszystkich trzech przypadkach stała jest zdefiniowana następująco: Przykładowe testy: 1) n=10, pi=1, wi=i dla i=1,…,n, 0 C n(n+1)/2. Parametry algorytmu genetycznego: pk=0,7; pm=0,01; liczba osobników w populacji: 10, liczba generacji: 100. 2) n=50, pi=1, wi=i dla i=1,…,50. Parametry algorytmu genetycznego: pk=0,7; pm=0,01; liczba osobników w populacji: 100, liczba generacji: 200. 3) wi= losowe ze zbioru [1, b] o rozkładzie jednostajnym; pi= losowe ze zbioru [1, b] o rozkładzie jednostajnym; C=2b. Dla n=100, 250, 500; b=10; pk=0,65; pm=0,05.
Więcej o kodowaniu W klasycznym algorytmie genetycznym stosujemy binarne kodowanie chromosomów. Wykorzystujemy w tym celu zapis pozycyjny o podstawie dwa, np. Niestety nie zawsze sformułowany problem ma argumenty, które są wprost kodami binarnymi. Na przykład przy optymalizacji dowolnej funkcji, której dziedzina jest podzbiorem Rn argumenty są liczbami zmiennopozycyjnymi. Załóżmymy, że x[a, b] i dokładność którą chcemy uzyskać przyjmujemy =10-6. Wybieramy liczbę naturalną N taką, że czyli Dla przedziału [a, b] = [-1, 2] daje to N 3·106.
Zatem minimalna liczba bitów do kodowania binarnego wynosi L=22. Oznacza to, że w podanym przykładzie liczbom zmiennopozycyjnym z odcinka [a, b]=[-1, 2] będą odpowiadały chromosomy o długości 22 bity, np. [1101010001010010010011] lub [0011010000111010100110]. Musimy jednak umieć transformować kody na liczby z odcinka i na odwrót. Łatwo znaleźć taką liniową transformację, jeżeli zauważymy, że co daje gdzie s jest liczbą całkowitą odpowiadającą danemu chromosomowi, obliczoną zgodnie z normalnym zapisem dwójkowym, czyli np. s=[1010]=6.
Przykład Mamy do optymalizacji funkcję jednej zmiennej, ale w dziedzinie liczb rzeczywistych, R. Oznacza to, że dla klasycznego algorytmu genetycznego musimy najpierw dokonać odpowiedniego kodowania. Niech funkcja dana będzie wzorem:
Jeżeli chcemy obliczenia wykonywać na liczbach z dokładnością do 6 cyfr po przecinku, to obliczamy, że potrzebujemy L=22 bitowe chromosomy. Przeliczanie chromosomów na liczby z odcinaka [a, b] = [-1, 2] mamy wg wzoru Na przykład chromosomowi [1000101110110101000111] odpowiada s=2288967, zatem
Przykładowa symulacja dla parametrów: pk=0,4; pm=0,01; rozmiar populacji: 50; liczba pokoleń: 150.
Strategie ewolucyjne Algorytmy ewolucyjne mają podobny sposób działania do algorytmów genetycznych. Zaliczane są także do grupy metod niedeterministycznych. Za twórcę algorytmów ewolucyjnych uznawany jest Lawrence Fogel. Podobnie jak ma to miejsce w przypadku algorytmów genetycznych, opierają się one na ideach zaczerpniętych z biologii i podobnie w każdej iteracji tworzona jest pewna populacja poddawana później selekcji, krzyżowaniu i mutacji. Celem algorytmu ewolucyjnego jest wyznaczenie maksimum (lub minimum) danej funkcji celu przy czym liczba zmiennych optymalizacji (n) odpowiada długości chromosomów (liczbie genów w chromosomie).
Strategie ewolucyjne • Inaczej niż w klasycznych algorytmach genetycznych reprezentujemy osobniki. Stosujemy wektory liczb zmiennoprzecinkowych (float, double) zamiast zwykłych wektorów binarnych: x=(x1,...,xn), gdzie xi R. Oznacza to, że w algorytmach ewolucyjnych geny są liczbami rzeczywistymi. • Inaczej przebiega proces selekcji. Jest deterministyczny i nie występują powtórzenia. Ponadto metoda tworzenia nowej populacji wymusza odrzucanie najsłabszych osobników. Jest kilka typów strategii ewolucyjnych. Najprostsze to tzw. strategie: (1+1), (m+l) lub (m, l).
Strategia ewolucyjna (1+1) W metodzie tej przetwarzany jest jeden chromosom x. Czyli na każdym etapie obliczeń populacja składa się z jednego osobnika. Chromosom ten jest wektorem, którego składowe są liczbami zmiennopozycyjnymi. Mamy więc W nowej generacji powstaje nowy osobnik y, ale w wyniku tylko mutacji! (szczegóły mutowania są podane dalej). Nie ma zatem tutaj operacji krzyżowania. Po wykonaniu mutacji sprawdzamy wartość funkcji przystosowania. Osobnik przeżywa, jeżeli jest lepiej przystosowany: jeżeli (f(y) > f(x)), to x:=y jeżeli (f(y) f(x)), to pozostawiamy x.
Ponieważ mutowanie w danym kroku jest — jak zaraz zobaczymy — zależne w pewnym stopniu od historii ewolucji osobnika, musimy na bieżąco pamiętać jaka jest liczba (a dokładniej częstotliwość) sukcesów, czyli przypadków f(y)>f(x). W tym celu używamy dwóch pomocniczych liczników: k=liczba pokoleń (zwiększamy o 1 w każdym kroku); ks=liczba sukcesów. Daje to następujący schemat strategii ewolucyjnej (1+1): k:=0; ks=0; //liczniki (inicjalizacja) Losuj x; :=początkowe //np. :=1 do { ewentualna modyfikacja parametru y:=mutacja(x, ) jeżeli (f(y) > f(x)), to { x:=y; ks=ks+1} jeżeli (f(y) f(x), to nie zmieniamy x oraz ks k:=k+1; }
Rozkład normalny N(0,1) Zmienna losowa x ma standardowy rozkład normalny, gdy prawdopodobieństo przyjęcia przez nią wartości w przedziale a < x < b jest dane przez Rozkład normalny N(m, s) o średniej (inaczej wartości oczekiwanej) m oraz o odchyleniu standardowym s jest określony wzorem
Jak powstaje próbny chromosom y, czyli jak wygląda mutacja osobnika x? Generalnie przez dodawanie do składowych chromosomu x liczb losowych, generowanych zgodnie z rozkładem normalnym N(0,1). Mamy więc W zależnościach tych: — parametr określający zasięg mutacji, Ni(0,1) — liczba losowa generowana zgodnie z rozkładem normalnym (o średniej równej 0 oraz odchyleniu standardowym równym 1).
Zapis oznacza gdzie współrzędne wektora z=(z1,…,zn) wylosowano (niezależnie) zgodnie z rozkładem normalnym N(0,1). Łatwo zauważyć, że oznacza to równoważnie nastepującą operację:
Adaptację parametrów w tej strategii uzyskuje się poprzez zmianę zasięgu mutacji . Często stosuje się tutaj regułę 1/5 sukcesów. Mówi ona, że dobre rezultaty poszukiwań optimum uzyskujemy, gdy stosunek między liczbą udanych mutacji a wszystkimi mutacjami wynosi 1/5. Oznacza to, że będziemy zwiększali lub zmniejszali wartość w zależności od aktualnej relacji pomiędzy sukcesami (ks) a wszystkimi próbami (k). Formalnie zapisujemy to tak: gdzie: (k)=współczynnik sukcesów operacji mutacji w poprzednich k generacjach ={liczba dotychczasowych sukcesów (sukces: gdy f(y)>f(x))}/k = ks/k Na ogół wybieramy stałe: c1=0,82; c2=1/c1=1,2.
Przykład Działanie jednej generacji strategii ewolucyjnej (1+1) przy znajdowaniu maksimum funkcji z ograniczeniami Zaczynamy od zasięgu mutacji =1. Losujemy punkt (chromosom) początkowy x=(-1,45; -1,95). Zatem f(x)=-3,91. Losujemy dwie liczby wg rozkładu normalnego: N1(0,1)=-0,90, N2(0,1)=0,08. Stosujemy mutację: yi=xi+1·Ni(0,1), dla i=1,2 co daje osobnika y=(-2,35; -2,03).
Sprawdzamy przystosowanie: f(y)=-7,64. Ponieważ f(y) < f(x), więc dalej x jest osobnikiem populacji, nie został wymieniony. Liczba sukcesów dalej jest zero: ks=0. Reguła 1/5 wymaga powiększania zasięgu mutacji (mnożenie przez c2=1,2) lub pomniejszania (mnożenie przez c1=0,82). Zmianę parametru dokonujemy co k=5 generacji. Dlatego należy w osobnej zmiennej pamiętać liczbę sukcesów (czyli przypadków kiedy f(y) > f(x)).
Zadanie Przetestować strategię ewolucyjną (1+1) dla testowej funkcji Rastrigina Do poszukiwania minimum początkowy zakres mutacji przyjąć s=1 oraz chromosom startowy x=(2.5, 2.1).
Strategia ewolucyjna (+) • Strategia ta jest rozszerzeniem strategii (1+1). Stałe 1 oznaczają dwie liczby naturalne. Główne różnice pomiędzy tymi strategiami są następujące: • Populacja wyjściowa P ma teraz osobników (a nie jednego). • Losujemy osobników z polulacji P i umieszcamy ich w populacji tymczasowej T. • Krzyżowanie i mutacja dokonywana jest na osobnikach z T, co daje popilację O (również o liczności ). • Wybieramy teraz najlepszych potomków z obydwu populacji P O. • Uwagi: • Współczynnik zakresu mutacji jest przypisany oddzielnie każdemu pojedynczemu osobnikowi populacji. • Zachodzi operacja krzyżowania.
Przykład Przedstawimy działanie strategii (+), dla funkcji celu n argumentowej, tzn. Podstawowy problem to znajdowanie optimum (dalej rozważamy maksimum) dla tej funkcji. Jak zwykle w opisie algorytmu genetycznego czy ewolucyjnego funkcja ta opisuje przystosowanie osobnika (im większa wartość, tym lepsze dostosowanie, a zatem większa szansa na przeżycie i reprodukcję). W strategii (+) przyjmujemy, że każdy chromosom (osobnik) będzie miał postać
Generujemy losowo populację początkową składającą się z osobników: P={ch1,ch2,…,ch} Tworzenie nowej populacji P’ na podstawie bieżącej P odbywa się w dwóch etapach: 1) Najpierw tworzymy tymczasową populację T o osobnikach: for i=1 to do wybierz losowo parę rodzicielską (chA ; chB) z P reprodukcja (metodą krzyżowania): (chA ; chB)chC mutacja potomka chC i dodanie go do populacji T 2) Teraz tworzymy nową populację P’wybierając najlepszych (w sensie przystosowania, czyli wartości funkcji f) osobników z sumy zbiorów PT. Musimy jeszcze omówić szczegóły operacji krzyżowania i mutacji, które są specyficzne dla metody (+).
Krzyżowanie w strategii (+) Najczęściej stosowaną metodą krzyżowania w tej strategii jest krzyżowanie uśredniające. Może to być proste uśrednianie (średnia arytmetyczna) lub uśrednianie z wagą. Krzyżowanie uśredniające. W nowym osobniku ch’ wszystkie geny są średnimi arytmetycznymi genów rodziców chA=(xA, A) i chB=(xB, B): Na przykład dla chA=(1; 3; 1,2; 2,3) i chB=(-2; 1,5; 0,7; 0,4) otrzymujemy
Krzyżowanie uśredniające z wagą. W tym przypadku średnia niekoniecznie polega na braniu po 50% wartości z każdej składowej chromosomów. Proporcja ta może być inna. Robimy to tak: wybieramy losowo liczbę a z przedziału [0, 1]. Krzyżowanie polega na zastosowaniu następujących wzorów: Zauważmy, że gdy wylosowana liczba a=1/2, to mamy zwykłe uśrednianie. Liczba a jest losowana z rozkładem jednostajnym na odcinku [0, 1], co oznacza, że każda wartość jest jednakowo prawdopodobna.
Mutacja w strategii (+) Jak zawsze mutacja dokonywana jest na pojedynczym osobniku. W strategii (+) przebiega ona dwuetapowo: najpierw dokonujemy mutacji części , a następnie części x. Mutacja wektora . Nowy wektor ’=(1’,…,n’) uzyskujemy wg wzoru gdzie: jak zwykle symbol N(0,1) oznacza liczbę rzeczywistą wylosowaną zgodnie ze standardowym rozkładem normalnym (wartość oczekiwana 0; odchylenie standardowe 1). Inaczej mówiąc, wzór powyższy należy rozumieć tak: losujemy liczby a, b1,…bnR zgodnie z rozkładem normalnym N(0,1), a następnie obliczamy
Teraz możemy już dokonać mutacji wektora x. Dokonujemy tego wg analogicznych wzorów jak w przypadku strategii (1+1). Mianowicie gdzie, jak poprzednio, Ni(0,1) jest liczbą losową z rozkładu normalnego standardowego. Zatem losujemy liczby a1,…,an wg rozkładu normalnego N(0,1), a następnie podstawiamy
Zadanie Dokonać optymalizacji (maksimum) funkcji przy ograniczeniach Zadanie Znaleźć minimum dla następującej funkcji testowej na zbiorze
Strategia ewolucyjna (, ) Strategia ta różni się od staregii ( + ) tylko w jednym: nową populację P zawierającą osobników wybiera sie tylko spośród najlepszych osobników populacji O. Aby było to możliwe musi być spełniony warunek > .