Ćwiczenie nr 6 Algorytmy Genetyczne Schemat blokowy
Transkrypt
Ćwiczenie nr 6 Algorytmy Genetyczne Schemat blokowy
Inteligencja obliczeniowa Ćwiczenie nr 6 Algorytmy Genetyczne Schemat blokowy podstawowego algorytmu genetycznego; Reprezentacja osobników Kodowanie rozwiązań; Funkcja celu; Podstawowe operacje: selekcja, krzyżowanie, mutacja 1. Wprowadzenie Algorytmy genetyczne są algorytmami stochastycznymi, których sposób przeszukiwania przestrzeni potencjalnych rozwiązań naśladuje pewne procesy naturalne takie jak: dziedziczenie genetyczne i darwinowską walkę o przeżycie. Przenośnia leżąca u podstaw algorytmów genetycznych jest związana z ewolucją w naturze. W trakcie procesu ewolucji każdy gatunek styka się z problemem lepszego przystosowania się do skomplikowanego i zmiennego środowiska. Doświadczenie, jakie uzyskuje każdy osobnik zostaje wbudowane w jego układ chromosomów. Do opisu algorytmów genetycznych używa się słownictwa zapożyczonego z genetyki naturalnej. Mówimy w niej o osobnikach w populacji, często osobniki nazywane są łańcuchami lub chromosomami. Chromosomy składają się z genów uszeregowanych liniowo, a każdy gen decyduje o dziedziczności jednej lub kilku cech. Biologiczny odpowiednik algorytmów genetycznych można znaleźć w postaci różnych populacji żywych istot żyjących na naszej planecie i podlegających nieugiętym prawom natury oraz dążących do przetrwania w celu przeżycia danego gatunku. Populacja znajdująca się w algorytmie genetycznym składa się z różnego rodzaju osobników, a przeważnie każdy osobnik jest inny. Cechy danego osobnika (jego przystosowanie do funkcji celu) zwiększają lub zmniejszają jego szanse na przetrwanie. Identyczne odwzorowanie znajdujemy w świecie naturalnym, gdzie również każda populacja składa się z pewnej liczby osobników, z których każdy jest inny. Również i tutaj cechy danego osobnika składają się na jego ogólne przystosowanie do środowiska naturalnego i powodują to, że dany osobnik ma większe lub mniejsze szanse przeżycia. Zgodnie z prawami natury przetrwają tylko osobniki najlepiej przystosowane. W środowisku naturalnym osobniki, które przetrwały krzyżują się ze sobą w celu wydania nowego pokolenia. Pokolenie to jest lepiej przystosowane do środowiska poprzez dziedziczenie cech od swoich rodziców. Identyczna sytuacja zachodzi również w algorytmach genetycznych, gdzie ciągi (chromosomy), które są lepiej przystosowane przeżywają i wydają w wyniku krzyżowania nowe pokolenie, będące przeważnie lepiej przystosowane na skutek dziedziczenia cech od swoich rodziców. W środowisku naturalnym można spotkać się również z mutacją; jest to operator genetyczny, który powoduje losową zmianę genu, przez co osobnik albo zyskuje na wartości (jego pewna cecha ulega polepszeniu) i staje się bardziej przystosowany do środowiska, albo zmiana taka powoduje pewną degradację osobnika np. skutkiem mutacji może być wystąpienie pewnej choroby genetycznej, która zmniejszy jego szanse na przetrwanie. W algorytmach genetycznych również można znaleźć operator mutacji, który jest drugim po krzyżowaniu podstawowym operatorem genetycznym i tak jak w środowisku naturalnym może on doprowadzić do zmiany przystosowania danego osobnika do funkcji celu. Osobnik poddany operatorowi mutacji może zwiększyć lub zmniejszyć swoje prawdopodobieństwo przetrwania. Z powyższych rozważań widać wyraźnie jak bardzo algorytmy genetyczne są skorelowane ze swoim biologicznym odpowiednikiem, od którego się wywodzą. Algorytmy genetyczne © dr inż. Adam Słowik 1 Inteligencja obliczeniowa 2. Podstawy działania AG W podpunkcie tym zostanie przedstawione działanie algorytmu genetycznego dla prostego zadania optymalizacji. Rozważaniu podlegać będzie zadanie maksymalizacji funkcji f, jednak jeśli zadanie optymalizacji będzie polegać na minimalizacji funkcji f, to jest ono równoważne maksymalizacji funkcji g, przy czym należy zaznaczyć, że g=-f, czyli min { f(x) } = max { g(x) } = max { - f(x) } (1) Dodatkowo można przyjąć, że funkcja przyjmuje wartości dodatnie w swojej dziedzinie, jeżeli tak nie jest można zawsze dodać pewną dodatnią stałą C, ponieważ max { g(x) } = max { g(x) + C } (2) Załóżmy teraz, że chcemy maksymalizować funkcję k zmiennych f(x1, ..., xk) oraz, że każda zmienna może przybierać wartości z przedziału Di = [a i , bi ] ⊆ R i f ( x1 ,..., x k ) >0 dla wszystkich x i ∈ Di . Wiemy również, że chcemy optymalizować funkcję f z pewną żądaną dokładnością. Dla każdej i-tej zmiennej należy określić jej dokładność ZDi. Poniższa zależność pozwala obliczyć ile genów musi przypadać na i-tą zmienną, aby otrzymać określoną wcześniej dokładność: bi − ai ≤ ZDi 2 mi − 1 (3) czyli liczba genów dla i-tej zmiennej ma spełniać nierówność: b − ai 2 mi ≥ i +1 (4) ZDi mi oznacza najmniejszą liczbę całkowitą spełniającą nierówność (4). Wówczas reprezentacja, w której każda zmienna x i jest zakodowana jako łańcuch binarny o długości mi , w oczywisty sposób będzie spełniała wymagania dokładności. Natomiast wartość każdej i-tej zmiennej można otrzymać w sposób jawny stosując zależność: x i = a i + dec(1010...110012 ) ⋅ (bi − a i ) / ( 2 mi − 1) (5) gdzie dec (łańcuch binarny) jest równy dziesiętnej wartości łańcucha binarnego. W algorytmie genetycznym każdy osobnik – chromosom (jako potencjalne rozwiązanie) jest reprezentowany przez łańcuch o długości: k m = ∑ mi (6) i =1 Pierwsze m1 bitów odpowiada wartościom zmiennej x1 z przedziału [a1 , b1 ] , druga grupa m 2 bitów odpowiada wartościom zmiennej x2 z przedziału [a 2 , b2 ] , i tak dalej, aż do ostatniej grupy m k bitów, które odpowiadają wartościom zmiennej xk z przedziału [a k , bk ] . W celu ustalenia populacji początkowej złożonej z PopSize chromosomów generuje się losowo bit po bicie każdego z nich, jednak jeśli dysponujemy pewną wiedzą o rozkładzie możliwych optimów, można wówczas użyć tej informacji do odpowiedniego rozmieszczenia początkowych (potencjalnych) rozwiązań. Reszta algorytmu jest oczywista. W każdym pokoleniu będą oceniane wszystkie chromosomy (używając funkcji celu), będzie wybierana nowa populacja zgodnie z rozkładem prawdopodobieństwa określonym na wartościach dopasowań Algorytmy genetyczne © dr inż. Adam Słowik 2 Inteligencja obliczeniowa poszczególnych chromosomów do funkcji celu oraz będą stosowane operatory genetyczne takie jak krzyżowanie i mutacja. Po pewnej liczbie pokoleń, gdy nie będzie już poprawy generowanych wyników (lub zostały spełnione warunki zakończenia algorytmu) najlepsze chromosomy reprezentują najkorzystniejsze rozwiązanie danego problemu. Algorytm genetyczny często jest zatrzymywany po ustalonej liczbie iteracji, w zależności od szybkości i pamięci posiadanego komputera. Załóżmy, że utworzono losowo pewną populację chromosomów (osobników) reprezentujących potencjalne rozwiązania problemu. Następnie należy ocenić i utworzyć nową populację zgodnie z funkcją celu. Dokonujemy tego w procesie selekcji (reprodukcji), a wybór nowej populacji następuje zgodnie z rozkładem prawdopodobieństwa określonym na wartościach dopasowań. Używa się tutaj najczęściej metodę ruletki o wielkości pól zgodnej z wartościami dopasowań. Ruletkę taką konstruuje się w następujący sposób (poniżej zakładamy, że wartości dopasowania są dodatnie, jeżeli tak nie jest należy odpowiednio przeskalować wartości): • oblicz wartość dopasowania eval (v i ) dla każdego chromosomu v i (i = 1,....., PopSize) • oblicz całkowite dopasowanie populacji F = PopSize ∑ eval (v ) , i =1 • oblicz prawdopodobieństwo wyboru p i każdego chromosomu v i (i = 1,....., wielkość_populacji) • i p i = eval (v i ) / F , wyznacz przedziały ruletki [RMin, RMax) dla każdego i-tego osobnika zgodnie z zależnością: RMini = RMaxi-1; RMaxi=RMini+pi Proces selekcji jest oparty na obrocie ruletką PopSize razy i wyborze za każdym razem jednego chromosomu do nowej populacji w następujący sposób: • • wygeneruj liczbę przypadkową (zmiennopozycyjną) r z zakresu [0,1) jeśli (r >= RMini) oraz (r<RMaxi) wówczas do nowej populacji wybierz osobnika o numerze i-tym Oczywiście pewne chromosomy będą wybrane więcej niż raz. Po utworzeniu nowej populacji stosujemy na niej operatory genetyczne. Pierwszym jest operator krzyżowania, który występuje w systemie genetycznym zgodnie z parametrem określanym prawdopodobieństwem krzyżowania p k . Prawdopodobieństwo to umożliwia nam obliczenie oczekiwanej liczby chromosomów p k ⋅ PopSize, które ulegną operacji krzyżowania. Aby zastosować ten operator postępujemy w następujący sposób: • • dla każdego chromosomu generujemy liczbę losową (zmiennopozycyjną) r z zakresu [0,1) jeśli dla i-tego chromosomu r< p k , to wybieramy i-ty chromosom do krzyżowania. Mając określoną pulę chromosomów, które będą podlegać krzyżowaniu, dobieramy wybrane chromosomy w pary (oczywiście również losowo). Gdy liczba wybranych chromosomów jest parzysta wówczas możemy je łatwo połączyć, jednak gdy liczba chromosomów jest nieparzysta Algorytmy genetyczne © dr inż. Adam Słowik 3 Inteligencja obliczeniowa należy albo dodać, albo odjąć jeden chromosom, oczywiście także losowo. Po połączeniu chromosomów w pary, dla każdej z nich generujemy losową liczbę poz z zakresu [1,m-1], gdzie m jest całkowitą długością – liczbą bitów – chromosomu. Wylosowana liczba poz określa nam punkt cięcia chromosomu do wymiany. Tak więc dwa chromosomy (d 1 d 2 ...d poz d poz +1 ...d m ) i (e1 e 2 ...e poz e poz +1 ...e m ) są zamieniane na parę potomków (d 1 d 2 ...d poz e poz +1 ...e m ) i (e1 e 2 ...e poz d poz +1 ...d m ) Następną operacją jest mutacja, która wykonywana jest bezpośrednio na bitach. Na podstawie parametru algorytmu genetycznego, prawdopodobieństwa mutacji p m , możemy obliczyć oczekiwaną liczbę zmutowanych bitów p m ⋅ m ⋅ PopSize. Każdy bit (we wszystkich chromosomach i w całej populacji) ma równe szanse na mutację, to znaczy zmiany z 0 na 1 lub odwrotnie. W przypadku mutacji postępujemy następująco: • • dla każdego chromosomu bieżącej populacji (po krzyżowaniu) i dla każdego bitu w chromosomie wygeneruj liczbę losową (zmiennopozycyjną) r z zakresu [0,1) jeżeli liczba r< p m , to zmutuj dany gen (bit). Po zakończeniu mutacji obliczane jest ponownie przystosowanie całej populacji, następnie sprawdzany jest warunek czy można zakończyć pracę algorytmu genetycznego, jeśli tak to wyprowadzamy wyniki na ekran i kończymy pracę algorytmu genetycznego, jeśli nie to dokonujemy kolejno: selekcji, krzyżowania i mutacji i cały proces powtarza się. Poniżej przedstawiono schemat działania algorytmu genetycznego: 1. Utwórz losowo populację początkową 2. Oceń przystosowanie osobników do funkcji celu 3. Dopóki nie osiągnięto kryterium stopu wykonaj 4. selekcję osobników 5. operację krzyżowania chromosomów 6. mutację osobników 7. ocenę przystosowania osobników do funkcji celu 8. Wyprowadź otrzymany wynik (wyniki) 3. Optymalizacja funkcji jednej zmiennej - przykład Jako funkcję testową dla tego zadania użyto: y = f ( x) = 50 − 5 ⋅ sin(10 ⋅ π ⋅ x) − 10 ⋅ ( x − 1.5) 2 x ∈ [0,3] Powyższa funkcja jest wielomodalna tzn. posiada wiele maksimów oraz minimów. W prezentowanym przykładzie skupimy się nad znalezieniem maksimum globalnego funkcji w podanym przedziale od 0 do 3. W celu lepszego zobrazowania wzoru funkcji została ona zaprezentowana graficznie na wykresie przedstawionym na rys. 1. Algorytmy genetyczne © dr inż. Adam Słowik 4 Inteligencja obliczeniowa Rys. 1 – Funkcja testowa f(x) w formie graficznej. Jak widać funkcja w podanym przedziale x ∈ [0,3] (Xmin=0; Xmax=3) przyjmuje wiele maksimów oraz wiele minimów, jednak posiada w tym przedziale tylko jedno maksimum globalne, które algorytm genetyczny będzie się starał wyznaczyć. Rys. 2 – Funkcja testowa f(x) – globalne ekstremum. Z wykresu przedstawionego na rys. 2 wynika, że funkcja przyjmuje wartość maksymalną: f(x) ≈ 54.9715 dla argumentu x ≈ 1.551. Również z wykresu (rys. 5.1.2) widać, że niewielkie zmiany argumentu mogą prowadzić do „wskoczenia” algorytmu w maksimum lokalne. Załóżmy, że chcemy aby zmienna x zmieniała się z dokładnością 0.01, wówczas z nierówności (4) wynika, że: 2m ≥ 3−0 + 1 => 2 m ≥ 301 0.01 Najmniejsza liczba całkowita m dla której jest spełniona powyższa nierówność wynosi 9. W związku z tym każdy osobnik będzie się składał z 9 genów (LG=9) w których zapisana będzie zmienna x. Algorytmy genetyczne © dr inż. Adam Słowik 5 Inteligencja obliczeniowa Również postanowiono zarezerwować 6 dodatkowych komórek, na następujące wartości: wartość dziesiętną dec, odkodowaną wartość x, wartość funkcji y, wartość przystosowania względnego, wartość RMin, wartość RMax. Czyli do zapisania wszystkich wartości wystarczy wektor złożony z 15 elementów. Przyjęto również, że populacja składa się z 20 osobników. W związku z tym fragment kodu tworzący populację osobników może wyglądać następująco: Population1=zeros(20,15); // Populacja podstawowa Population2=zeros(20,15); // Populacja tymczasowa Xmin=0; Xmax=3; LG=9; for i=1:20 for j=1:9 if rand()<0.5 Population1(i,j)=1; else Population1(i,j)=0; end end end Rys. 3 – Fragment kodu tworzącego populacje osobników (losowo) Następnie poniższe kroki wykonywane są k razy aż do zakończenia algorytmu: W pierwszym kroku oblicza, się wartość dec, wartość x, wartość y, oraz przystosowanie łączne (PL), a następnie wartości te są wpisywane do odpowiednich komórek. //---- PL – przystosowanie laczne PL=0; for i=1:20 dec=0; for j=1:9 if Population1(i,j)==1 dec=dec+Population1(i,j)*(2^(9-j)); end; end; Population1(i,10)=dec; X=((Xmax-Xmin)/(2^LG-1))*dec+Xmin; Population1(i,11)=X; Y=50-5*sin(10*3.14*X)-10*(X-1.5)^2; Population1(i,12)=Y; PL=PL+Y; end; Rys. 4 – Fragment kodu wyznaczającego: PL, dec, x i y W drugim kroku oblicza się przystosowanie względne oraz wyznacza się przedziały koła ruletki dla każdego osobnika. Algorytmy genetyczne © dr inż. Adam Słowik 6 Inteligencja obliczeniowa //------------------- oblicz przystosowanie wzgledne for i=1:20 Population1(i,13)=Population1(i,12)/PL; end; //------------------- oblicz przedzialy ruletki Population1(1,14)=0; Population1(1,15)=Population1(1,14)+Population1(1,13); for i=2:20 Population1(i,14)=Population1(i-1,15); Population1(i,15)=Population1(i,14)+Population1(i,13); end; Rys. 5 – Fragment kodu obliczającego przystosowanie względne oraz wyznaczającego przedziały koła ruletki W następnym kroku, dokonuje się selekcji osobników z populacji podstawowej „Population1” do populacji tymczasowej „Population2”. Selekcja jest dokonywana metodą ruletki. (PL), a następnie wartości te są wpisywane do odpowiednich komórek. //-------------------- dokonaj selekcji for i=1:20 los=rand(); Nr=0; for j=1:20 if (los>=Population1(j,14)) & (los<Population1(j,15)) Nr=j; end; end; Population2(i,:)=Population1(Nr,:); end; Rys. 6 – Przykładowy kod realizujący selekcję osobników metodą ruletki W następnym kroku dokonuje się operacji krzyżowania oraz mutacji. Kod realizujący operację mutacji oraz krzyżowania w wersji uproszczonej (bez dobierania osobników w pary) przedstawiono na rys. 7.PCross – oznacza prawdopodobieństwo krzyżowania, PMut – oznacza prawdopodobieństwo mutacji. //-------------------- dokonaj krzyzowania for i=1:20 los=rand(); if los<Pcross Nr=round(rand()*19)+1; Cut=round(rand()*7)+1; c1=Population2(i,(Cut+1):9); c2=Population2(Nr,(Cut+1):9); Population2(i,(Cut+1):9)=c2; Population2(Nr,(Cut+1):9)=c1; end; end; //-------------------- dokonaj mutacji for i=1:20 for j=1:9 los=rand(); Algorytmy genetyczne © dr inż. Adam Słowik 7 Inteligencja obliczeniowa if (los<PMut) if (Population2(i,j)==1) Population2(i,j)=0; else Population2(i,j)=1; end; end; end; end; Rys. 7 – Fragment kodu realizujący operację krzyżowania oraz mutacji W następnym kroku należy przepisać zawartość populacji tymczasowej „Population2” do populacji podstawowej „Population1”, co można zrealizować następująco: for i=1:20 Population1(i,:)=Population2(i,:); end; Obliczenia (do rys. 4 do rys. 7) powtarzamy aż spełniony zostanie warunek zakończenia algorytmu (np. osiągnięcie określonej liczby pokoleń). Po zakończeniu pracy algorytmu otrzymanym wynikiem jest rezultat zapisany w najlepszym osobniku (o największej wartości przystosowania). Poniżej na rys. 8 przedstawiono prosty algorytm genetyczny napisany w SCILAB’ie. Algorytm dąży do odnalezienia maksimum funkcji przedstawionej na rys. 1. //--- przyjecie wartosci parametrow x=zeros(2,301); PMut=0.1; PCross=0.5; Generations=10; //--- wykreslenie ksztaltu optymalizowanej funckji for i=1:301 x(1,i)=(i-1)/100; end; for i=1:301 x(2,i)=50-5*sin(10*3.14*x(1,i))-10*(x(1,i)-1.5)^2; end; plot(x(1,:),x(2,:)); //-------------- utworz populacje zlozona z 20 osobnikow Population1=zeros(20,15); // Populacja podstawowa Population2=zeros(20,15); // Populacja tymczasowa Xmin=0; Xmax=3; LG=9; for i=1:20 for j=1:9 if rand()<0.5 Population1(i,j)=1; else Population1(i,j)=0; end end end Algorytmy genetyczne © dr inż. Adam Słowik 8 Inteligencja obliczeniowa for k=1:Generations //---------- oblicz dec, x, y (przystosowanie) //---------- oraz przystosowanie laczne PL PL=0; for i=1:20 dec=0; for j=1:9 if Population1(i,j)==1 dec=dec+Population1(i,j)*(2^(9-j)); end; end; Population1(i,10)=dec; X=((Xmax-Xmin)/(2^LG-1))*dec+Xmin; Population1(i,11)=X; Y=50-5*sin(10*3.14*X)-10*(X-1.5)^2; Population1(i,12)=Y; PL=PL+Y; end; //------------------- oblicz przystosowanie wzgledne for i=1:20 Population1(i,13)=Population1(i,12)/PL;end; //------------------- wypisz najlepsze rozwiazanie na ekran Max=Population1(1,12); NrMax=1; for i=2:20 if (Population1(i,12)>Max) Max=Population1(i,12); NrMax=i; end; end; disp(Population1(NrMax,12)); //------------------- oblicz przedzialy ruletki Population1(1,14)=0; Population1(1,15)=Population1(1,14)+Population1(1,13); for i=2:20 Population1(i,14)=Population1(i-1,15); Population1(i,15)=Population1(i,14)+Population1(i,13); end; //-------------------- dokonaj selekcji for i=1:20 los=rand(); Nr=0; for j=1:20 if (los>=Population1(j,14)) & (los<Population1(j,15)) Nr=j; end; end; Population2(i,:)=Population1(Nr,:); end; Algorytmy genetyczne © dr inż. Adam Słowik 9 Inteligencja obliczeniowa //-------------------- dokonaj krzyzowania for i=1:20 los=rand(); if los<PCross Nr=round(rand()*19)+1; Cut=round(rand()*7)+1; c1=Population2(i,(Cut+1):9); c2=Population2(Nr,(Cut+1):9); Population2(i,(Cut+1):9)=c2; Population2(Nr,(Cut+1):9)=c1; end; end; //-------------------- dokonaj mutacji for i=1:20 for j=1:9 los=rand(); if (los<PMut) if (Population2(i,j)==1) Population2(i,j)=0; else Population2(i,j)=1; end; end; end; end; //--------------------- przepisz populacje for i=1:20 Population1(i,:)=Population2(i,:); end; end;// end do glownej petli algorytmu Rys. 8 – Prosty algorytm genetyczny (SCILAB) 4. Zadania do wykonania a) uruchomić algorytm genetyczny z Rys. 8 b) do programu z rys. 8 dopisać fragment kodu wykreślający wartość najlepszego osobnika (rozwiązania) w funkcji kolejnych pokoleń dla parametru Generations=100; Oś „x” ma reprezentować kolejne pokolenia, oś „y” najlepsze rozwiązanie w danym pokoleniu. Rys. 9 – Wartość najlepszego rozwiązania w funkcji kolejnych pokoleń (generacji) Algorytmy genetyczne © dr inż. Adam Słowik 10 Inteligencja obliczeniowa c) zmodyfikować program z rys. 8, dodając elitarystyczny model selekcji, który polega, na tym że najlepsze znalezione do tej pory rozwiązanie jest zapamiętywane w oddzielnym osobniku o nazwie np.TheBest. W każdej iteracji sprawdza się czy w danej populacji istnieje lepsze lub identyczne rozwiązanie do rozwiązania zawartego w osobniku TheBest jeśli tak wówczas wstawia się je do osobnika TheBest, jeśli nie wówczas osobnik TheBest jest wstawiany do populacji w miejsce najgorszego osobnika. Osobnik najlepszy – osobnik o największej wartości funkcji przystosowania (w tym przypadku o największej wartości „y”). Osobnik najgorszy – osobnik o najmniejszej wartości funkcji przystosowania (w tym przypadku o najmniejszej wartości „y”). d) do programu z punktu c) dopisać fragment kodu wykreślający wartość najlepszego osobnika (rozwiązania) w funkcji kolejnych pokoleń dla parametru Generations=100; Oś „x” ma reprezentować kolejne pokolenia, oś „y” najlepsze rozwiązanie w danym pokoleniu. Otrzymany wykres porównać z wykresem otrzymanym w punkcie b) e) zaprogramować algorytm genetyczny z elitarystycznym modelem selekcji wyznaczający maksymalną wartość funkcji dwóch zmiennych postaci: [ ] y ( x1 , x 2 ) = − (x12 − 10 ⋅ cos(2 ⋅ π ⋅ x1 )) + (x 22 − 10 ⋅ cos(2 ⋅ π ⋅ x 2 )) + 80 x1 ∈ [− 5.12; 5.12], x 2 ∈ [− 5.12; 5.12] W funkcji tej, globalne maximum o wartości 100 występuje dla x1=0 i x2=0. W algorytmie genetycznym przyjąć rozdzielczość (dokładność) zmiennej x1 oraz x2 na poziomie 0.01. Przeprowadzić obliczenia dla różnych wartości parametrów PopSize, PCross i PMut (na początku przyjąć PopSize=20; PCross=0.3; PMut=0.01). Jako kryterium zakończenia przyjąć osiągnięcie przez algorytm 100-tnej generacji. Rys. 10 – Graficzna prezentacja optymalizowanej funkcji Algorytmy genetyczne © dr inż. Adam Słowik 11