Slime mold

Prendono questo nome delle creature di dimensioni microscopiche dal comportamento per lo meno singolare. Se i più curiosi vogliono documentarsi appropriatamente, devono rivolgersi agli specialisti del settore. Comunque una ricerca in Rete riporta questi link su cui possiamo vedere descrizioni e belle immagini a loro relative

Se limitiamo la ricerca alle pagine italiane abbiamo i due seguenti link:

Lo schema comportamentale di queste creature è il seguente. Quando l'ambiente in cui si trovano è ricco di cibo (si nutrono di batteri), esse vivono in modo isolato e indipendente come organismi unicellulari e si riproducono per mitosi. Quando il cibo comincia a scarseggiare il comportamento diventa totalmente diverso ed esse si aggregano in uno pseudoplasmodio formato da una decina di migliaia di cellule. Così si trasformano in un'unica creatura viscida e mobile che si sposta per trovare un ambiente più favorevole. Questa, arrivata a destinazione, si trasforma di nuovo ancorandosi al suolo e formando un corpo fruttifero da cui emanano le nuove spore, comportandosi quindi adesso come un fungo. Gli scienziati hanno inizialmente tentato di decifrare questo comportamento individuando cellule specializzate a coordinare l'aggregazione. Invece le teorie attuali non riconoscono a nessuna cellula un particolare ruolo e lo considerano il fenomeno un "democratico" meccanismo sociale. Molto semplicemente quando scatta la fase dell'appetito ogni creatura emette una sostanza chimica (cyclic AMP) che funge da richiamo per le altre.

Con il pacchetto di installazione di StarLogo è fornito anche un programma, nella sezione biologica, dal nome Slime che studia il comportamento di organismi quando emettono ferormoni di aggregazione. Usiamo adesso tale programma sia per illustrare alcuni interessanti comandi StarLogo sia per riflettere, insieme all'autore, sul comportamento di sistemi complessi.

Cominciamo con l'istruzione
diffuse qualcosa percentuale
Il patch che riceve l'ordine sottrae la "percentuale" (per essere significativo il risultato la percentuale deve essere un numero comreso tra 0 e 1) del "qualcosa" che si trova su di esso e lo diffonde negli otto patch che lo circondano. Se ad esempio nell'origine abbiamo sistemato una sostanza chimica con
set chemical-at 0 0 50
allora con l'ordine
diffuse chemical 1
avremo in (0,0) chemical=0, negli otto patch vicini chemical= 6.25 mentre con l'ordine
diffuse chemical 0.5
avremo in (0,0) chemical=25, negli otto patch vicini chemical= 3.125.

Altra istruzione
scale-pc color variabile min max
scala il colore con cui si presenta il patch in funzione dei valori min e max. Se il valore di variabile eccede i limiti, allora il patch si presenta nero (variabile < min) o bianco (variabile > min). Siamo adesso in grado di capire la prima parte delle procedure. Il valore della variabile numSlime viene assegnato tramite slider sulla finestra grafica.

patches-own [chemical]

to setup
  ca
  crt numSlime 
  ask-patches [setchemical 0]
  ask-turtles [setup]
end

to go
  ask-turtles [go]
  diffuse chemical 1     ;effetto di dispersione
  ask-patches [set chemical chemical * 0.9  ; effetto di evaporazione
               scale-pc green chemical 0.1 3]
end

Vediamo la parte delle tartarughe.
La procedura di inizializzazione non presenta particolari difficoltà di comprensione. Usa le due funzioni screen-width e screen-height di ovvio significato e deposita la traccia di ferormone dove sono situate le cellule slime. Dopo si definisce la procedura vai che usa la VaDoveTiportaIlNaso . Si tratta di seguire il gradiente del ferormone.

to setup
  setxy random screen-width random screen-height
  setc red
  setchemical chemical + 2
end

to go
  VaDoveTiportaIlNaso 
  rt random 40 
  lt random 40
  grid-step
  setchemical chemical + 2
end

to grid-step
  fd 1
  setxy round xcor round ycor   ;arrotonda le coordinate
end

Le ultime due procedure realizzano il principio del gradiente. Con la procedura annusa ogni Slime controlla lungo tre direzioni e sceglie quella che fornisce il valore più grande. L'istruzione let consente l'uso di variabili locali. Cogliamo l'occasione per illustrare con esempi le tecniche di accesso alle variabili di stato tramite i suffissi -at, -to , -towards. Precisamente:

Ed ecco le due procedure

to annusa
  let [:dir -45
       :best-val chemical
       :best-dir -100]
  let [:current chemical-towards :dir 1]
  if :current > :best-val 
    [set :best-val :current
     set :best-dir :dir]
  set :dir :dir + 45
  set :current chemical-towards :dir 1
  if :current > :best-val 
    [set :best-val :current
     set :best-dir :dir]
  set :dir :dir + 45
  set :current chemical-towards :dir 1
  if :current > :best-val 
    [set :best-val :current
     set :best-dir :dir]
  output :best-dir
end


to VaDoveTiportaIlNaso 
  let [:dir annusa]
  if :dir >= -45 [seth heading + :dir]
end


Si definiscono poi uno slider che rappresenta la variabile numSlime e due bottoni setup e go, legati alle stesse procedure dell'osservatore e quest'ultimo di tipo forever.

Si possono fare adesso esperimenti con l'ambiente.