Wpis z mikrobloga

Hejżehej. Znajdzie się jakiś nocny marek co to ma chwilę żeby rzucić na mój kod?
Głównie chodzi o to, że nie działa ( ͡° ͜ʖ ͡°)
Możliwe, że błąd jest trywialny, albo wszystko jest źle i muszę zacząć od nowa.
Kod jest implementacją algorytmu genetycznego który ma dojść do momentu rozwiązania. Rozwiązaniem jest string: "10101010...101010";
W najlepszym wypadku najlepszym po kilku tysiącach generacji na końcu okazuje się string o takim samym wskaźniku "fitowania do rozwiązania" co losowo wygenerowany najlepszy z pierwszej generacji.
A i tak zazwyczaj dzieje się tak, że po operacjach najlepszy jest gorszy niż najlepszy z pierwszej generacji.

Ktoś/coś podpowie?


Linkuję do gita:
https://bitbucket.org/grzegorz_molicki/geneticalgorithm/src/d8b44a0145a315f9c2cf607bb1ed083f7062a315?at=master


Dzięki!

#programowanie #ai chyba trochę #algorytmygenetyczne #algorytmy #java
  • 9
Nowy commit:
Podniosłem prawdopodobieństwo krzyżowania par do 100% (super prawdopodobieństwo bulwo xd), mutacji do 50% i jako tako działa. Tragicznie wolne na jednym wątku, ale działa.
Spróbuję jeszcze dodać żeby brało do nowego zawsze jeden najlepszy z poprzedniego pokolenia, to może trochę przyspieszy proces. Ale to już z rana jak wstanę.
Jakby ktoś to czytał: dobry człowieku rzućże okiem na ten kod.
@Wyrewolwerowanyrewolwer: Nie zajmowałem się za bardzo algorytmami genetycznymi, więc na szybko opieram się na wiki, co może nie być idealnym źródłem, ale mogę napisać parę uwag.

Z tego co rozumiem, to krzyżowanie następuje zawsze (tyle razy, żeby liczebność w kolejnym pokoleniu została zachowana, więc liczba krzyżowań może być różna, np. w zależności od tego, czy i ile najlepszych osobników przenosisz bezpośrednio do następnego pokolenia), a nie tylko z pewnym prawdopodobieństwem, więc
@akurczak: Dzięki. Opierałem się o to źródło pisząc:
http://kolos.math.uni.lodz.pl/~archive/Sztuczna%20inteligencja/6%20Klasyczny%20algorytm%20genetyczny%20cz1.pdf
Rzeczywiście przy krzyżowaniu nie robiłem tego jak powinienem (przeoczenie przy zmianie kodu, bo jestem pewien że we wcześniejszej wersji miałem poprawnie).
Co do prawdopodobieństw mutacji to było ustalone na początku na 0.1, ale że nie bardzo mi działało jak powinno to kombinowałem z różnymi wartościami.
Faktycznie skopałem sprawę z oceną. Poprawię, pobawię się i zobaczę czy daje dobre wyniki. Dzięki!
@Wyrewolwerowanyrewolwer: po pierwsze, błąd za który karają biciem mydłem w zwiniętym ręczniku:
Nie. Rób. Metod. Statycznych
Metody static są powinny być używane jako helpery, nie jako trzon aplikacji.

Druga sprawa - strasznie to komplikujesz, niepotrzebnie.
Wystarczy że zrobisz interfejs Chromosome z metodami mutate(), crossover() i getAdaptationValue(). To wszystko.
Jeżeli chcesz aby dana klasa była chromosomem, po prostu implementujesz ten interfejs.

Robiłem kiedyś jedną z możliwych implementacji AG, zaraz ci pokażę mój
@Wyrewolwerowanyrewolwer:
https://gist.github.com/anonymous/ad1145a530071a621459 - taki mam interfejs Chromosome.

A tu masz mój kod głównej klasy algorytmu.
https://gist.github.com/anonymous/46120b64d184986e9d3c

Zauważ kilka rzeczy.
1. Obiekty Random są drogie i ciężkie, nie twórz ich co 10 linijek.
2. Implementuję interfejs Callable co daje ci:
- możliwość asynchronicznego wykonania całego procesu algorytmu
- możliwość wrzucenia wielu tasków do puli wątków.
a następnie użycia wyniku.
3. Moja implementacja wybiera najlepiej przystosowany chromosom i go zwraca.
4. Klasa GeneticTask
@lerner: W Twojej implementacji wywołujesz dwa razy z rzędu crossover. Zakładając nawet prosty problem, jak u @Wyrewolwerowanyrewolwer, czyni to bardziej skomplikowanym implementację Chromosome - locus jest losowy, ale trzeba skontrolować, żeby w obu przypadkach wybrać tę samą wartość. Podobnie, w jego zagadnieniu, prawdopodobieństwo mutacji ma dotyczyć każdego z genów z osobna, a nie całego chromosomu.

Pobawiłem się trochę generykami, by osiągnąć coś, co będzie na tyle ogólne, by ładnie