Newsgroup: it.comp.ia
Titolo: Gnammysecteur

Non sapendo resistere ad un invito ben formulato di Augusto Pucci, vi
invio una chilometrica descrizione del programma (mio) che gli ho
spedito qualche settimana fa, con poche modifiche; spero che possa
essere di qualche interesse per il progetto gnammy; scusate se e'
lunghissima e piuttosto confusa, direi tumorale.
<<
L'ambiente e' derivato da quello di robowars, quindi gli gnammy in
questo caso sono dei robottini quadrati, con una torretta girevole,
attraverso la quale possono vedere un punto davanti a se'. Nel mondo ci
sono solo due tipi di oggetti. I robottini stessi, e dei quadratini
verdi inanimati che rappresentano delle particelle di cibo ("le pizze"),
distribuiti in modo del tutto casuale. I robottini si nutrono
indifferentemente delle pizze e dei loro simili; in effetti, nelle
versioni precedenti le pizze (o meglio i vegetali) non c'erano neppure,
e le ho introdotte solo quando mi sono reso conto che senza di esse
l'universo soffriva di un disequilibrio energetico che finiva per
generare situazioni paradossali (cioe', senza pizze l'energia veniva
introdotta nel sistema assegnandone una quantita' definita ai robottini
al momento della nascita; si creavano societa' in cui i vecchi
sopravvivevano all'infinito mangiando i loro stessi figli, oppure
societa' in cui i figli si mangiavano i vecchi per poi diventare a loro
volta vecchi ed essere mangiati dai figli).
I robottini non si nutrono affiancandosi al cibo, ma sparandogli
(evidente eredita' di robowars!) da una distanza ravvicinata. Quando
sparano, una parte della loro energia si trasmette al colpo; quando
questo giunge a bersaglio, una parte della salute del bersaglio,
proporzionale all'energia assegnata al colpo e alla lunghezza del
tragitto, passa dal bersaglio all'attaccante, che quindi si trova
"nutrito". L'energia, come in robowars, e' necessaria per muoversi e
sparare, e cresce da sola fino ad un massimo che a sua volta cresce
quando il robot si nutre.
Quando la salute di un robot scende sotto zero, il robot muore. Allora
il programma sceglie, fra i robot restanti, quello piu' in salute; lo
copia introducendo delle mutazioni nel suo programma, gli assegna una
parte della salute del genitore, sottraendola a quest'ultimo, e lo
introduce nel gioco, accanto al robot genitore.
Quindi la popolazione del mondo e' sempre costante, il che' e' una grave
distorsione delle leggi di natura, direi. Sono stato costretto ad
introdurla dal fatto che il mio computer e' troppo lento per gestire
piu' di una decina di robots (il mio computer pero' e' un'Amiga a 14
-quattordici- Mhz, e Amos Basic e' un linguaggio interpretato). Ho
pensato comunque che il modo in cui viene effettuata la scelta del robot
che si riproduce sia abbastanza ragionevole.
Ogni robottino e' costituito da un programma che fa le funzioni del dna,
e da un array di variabili intere che forma tutta la memoria sulla quale
il programma agisce. Nella riproduzione, solo il dna viene passato,
mentre la memoria si perde.
I sensi del robot sono dati sull'ambiente circostante che il programma
infila direttamente dentro precise locazioni nella memoria di ciascun
robot; e un robot per compiere un'azione non ha che da immettere un
valore opportuno in un'altra cella della memoria. Ad esempio, l'azione
di girare la torretta ("la testa") di un grado e' codificata come "1 58
store" ovvero immetti il valore 1 nella locazione 58.
Il programma pero' non possiede istruzioni di salto o di ciclo di nessun
tipo, ma e' invece formato da blocchi che si attivano, anche in
parallelo, sotto precise condizioni.
Per esempio, il robot "primitivo" possiede questo blocco (che si
potrebbe chiamare gene):
242 1 0 spara:
10 12 store
end
La prima riga, in cui la parola spara e' solo un commento, e' un
attivatore, e significa: se il valore della locazione 242 e' 1 +- 0
esegui il blocco; la seconda riga significa immetti 10 nella locazione
12, cioe' spara un colpo di potenza 10; la terza e' un terminatore,
ovviamente. La locazione 242 e'... la terminazione del nervo ottico,
volendo, e vale 1 se c'e' qualcosa nel centro del campo visivo.
Il programma completo del robot primitivo (cioe' il robot, programmato
da me, le cui copie popolano il mondo al primo lancio del programma,
prima di mutare) e' il seguente:
300 0 0 guarda:  /* se il valore della loc. 300 vale 0, cioe' sempre,
sposta la torretta
1 58 store
end
300 0 0 muovi: /* muovi sempre avanti
10 54 store
end
241 1 0 gira:  /* se urti contro qualcosa gira di 90 gradi
90 58 store
end
242 1 0 spara:  /*se vedi qualcosa spara
10 12 store
end
Quindi primitivo e' formato da questi soli quattro geni. Essi formano
delle unita' minime di senso. Durante la riproduzione hanno luogo delle
mutazioni: in generale, possono cambiare sia gli attivatori (cambiando
ad esempio l'attivatore del quarto gene in 241 1 0, il robot spara
quando urta contro qualcosa), sia il contenuto dei geni (per esempio,
cambiando nel terzo gene 90 58 store in 0 58 store, i robot si bloccano
sugli ostacoli, e moriranno in breve di fame). I geni possono essere
duplicati in blocco e questo puo' in alcuni casi raddoppiarne l'azione e
in altri casi non produrre nulla; ma la copia di un gene puo' essere
mutata a piacimento senza che il robot perda funzioni fondamentali.
La semplificazione del linguaggio e' diretta a far si' che il maggior
numero possibile di mutazioni produca mediamente una frase dotata di
senso, anche se ad un programmatore meno pigro di me sarebbe bastato
inserire una grammatica context-free a generare le mutazioni. In verita'
temo di aver semplificato troppo, perche' mi rendo conto adesso che
un'istruzione del tipo "if (a and b and c) " ecc, e' praticamente
intraducibile nel linguaggio (si potebbe pero' modificarlo in modo
abbastanza semplice, ad esempio nidificando gli attivatori). Nota pero'
che un programma scritto in questo linguaggio e' abbastanza simile alla
codifica di una rete fuzzy. Benche' le istruzioni usate in primitivo
siano praticamente due sole, il linguaggio ne supporta altre:
+ , - , *, / , sqr, abs sin cos tan acos asin atan < > and or not store
sysread end pop
dove i parametri vengono forniti sempre nel consueto ordine della
notazione inversa polacca. Sysread e' semplicemente il contrario di
store, pop effettua un pop dallo stack..
I sensi supportati sono una rudimentale vista (con tre, dico tre,
neuroni sulla retina), un ancor piu' rudimentale udito (il rumore dei
colpi in avvicinamento), una sorta di tatto, il dolore per i colpi
subiti, e il doppler, cioe' la velocita' di movimento tangenziale di un
oggetto nel campo visivo. Tutti i sensi comunque forniscono informazioni
solo relative al sistema di riferimento del robottino stesso (e anche i
movimenti del robottino sono relativi al suo sistema di riferimento)
cosi' che il robot non conosce nulla di assoluto sull'ambiente.
Gia' che ci sono ti elenco quelli che credo essere difetti e pregi del
programma.
Partiamo dai difetti:
1) Gestire otto robot non ha senso, l'evoluzione e' un fenomeno che
riguarda i grandi numeri.
2) La popolazione dovrebbe essere variabile
3) I sensi dei robot sono rudimentali e non soggetti ad evoluzione, si
evolve solo la capacita' di sfruttarli.
4) Non ci sono ostacoli a caratterizzare l'ambiente
5) Le possibilita' di comunicazione fra i robot sono limitatissime
(cioe' non mi sento di escluderle a livello puramente teorico)
6) La riproduzione sessuata e' fuori discussione a causa di 5)
7) I robot non decidono autonomamente quando riprodursi (a causa di 2) e
non si occupano affatto della duplicazione del proprio dna, che e' a
carico del programma
8) Non esiste una quantificazione seria delle risorse energetiche del
sistema- cioe' non tutte le azioni richiedono energia per essere
compiute
E i pregi:
1) Il linguaggio consente mutazioni che danno risultati inaspettati.
2) Il sistema ad attivatori di porzioni di codice ricorda molto il DNA
vero e si presta benissimo alla separazione dei geni, al crossing-over,
alla riproduzione sessuata, alla duplicazione dei cromosomi, alla
simulazione di caratteri dominanti e recessivi.
3) Le piu' importanti caratteristiche individuali, come la durata della
vita, l'energia massima raggiungibile, l'energia mediamente a
disposizione, non sono affatto codificate nel dna, ma dipendono dalle
interazioni di questo con l'ambiente. Per lo stesso motivo, nulla nel
dna costringe un robot a morire.
A un livello un po' soggettivo, posso anche aggiungere, fra i pregi del
programma, che mi ha permesso di assistere a situazioni descritte dagli
evoluzionisti, come strategie evolutive stabili (mix di comportamenti
diversi in proporzioni ideali per il vantaggio di ogni singolo
comportamento), avvicendamenti fra specie con comportamenti diversi,
diffusioni nella popolazione di geni che ne determinano la scomparsa,
eccetera.
(In realta' alcuni di questi risultati li ottenevo con versioni
precedenti, piu' ingenue, in cui i robots, ad esempio, conoscevano la
loro posizione  assoluta sulla matrice). Una volta, come gia' ti ho
raccontato, dei robots hanno imparato ad aumentarsi la salute al massimo
da soli, questi depravati, e ho dovuto sterminarli mandandogli un
flagello!
Partendo dall'elenco dei difetti, ti diro' quindi in che cosa secondo me
questo programma si potrebbe migliorare, ovvero di cosa dovrebbe tenere
conto il programma degli Gnammy per essere interessante.
1) Dovrebbe gestire molti gnammy, diciamo almeno un centinaio
2) la popolazione dovrebbe poter variare anche di molto
3) i sensi degli gnammy dovrebbero essere piu' raffinati: ma sarebbe
anche importante che fossero in grado di evolvere. Naturalmente questo
non accade se le procedure che determinano l'input sensoriale sono
governate dal programma anziche' dal singolo gnammy.
4) L'ambiente dovrebbe essere vario, cioe' contenere ostacoli e oggetti
di varia natura. Anche qui, naturalmente, il dna dello gnammy dovrebbe
mettere lo gnammy nelle condizioni di distinguere oppure no oggetti
differenti, ma non, attenzione, perche' una particolare locazione di un
vettore contiene un valore piuttosto che un altro, altrimenti la scelta
sarebbe fra due sole possibilita' entrambe date dal programmatore, con
buona pace dell'imprevedibilita' del sistema.
5) con sensi piu' raffinati, anche la comunicazione sarebbe piu'
efficace. Io prenderei in considerazione segnali di natura chimica, e
quindi la possibilita' di lasciare tracce odorose (!) nell'ambiente, ad
esempio. In effetti nel programma che ti ho inviato esiste un abbozzo di
questa caratteristica, anche se non e' attivato: i robottini possono
lasciare in una matrice "sovrapposta" al campo di gioco- che non e' una
matrice ma uno spazio continuo, il che in effetti non giova alla
velocita' del tutto- delle tracce costituite da un valore arbitrario:
quando un robottino passa sopra una di queste tracce, si attiva la cella
della sua memoria corrispondente a quel valore, il che puo' servire per
comunicare ma anche per ingannare gli altri robottini, ad esempio
bloccandogli i movimenti o facendogli vedere un finto ostacolo -avevo
provato a programmare dei "ragni" in questo modo.
6) Data una certa comunicazione, si potrebbe pensare ad una riproduzione
sessuata. Poiche' questa e' un prodotto dell'evoluzione, si potrebbe
pensare semplicemente ad un meccanismo  di scambio di informazioni
genetiche, come nei batteri, che potrebbe in seguito evolversi a
riproduzione sessuata, appunto. Ma come sempre, come pensare a questo
come ad un caso particolare di una serie piu' ampia di azioni possibili?
Boh.
7) Che gli gnammy debbano occuparsi di quando riprodursi, e' ovvio. Meno
ovvio e' come possano fare per gestire direttamente la loro riproduzione
( perche' i meccanismi di riproduzione sono anch'essi importanti, per
esempio determinano un fattore chiave, la frequenza e il tipo delle
mutazioni nella prole).
8) Le risorse energetiche del sistema devono essere precise e
quantificabili, e la piu' piccola azione deve consumare una parte di
queste risorse. Per azione non parlo per esempio di movimento nello
spazio, ma anche la lettura e l'esecuzione di una porzione di dna deve
richiedere energia. Un'altra idea che ho e' che mangiare richieda
energia, cioe' il cibo possa essere assunto solo grazie ad un opportuno
metabolismo.
9) Interessante sarebbe obbligare gli gnammy a metabolizzare il cibo che
ingeriscono; pensavo per esempio ad un meccanismo in cui gli gnammy si
nutrono di stringhe, e tanto maggiori sono le risorse energetiche che
riescono a trarne quante piu' sono le previsioni che riescono a fare
sulla sequenza di caratteri nella stringa. Si potrebbe costringerli ad
espellere parti di stringa non abastanza spezzettate in parti
prevedibili, ad es. Questo farebbe si' che alcuni gnammy possano
rendersi indigesti ad altri a causa del loro stesso dna, o che si
possano sviluppare mutazioni che migliorano il metabolismo energetico di
uno gnammy, o che alcuni gnammy possano nutrirsi di cio' che altri
espellono, ecc.
10) Forse il punto 9) o alcune sue parti potrebbero rendere possibile la
nascita, se non di organismi complessi, almeno di colonie di gnammy in
qualche modo cooperanti o simbiotici.  >>
Ciao,
Carlo Comis

invio una chilometrica descrizione del programma (mio)
Hai visto che ti so grattare bene la pancia ? :-)
Augusto Pucci
Webmaster di Prospektiva On-line
http://go.to/Prospektiva

> ognuno di noi a due idee..... <<
--
Posted from 
ts0001.tesoro.it
 [195.103.126.2]
via Mailgate.ORG Server - 
http://www.mailgate.org

 Ciao Emiliano.
Ciao,
mi sembra un'ottima idea... per cominciare potresti mandarmi una copia del tuo
programma, con descrizione?
Carlo.Com