Algorytm działania świata/eksperymentu 

Czy istnieje gdzieś konkretny opis, algorytm, schemat blokowy itp. działania świata na poziomie całych stworzeń i genotypów (bez ich wnętrza - neurony i części ciała są na tym poziomie nieistotne), który wyjaśniałby m.in.:

1.
Co się kolejno dzieje ze stworzeniami (o konkretnych numerach)?, tzn. np. w różnych obiektach: w puli genów, w populacji, itp.? (Czy że populacja to ta grupa stworzeń, które jednocześnie żyją w świecie?)

2.
Czy w interpreterze świata (Framsticks.exe) działa jakiś podstawowy 'ukryty', 'domyślny' interpreter wykonywania świata (na poziomie zajmowania się całymi stworzeniami i genotypami), a w pliku expdef użytkownik może sobie dodać do niego tylko jakieś uzupełnienia i modyfikacje - czy przeciwnie: wszystko musi być w pliku expdef? (np. gdy wczytałem do programu Framsticks.exe (z jego 'okna') plik typu expdef z usuniętym programem (poza nagłówkiem) i wczytałem plik typu sim z usuniętymi parametrami, to (po zapytaniu się o dodawanie stworzeń) świat zaczął się wykonywać i coś się tam działo).

3.
Z których miejsc programu interpretera świata (tzn. w opisie jego algorytmu czy w schemacie blokowym) wywoływane są wszystkie zdarzenia? - z ew. jawnym wskazaniem, odróżnieniem jego części stałej, 'ukrytej' (wbudowanej we Framsticks.exe) od jego części w jakimś 'zwykłym' pliku expdef (np.'w standard.expdef').

I jeszcze dodatkowe pytania:
4.
Wg opisów, zdarzenia onExpDefLoad i onExpInit praktycznie wywoływane są po sobie i tylko raz na początku długotrwałego eksperymentu, a więc właściwie teoretycznie wystarczyłoby używać tylko jednego z nich (uzupełnionego o zawartość tego drugiego) - czy tak?

5.
Do twórców tego systemu: czy nie moglibyście udostępnić w Internecie sfilmowanych spotkań (odbywających się, jak przeczytałem, okresowo w Poznaniu) - tych już odbytych i przyszłych - na których są m.in. wyjaśniane różne sprawy we Framsticks? Mogłaby być to pewna pomoc dla użytkowników.

Maciej Komosinski's picture

ad 1.
Algorytm działania eksperymentu jest definiowany przez pliki expdef. Dla "standard.expdef" istnieje słowny opis tu:
http://www.framsticks.com/a/doc_expdef-standard.html
natomiast zawsze najpewniejszym źródłem informacji o tym, co się dzieje po kolei, jest skryptowe źródło, czyli plik *.expdef.

ad 2.
Jeśli expdef nic specjalnego nie chce robić, to działa tylko zwykła symulacja - czyli symulacja mechaniki organizmów, ich sieci neuronowych, kolizje... ale skoro expdef nie określa handlerów dla poszczególnych zdarzeń, to nic szczególnego się nie dzieje. Swoją drogą zaczęcie od "pustego" expdefa to dobra droga, żeby dodając pojedyncze elementy dojść do własnej, docelowej koncepcji eksperymentu. Albo można wykorzystać jako zaczątek inny prosty expdef (np. "neuroanalysis.expdef" albo "reproduction.expdef").

ad 3.
Skryptowe handlery zdarzeń są wywoływane w momencie zajścia danego zdarzenia podczas symulacji.

ad 4.
onExpDefLoad jest wywoływane w momencie załadowania eksperymentu, natomiast onExpInit - w momencie kliknięcia przycisku "Initialize experiment", zatem użytkownik może tego przycisku wcale nie kliknąć, albo kliknąć kiedy mu się podoba, w celu uzyskania określonego efektu (np. zresetowania stanu eksperymentu lub zainicjowania stanu).

ad 5.
Nie możemy udostępnić nagranych byłych spotkań bo nikt ich nie nagrywał :-) Obecnie takie grupowe spotkania już się nie odbywają - przyjęły formę skuteczniejszych, indywidualnych konsultacji lub zajęć/wykładów/laboratoriów (w semestrze zimowym na Politechnice Poznańskiej, w letnim - na Uniwersytecie im. Adama Mickiewicza).

> Jeśli expdef nic specjalnego nie chce robić, to działa tylko zwykła symulacja (...)
> najpewniejszym źródłem informacji o tym, co się dzieje po kolei, jest (...) plik *.expdef

Starając się zrozumieć program "Standard.expdef", przeczytałem dwa pierwsze podprogramy, które (i tylko one bezpośrednio) są wykonywane na początku tego eksperymentu: ‘onExpDefLoad’ i ‘onExpInit’. Jednak nie udało mi się tam zauważyć instrukcji, która tworzy w świecie pierwszy organizm poprzez skopiowanie jakiegoś genotypu z puli genów (i z Genotype) do tego świata (np. do obiektów Populations, Population, Creature).

Dopiero coś takiego spowodowałoby chyba wywołanie zdarzenia ‘onBorn’ , a potem innych zdarzeń (w tym ‘onStep’).

Ponieważ wszystkie działania (poza "zwykłą symulacją") wykonuje tylko program ‘expdef’ (z wywoływanych zdarzeń), więc wynikałoby z tego, że świat pozostaje pusty i program dalej nie może się "merytorycznie" wykonywać.

Domyślam się więc, że może czegoś nie zauważyłem lub nie zrozumiałem? (zdarzenie ‘onBorn’ wywołuje ‘place_randomly’ – czy ‘onBorn’ tylko modyfikuje umieszczenie stworzenia w terenie, czy musi to zrobić, bo inaczej stworzenie nie pojawi się w świecie?)

-----

Wg tego, co zrozumiałem, to:

Obiekty Genepools, Genepool i Genotype są jakby poza światem żyjących stworzeń i nie są w nim używane (są dla niego tylko źródłem genotypów). Choć te obiekty mogą być przydatne przy pewnego rodzaju uproszczonej metodzie seryjnej, ‘taśmowej’ produkcji genotypów, to właściwie nie są one konieczne i potrzebne (i właściwie może tylko komplikowałyby sytuację) w bardziej "naturalnym" sposobie działaniu świata i ewolucji, tzn. przy metodzie rozmnażania i ewolucji polegających na tym, że spotyka się dwoje rodziców i tworzy potomka z wpisanym do nowego obiektu Creature genotypu/fenotypu, powstałego z krzyżowania i mutacji genotypów rodziców (trzeba by tylko wcześniej wymyślić odpowiedni język genotypów i metodę krzyżowania, ale to już inna sprawa).

Wtedy nie ma potrzeby wstawiać tego potomka (nowy obiekt Creature) do "puli genów", lecz od razu można go umieścić w odpowiedniej grupie populacji i chyba wtedy (?) powinno nastąpić zdarzenie ‘onBorn’, które umieści obok rodziców to ich dziecko.

Mogę się domyślać (bo nie ma dobrego opisu obiektów), że ("przy narodzinach") genotyp dziecka należy wpisać do Creature.model.geno.genotype i/lub do Creature.geno.genotype (będzie potrzebny, gdy to dziecko samo stanie się rodzicem), a przetłumaczony (z tego genotypu) fenotyp w języku f0 należy wpisać chyba do Creature.liveModel.geno.f0genotype, bo z niego powstanie ciało stworzenia?

Podczas życia stworzenia mogą się uczyć, a więc mogą powstawać nowe neurony, zmieniać się połączenia między nimi itp. W jako sposób należy to robić – czy wystarczy odpowiednio zmieniać fenotyp np. w polu Creature.liveModel.geno.f0genotype, czy coś innego?

Czy powyżej opisana metoda działania świata jest tu poprawna i możliwa?

Maciej Komosinski's picture

> Starając się zrozumieć program "Standard.expdef", przeczytałem dwa pierwsze podprogramy,
> które (i tylko one bezpośrednio) są wykonywane na początku tego eksperymentu: ‘onExpDefLoad’
> i ‘onExpInit’. Jednak nie udało mi się tam zauważyć instrukcji, która tworzy
> w świecie pierwszy organizm...

Bo kluczem jest tu zdarzenie onStep(). To ono wywołuje się co krok i jego handler "robi" (powoduje) większość rzeczy podczas symulacji.

Proszę zerknąć na slajd "event-based architecture" (szósty w najnowszym sz_scripting.pdf).

Aby zacząć tworzyć własne definicje eksperymentów lub zrozumieć ich działanie, lepiej zacząć od najprostszych przykładów expdef'ów (takich jak neuroanalysis, learn_food, reproduction). "standard.expdef" jest akurat najbardziej skomplikowaną definicją eksperymentu.

> Obiekty Genepools, Genepool i Genotype są jakby poza światem żyjących stworzeń...

Tak, i reproduction.expdef stanowi przykład ewolucji nie wykorzystującej puli genów - jedynie żyjące stworzenia są nośnikami swojej informacji genetycznej.

> Mogę się domyślać, że przy narodzinach genotyp dziecka należy wpisać...

Do tworzenia organizmów służą funkcje Populations.createFrom..., a w momencie tworzenia genotyp musi być już znany i nie podlega późniejszym zmianom. Dlatego w razie wątpliwości najlepiej wzorować się na istniejących źródłach expdef'ów, czytać dokumentację, a czasem eksperymentować. Często to, czy przypisujemy genotyp do pola, czy wykonujemy inne operacje zależy od celu, jaki chcemy osiągnąć.

> Podczas życia stworzenia mogą się uczyć, a więc mogą powstawać nowe neurony...

We Framsticks nie ma obecnie możliwości modyfikowania "składu" organizmu podczas życia. Części ciała mogą się ruszać, neurony mogą zmieniać swój stan, zmieniać działanie, gromadzić informacje itp., ale elementy organizmu nie mogą być dodawane ani usuwane.

Oglądałem te pliki 'expdef' i są tam zdarzenia, których opisu (np. kolejności względem podobnych) nie ma w podręcznikach i opisach (choć można się domyślać ich znaczenia), jak np. onCreaturesBorn, onCreaturesStep.

W programie Framsticks nie ma jednak możliwości wczytania tych plików - w ogóle rozszerzenie 'expdef' nie jest tam dopuszczalne:

1. w parametrze przy włączaniu 'Framsticks.exe' (w komunikacie jest wtedy m.in. "Only .SIM, .GEN and .EXPT filename extensions allowed"),
2. w 'File.Load....',
choć we "FRAMSTICKS MANUAL" jest napisane:
> Any file with the ".expdef" extension, which is present in the "scripts" directory,
> will automatically appear on the list of experiment definitions to choose from.

Maciej Komosinski's picture

> Oglądałem te pliki 'expdef' i są tam zdarzenia, których opisu (np. kolejności względem podobnych) nie ma w podręcznikach i opisach

W razie wątpliwości, można w tych zdarzeniach użyć funkcji Simulator.print(...), żeby w pliku messages.out i okienku komunikatów zobaczyć kiedy co się dokładnie wywołuje.

> W programie Framsticks nie ma jednak możliwości wczytania tych plików - w ogóle rozszerzenie 'expdef' nie jest tam dopuszczalne, choć we "FRAMSTICKS MANUAL" jest napisane...

Manual ma rację. W momencie startu symulatora skanowany jest katalog scripts i wszystkie poprawne definicje eksperymentów (*.expdef) trafiają na listę wyboru. Z tej listy wybiera się potem jedną definicję eksperymentu, która ma w danym momencie obowiązywać. W GUI lista expdef'ów jest w okienku parametrów jako pierwsza.