Newsgroup: it.comp.ia
Titolo: programmazione genetica - memoria e conoscenza

Considerata la penuria di post mi permetto di scrivere qualche delirio che 
mi gira per la testa negli ultimi giorni.
Immaginiamo di avere un 'giardino virtuale' con due tipi di insetti, 
piante, sassi ed ostacoli invalicabili.
Le piante si riproducono dopo un tempo prestabilito e rappresentano il cibo 
per gli insetti.
Gli insetti:
- devono mangiare per sopravvivere
- possono mangiare piante od insetti morti
- possono raccogliere sassi, posarli o tirarli per uccidere altri insetti.
- possono prendersi cura delle piante perche' si riproducano prima
La funzione di fitness premia sia la sopravvivenza dell'individuo che della 
specie.
Ora comincia la parte delirante, mi sono chiesto se e' possibile dotare di 
memoria fisica gli insetti fornendogli:
- geni per la gestione di contatori, 
- geni che possano resettarla, modificarla, leggerla, ed eseguirne delle 
parti come se fossero codice genetico,
- geni per il riconoscimento di blocchi di codice a se stante (sottorami) 
all'interno della memoria,
- geni per la comunicazione insetto-insetto, ad esempio per lo scambio di 
blocchi di codice (conoscenza).
Ho scoperto l'acqua calda? E' realizzabile? 
Aspetto commenti e pareri, anche deliranti :)
Mieru che deve mettere meno Maraschino nella macedonia.

blocchi di codice (conoscenza).
di nuovo... penso a questo punto che tu parli di "geni" come di
descrizioni di azioni...
il discorso, a questo punto, è che dovresti costruire un linguaggio
genetico per descrivere le azioni di reset memoria, lettura memoria,
esecuzione, ecc., nonché quelli per la comunicazione, ecc.
resta chiaro che in questo linguaggio genetico devono anche essere
previsti dei parametri (lettura di QUALE PARTE della memoria,
comunicazione di QUALE CONCETTO e così via)...
il che porta il DNA degli agenti ad essere qualcosa di simile al
linguaggio macchina di un programma per pc...
ora, quanti programmi per pc possono esistere? non sono infiniti, ma
sono un numero enorme... e per enorme intendo veramente enorme...
dubito che un algoritmo genetico riesca a tirar fuori qualcosa di
sensato da un agente in meno di 1000 anni (di tempo reale)
il fatto è che, oltretutto (conosci un po' di informatica teorica?
macchina di touring? macchina a registri?) ci sono altri vari
problemi, come il fatto che se consideri questi programmi come codice
dna puro e semplice, incrociando due qualunque di questi programmi è
molto più probabile che tu abbia un programma insensato piuttosto che
uno migliore dei due iniziali
bisognerebbe valutare un metodo più coerente per poter incrociare due
programmi in maniera genetica (crossing-over) prima di poter pensare
di realizzare una cosa del genere
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

 di realizzare una cosa del genere
Questo e' un dettaglio implementativo, io non ho l'esigenza (ne il tempo) 
per sviluppare tutto cio', questo discorso era solo per fare quattro 
chiacchere digestive :)
Mieru

 
....Geni e Memi.... Dawkins docet !!
Sono idee senza dubbio interessanti, non so fino a che punto applicabili 
o applicate.
Claudio

ok, facciamo chiacchiere digestive :-DD
posto che utilizzando stringhe di linguaggio di programmazione come
dna non è fattibile dal punto di vista di tempo di esecuzione
dell'algoritmo genetico, possiamo fare digressioni qunato vogliamo,
però credo che prima sia opportuno definire bene l'idea...
i "comandi" del linguaggio sono di lunghezza variabile e hanno fino a
due parametri... ogni comando è un numero e sono numeri anche i due
parametri
1 2 3
può voler dire SE (comando 1) OSTACOLO_DI_FRONTE (parametro 2) INC
CONTATORE (comando 3)
ora, se consideriamo che è possibile che la stringa di comandi sia
1 2 3 4 23 232 41 31  23 ecc.
e che un crossing over possa causare
3 2 3 4 23 232 41 31 23 ecc.
si avrebbe che abbiamo il comando 3 inizialmente, che significava "INC
CONTATORE", poi un 2 che potrebbe significare "GIRA A DESTRA" e 3 che
potrebbe essere il numero di gradi di cui routare verso destra...
come vedi il cambiamento di un solo gene crea un programma totalmente
diverso e che quindi non porta nulla del patrimonio genetico del
genitore
un modo per evitare questo problema è quello di avere comandi di
lunghezza fissa (ad esempio sempre 3 numeri) e consentire
crossing-over solo a blocchi di 3 numeri
nel caso di prima 1 2 3 era l'istruzione e poteva essere sostituita
solo in blocco, con un'altra istruzione sensata (proveniente
dall'altro genitore)
definite queste cose, la memoria "volatile" è rappresentata dai
contatori, ad esempio e dalle celle di memoria (i registri in una
macchina a registri che dalla teoria dell'informatica sappiamo essere
in grado di realizzare qualunque algoritmo), mentre quella genetica da
ciò che si fa con i contatori e con le celle di memoria...
detto questo non è sensato dire che si ha un utilizzo maggiore della
memoria genetica rispetto a quella volatile, poiché la memoria
genetica sono istruzioni, quella volatile è uno spazio di lavoro su
cui lavorano le istruzioni... un po' come dire che per fare un tavolo
si usa più il martello e i chiodi e la sega che il legno


Perdonatemi se mi intrometto.
Mi corre l'obbligo di ricordarvi l'esistenza di DarwinBots - se non lo
conoscete gia'.
Mi pare abbastanza attinente con cio' di cui state parlando. Manca la
possibilita' di eseguire porzioni di memoria- forse la vera essenza
del vostro attuale "delirio". Ma d'altra parte prima di implementare
un modo per eseguire pezzi di memoria come fossero dna, bisognerebbe
forse immaginare un modo per riempirli con dei programmi sensati. E se
i programmi vengono generati solo per mutazione e selezione, non vedo
come potrebbero generarsi in memoria programmi migliori di quelli
contenuti nel dna.
Comunque DarwinBots:
http://digilander.libero.it/darwinbots
giunto alla versione 2.1 e attualmente sviluppato da piu' persone (i
sorgenti sono disponibili, guardate il forum) implementa un piccolo
universo piatto con leggi fisiche che permettono il movimento, la
vista e la comunicazione ( e altro ancora), popolato da robots guidati
ciascuno da un dna-programma che a spanne definirei turing-completo,
basato proprio su geni attivati da condizioni, come nei vostri esempi.
Recentemente e' stata introdotta anche la riproduzione sessuata, con
mescolamento dei geni dei genitori, e, almeno dal punto di vista
genetico, pare funzionare perfettamente. Una pre preview di nuove
features dovrebbe essere disponibile a ore.
Nel caso non lo conosceste, sarei curioso di avere un vostro giudizio.
Ciao,
Anders

contenuti nel dna.
e io che stavo dicendo?!?


uno migliore dei due iniziali
Si, e' vero. In DarwinBots la cosa e' risolta utilizzando una
suddivisione del programma-dna in unita' ermetiche, i geni. Mutando
l'interno di un gene si puo' anche cambiarne completamente la funzione
(e non e' che questo non avvenga anche negli organismi biologici..) ma
gli altri geni in genere restano intatti e funzionanti. Inoltre i geni
possono essere separati e ricombinati fra loro nelle riproduzioni
sessuate, e la cosa funziona alla perfezione. In ogni caso, la
semplice "maggiore probabilita'" di ottenere programmi insensati e'
del tutto ininfluente in un'ottica evoluzionistica, in cui solo i
programmi sensati tramandano le loro caratteristiche ad una progenie.
Ciao,
Anders

Credo proprio che sia l'acqua calda! :)
Guarda qui: 
http://digilander.libero.it/galife/
E anche qui: 
http://digilander.libero.it/darwinbots/
Ciao, Emiliano.


programmi sensati tramandano le loro caratteristiche ad una progenie.
ahem... ma tu li leggi i miei messaggi o ti limiti a ripetere ciò che
ho detto io?


ho detto io?
Credo che la mia colpa principale sia quella di attribuire ai tuoi
post piu' significato di quanto ne abbiano in effetti.
1) Non sta scritto da nessuna parte che in un "codice puro" parametri
e istruzioni debbano essere rappresentati da codici uguali, distinti
solo dalla posizione.
2) Anche fosse, non e' l'unico problema che si presenta nella
mutazione di programmi. E' il piu' banale, in quanto basta usare
codici diversi per i parametri (indirizzi, valori immediati) e per le
istruzioni.
3) Non e' vero affatto che ci vogliono tempi biblici per ottenere
risultati sensati dalla mutazione/selezione: e ti ho citato vari
programmi che lo fanno.
4) A questo proposito, il fatto che le mutazioni vantaggiose siano
molto piu' improbabili di quelle svantaggiose, e' del tutto
irrilevante visto che si parla, appunto, di mutazione/selezione.
Infine, fra dire "mah secondo me c'e' questo e questo problema" oppure
"si potrebbe fare cosi' e cosa'"; e dire "c'e' questo programma che fa
esattamente cosi'", c'e' una bella differenza, non ti pare? Un po' la
diffrenza fra il dire e il fare :)
Benvenuto nel magico mondo della Vita Artificiale!
Ciao,
Anders

diffrenza fra il dire e il fare :)
bene... andrò a guardare i siti che hai citato...


ho visto darwinbots... interessante... in effetti mi ero soffermato
troppo sull'implementazione spicciola, non avevo considerato delle
ovvie grosse possibilità di questo modo di procedere...
avevo in mente il linguaggio macchina per un programma per pc, una
lunga serie di byte con significati diversi a seconda della
posizione... insomma, come per dire che uno volesse creare ms word
utilizzando un algoritmo genetico del tipo di quello di cui stiamo
parlando...
ma ovviamente non era questo ciò di cui si stava parlando...
