Dziś jest piątek, 12 marca 2010 roku (z kalendarza...)

Algorytmy ewolucyjne cd.

Prawie rok temu pisałem na tej stronie o algorytmach ewolucyjnych, które wykorzystują mechanizm ewolucji do generowania zbioru rozwiązań mogących pełnić rolę optymalnych. Wtedy jednak zabrałem się do analizy z niewłaściwej strony, co zaowocowało dosyć dziwnymi rezultatami. Tym razem skonstruowałem sobie znacznie elastyczniejszą bibliotekę, pełniącą rolę szkieletu. Do jej zadań należy selekcja osobników oraz decydowanie, kto z kim się skrzyżuje. Sprawy elementarne, czyli samo obliczanie jakości osobników, krzyżowanie jednego z drugim, należy do osobnej klasy, której obiekt jest podpinany do szkieletu.

Pierwotnie rozwiązywałem w ten sposób problem obliczania minimum funkcji, ale wychodziły tam strasznie duże wartości liczbowe, które trudno się debugowało, gdyż za wiele nie mówiły o rozwiązaniu. Przeszedłem więc na rzecz bardziej teoretyczną: generujemy populację losowych ciągów znaków i za pomocą ewolucji próbujemy doprowadzić je do jakiegoś konkretnego słowa. Rzecz miła i przyjemna dla oka.

Na tym problemie przetestowałem jakość kombinacji różnych metod selekcji i krzyżowania. Zdecydowanie najgorzej wypada selekcja metodą ruletki, mająca poważne problemy z wyprodukowaniem nawet przybliżonego rozwiązania. Selekcja rankingowa sprawdza się znacznie lepiej, generując rozwiązanie bardzo bliskie prawdy (z 14 nie zgadzała się średnio jedna, dwie litery). Wtedy jednak, ze względu na wybór przez cały czas wyłącznie najlepszych globalnie osobników, algorytm przedwcześnie osiąga zbieżność, a populacja traci różnorodność genetyczną. Wtedy nadzieja pozostaje w mutacjach. Selekcja turniejowa, która dzieli populację na grupy i do rozrodu wybiera najlepszego osobnika z każdej grupy, niweluje tę wadę. Chociaż do zbioru rozwiązań mogą dostać się osobniki globalnie słabe, ogólnie rzecz biorąc, jakość populacji cały czas się polepsza (bezwzględnie najgorsze sztuki odpadają w turnieju), nie zatracając w aż takim stopniu różnorodności. Wtedy bez trudu już po 13 pokoleniach algorytm dochodzi do właściwego wyniku.

Szczegółowy opis algorytmu ewolucyjnego (wraz z pełnym kodem źródłowym w C++) znajdzie się na Zyxist.com za tydzień. Będzie on rozwinięciem skryptu do wykładu przygotowywanego na warsztaty, o których niedawno pisałem. W przypisach podałem tymczasem kilka przydatnych adresów w polskim Internecie traktujących o zagadnieniu.

Powrót

Skomentuj

NickInformacja
E-mailNa wypadek potrzeby kontaktu z autorem (niepublikowany)
BlogNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2010 | Wykonanych zapytań: 1 | Serwer wirtualny zapewnia