2016-06-26, 12:58 PM
(2016-06-26, 09:09 AM)Konq napisał(a): Ale nie o to chodzi. Chodzi o program, który nie replikuje rozwiązania problemu tylko sam siebie. Taki mityczny asembler, który potrafi nie tylko programować inne programy, ale posiada też funkcje. Ponadto, analogicznie do żywych organizmów, powinien być podatny na błędy wynikające ze środowiska w którym się znajduje i potrafić reagować na te błędy jednocześnie ulepszając każdą następną kopię. Następne kopie więc muszą współistnieć z programem wyjściowym, bo tworzą razem ekosystem.
W zasadzie tak to mniej-więcej działa w programaniu genetycznym. Jedyna różnica: program nie replikuje się sam, tylko jest replikowany przez środowisko, w którym jest testowany - i to środowisko symuluje też krzyżowanie, mutacje, selekcję, itp.
Podstawowa zasada jest prosta: mamy początkowe osobniki posiadające kod (np. jakiś sposób zapisu programu), który jest odpowiednikiem genotypu. Symulator tworzy na ich podstawie kolejne pokolenie - mieszając ze sobą kod matki i ojca (krzyżowanie) i wprowadzając losowe zmiany (mutacje) o zadanym prawdopodobieństwie. Istnieje tzw. funkcja dostosowania, czyli pewien sposób oceny osobnika. Np. jeśli jest to program rozwiązujący jakieś zadanie, to po prostu możemy mu kazać je rozwiązać i ocenić wynik. Na podstawie funkcji dostosowania dokonuje się selekcji, czyli najlepsze osobniki przeżywają, a resztę usuwamy. Można też np. losowo pozwolić przezyć części mniej dostosowanych osobników, żeby pula nie została zdominowana przez jedną gałąź ewolucji. Przeprowadza się też masowe wymierania oraz izolację części osobników na "wyspach" - takie zdarzenia przyspieszają powstawanie nowych "pomysłów" w genotypie.
Ponieważ wszystko dzieje się w komputerze, to czas biegnie szybko i można przesymulować tysiące pokoleń, obserwując przy okazji ewolucyjne zmiany.
Ogólnie trochę bardziej przypomina to dobór sztuczny niż naturalny. Próbujemy metodą ewolucyjną wyhodować osobnika spełniającego pewne ustalone wcześniej wymagania.
Nie miałem jeszcze okazji tego potestować, ale jest taki projekt http://jgap.sourceforge.net/doc/robocode/robocode.html który służy jako prosta demonstracja. To jest gra, w której walczą dwa roboty i zadaniem gracza jest takie oskryptowanie swojego robota, żeby wygrał walkę. Strategię robota można poddać ewolucji, a potem z "wyewoluowanego" robota wygenerować kod w Javie.
Mają tam przykład całkowicie poprawnego i sensownego (choć prostego) kodu, który powstał metodą ewolucji i potrafi sterować robotem - zmieniać kierunek ruchu i strzelać w odpowiednich momentach.
Są też w Internecie bardziej rozbudowane przykłady, np. dla sieci sortujących.
Także generowanie kodu metodą ewolucyjną jest jak najbardziej możliwe - co obala jedną z najpopularniejszych analogii stosowanych przez kreacjonistów.