Neurony w f1 

Podczas oglądania struktury SN stworzeń w języku f1 zauważyłem, wg tego, jak strukturę SN pokazuje graficznie okienko ‘Genotype’ w programie FRAMSTICK, że "neurony" efektorów nie są neuronami, lecz w rzeczywistości parami neuronów. Skutek tego jest taki, że w f1 w neuronach "adresy względne" neuronów nie są (jak to ma być wg opisu języka f1) prawdziwymi adresami względnymi. Stałyby się nimi dopiero wtedy, gdyby każde te rzekome „neurony” efektorów rozdzielić na dwa neurony i zamienić miejscami.

Czy to program FRAMSTICK źle pokazuje graficznie strukturę SN ?

Czy może to tylko w genotypach f1 jest stosowany taki 'zepsuty' język f1 ?
Jeśli to jest tylko wina ‘zepsutego’ f1, to czy istnieje też 'poprawny' język f1 (z prawidłowym adresowaniem względnym) i czy można go używać ?
Próbowałem np. zamiast [|0:2] napisać [0:2][|,-1] lub [0:2][|] (taki zapis (z domyślnym adresem względnym=-1) byłby chyba naturalny), ale nie było to dobrze rozpoznawane (był wtedy błąd lub brak połączenia).
Taki ‘zepsuty’ język f1 byłby niewygodny w użyciu (przy ‘poważniejszym’ zajmowaniu się nim), ponieważ przy oglądaniu takiego programu trzeba „w myśli” rozkładać każdy rzekomy neuron efektora na dwa neurony, a przy tworzeniu programu w f1 (‘ręcznie’ lub programem) najpierw trzeba tworzyć program w ‘poprawnym’ f1 (aby ustalić właściwe adresy względne), a potem tłumaczyć go do ‘zepsutego’ f1.
Jaki byłby prawidłowy zapis efektorów w poprawnym języku f1’ (a więc bez ":" w efektorach) ?, tzn. np. jak zapisać w f1 rzekomy neuron [|0:2] jako dwa neurony ?

Maciej Komosinski's picture

W poprzednim wątku padło już to pytanie, i wtedy napisałem, że na stronie poświęconej f1,
http://www.framsticks.com/a/al_geno_f1.html
w ramce na dole jest wyjaśniona "old, deprecated syntax" (stara, niezalecana składnia), i pod spodem są też wyjaśnione i opisane jej przykłady, wraz ze schematem. Zapis X[|0:2] jest przykładem takiej właśnie starej, skróconej składni (mięsień i neuron zapisany razem); taki zestaw prawidłowo zapisuje się jako X[N,0:2][|,-1:1] – albo ewentualnie pomijając "N" (domyślny typ neuronu) jako X[0:2][|,-1:1]. Można też odwrócić kolejność neuronów.

Aby upewnić się, że te zapisy znaczą to samo, można użyć CLI albo konsoli w GUI i porównać konwersję do f0:

> var g=Geno.newFromString("X[|0:2]"); Simulator.print(g.f0genotype);
[INFO] Script::Message - p:
p:1
j:0, 1, dx=1
n:p=1
n:j=0, d="|:p=0.25,r=1"
c:0, 0, 2
c:1, 0

> var g=Geno.newFromString("X[N,0:2][|,-1:1]"); Simulator.print(g.f0genotype);
[INFO] Script::Message - p:
p:1
j:0, 1, dx=1
n:p=1
n:j=0, d=|
c:0, 0, 2
c:1, 0

Jak widać, jedyną różnicą w obu zapisach f0 jest to, że w górnym zapisie podano wartości parametrów mięśnia, które są tu wartościami domyślnymi i dlatego są opcjonalne (stąd dolny zapis je pomija).

Przetłumaczyłem cały genotyp z Reproduction do 'nowego' języka f1:

ddGGGbblllfffX
[0:2.420,2:-2,1:-1]
[-1:1,0:1,0:-1]
[-1:1](RRlllfffMMMX
[-1:-10][|,-1:1]lllFFFMMMgggggX
[-3:-1][|,-1:1],gggfffIXlllfffMMMsX
[12:10,6:-10][|,-1:1](RRlllfffMMMIX
[-7:-10][|,-1:1]lllFFFMMMIggggX
[-9:-1][|,-1:1]
[1:1][Sf],,RRlllfffMMMIX
[-13:10][|,-1:1]lllFFFMMMIgggX
[-15:-1][|,-1:1]
[1:1][Sf]),RRlllfffMMMX
[-19:10][|,-1:1]lllFFFMMMgggggX
[-21:-1.784][|,-1:1])

Jednak po przetłumaczeniu ich obu do f0, programy te różnią się (tylko) wartościami w parametrze 'd' (i nie chodzi tu o wartości domyślne) - na przykład pewna instrukcja w f0 po konwersji z f1-starego:
n:j=1, d="|:p=0.732143,r=0.333333"
ta sama instrukcja po konwersji z f1-poprawnego
n:j=1, d=|

Po podstawieniu powyższego genotypu do programu 'Reproduction' zamiast oryginału, pierwszy osobnik bardzo źle chodzi, nie potrafi zdobyć pożywienia i na tym kończy się eksperyment. Natomiast 'oryginalny' genotyp działa dobrze.

Wynikałoby z tego, że podana metoda konwersji genotypów z języka f1-starego do f1-nowego nie jest poprawna (a metoda poprawna byłaby bardzo skomplikowana).
Może istnieje jakiś program tłumaczący prawidłowo z f1-starego do f1-nowego ?

Maciej Komosinski's picture

Nie ma konwertera pomiędzy "f1 starym" a "f1 nowym" ponieważ nie zakładaliśmy, że taka ścieżka postępowania będzie kiedykolwiek popularna. Nowe genotypy powinny być tworzone i ewoluowane przy wykorzystaniu "f1 nowego", a stare zachowują swoje działanie dzięki zapewnieniu obsługi "f1 starego". Wspólnym mianownikiem i bezpośrednim sposobem opisu organizmów jest f0.

W starych wersjach Framsticks (3.2rc5 i wcześniejszych) była drobna różnica w interpretacji mięśni w "f1 starym" i "f1 nowym". W "f1 starym" kątowy zakres (range, r) pracy mięśni wynikał z podziału (rozgałęzień) struktury ciała, a jego siła (power, p) wynikała z genów-modyfikatorów (Mm). W "f1 nowym" w wersjach

Aby zapisać genotyp z "f1 starego" w "f1 nowym", oprócz opisanej w poprzedniej notce korekty składni i względnej numeracji neuronów, w wersjach

n:j=1, d="|:p=0.732143,r=0.333333"

to w "nowym f1" powinniśmy podać [|,p:0.732143,r:0.333333], bo samo [|] w "nowym f1" oznaczało w wersjach =3.2rc6 wyznaczanie parametrów mięśni "power" i "range" jest takie samo w "f1 nowym" jak w "f1 starym", czyli zależą one od modyfikatorów Mm oraz rozgałęzień ciała.