Introduzione a Complexity
Compito 1 - Opzione avanzata
Questo è un tutorial che analizza
l'opzione avanzata del compito.
Aprite il modello netlogo denominato
multipleants.nlogo, che è situato
nella sezione del materiale del corso
sul sito web. Quando si apre, l'interfaccia
dovrebbe essere come questa.
Ci sono due modifiche
già fatte nella prima sezione del compito e
non le abbiamo eliminate. Quindi,
la prima cosa da fare è modificare il colore
delle formiche in modo che sia rosso.
Elimino queste due
linee di codice, che rende tutto
più semplice. Torniamo all'interfaccia.
Il compito ci chiede
di creare una traccia di ferormone che
le formiche rilasciano dietro, quando hanno trovato cibo,
e che le altre formiche possono seguire. Per provare,
se c'è un metodo più veloce,
andiamo nella sezione
del codice. Per prima cosa creiamo una variabile per la patch
e la chiamiamo 'pheromone', qui.
Scorriamo giù al 'setup'.
Dobbiamo impostare le patches, non solo quelle della
tana, ma anche per il 'pheromone'.
Modifico quindi questo 'set-up-nest'
in 'set-up-patches', e modifichiamo 'ask-patches'
per inizializzare 'pheromone' a 0
quindi 'set pheromone 0'. Lo controlliamo.
Poi vogliamo che le formiche
lascino una traccia di ferormone
dopo che hanno mangiato, per tracciare la via del ritorno
alla tana. Quindi vogliamo
che le altre formiche seguano la traccia.
Per questo, scorriamo
alla procedura return-to-nest e aggiungiamo
una riga per impostare il livello di ferormone
della patch. Impostiamo
il livello a +1. Per visualizzare
il livello di ferormone su ciascuna patch
imposto una etichetta sulla patch,
'plabel', in modo che sia semplicemente
il valore di 'pheromone'. Possiamo utilizzare anche
un diverso colore ma penso
che sia più interessante usare l'etichetta.
Controlliamo.
Vediamo se funziona.
Sembra che le formiche che stanno prendendo cibo
ritornino alla tana e intanto lasciano
una traccia di ferormone che permette alle
formiche di aumentare.
Ora vogliamo che il ferormone
evapori nel tempo. Torniamo
al codice. Creiamo una riga
nella procedura 'go', che chiamiamo
'evaporate-pheromone'. Quindi scriviamo
questa procedura, 'to evaporate-pheromone'.
Vogliamo che il ferormone
abbia una certa probabilità di evaporare, cioè
un numero tra 0 e 1. Impostiamo
una variabile temporanea, che chiamiamo x, che
sarà un numero decimale casuale tra 0 e 1,
quindi 'random-float 1' poi
'ask patches whit [pheromone > 0]'
quindi scriviamo che
se la variabile x è minore della
probabilità che vogliamo, che sarà
impostata da uno slider nell'interfaccia,
chiameremo questo slider
'probability-to-evaporate', poi
imposteremo il ferormone al valore corrente -1,
per evaporare gradualmente.
Vediamolo, in modo che impostiamo
la 'plabel' è il nuovo numero,
e dobbiamo aggiungere la slider di cui ho detto.
Per farlo andiamo all'interfaccia
clicchiamo questo pulsante, scegliamo 'slider' e lo
posizioniamo qui un momento,
e qui lo chiamiamo 'probability-to-evaporate',
e deve essere un numero tra 0 e 1,
o lo incrementiamo di 0.01,
e lo impostiamo inizialmente a 0.1.
Mi sono dimenticato un 'e'. Premiamo 'OK'.
Sposto lo slider
sotto questo altro.
Sposto questo 'plot'
e lo allineo con il 'mondo'
che sembra migliore, poi
questo slider sopra. Facciamo lo stesso
con gli altri sliders, Sembra corretto.
Controllo.
Torniamo all'interfaccia e facciamo girare.
Il livello di ferormone
deve decrescere, e sembra che lo faccia,
quindi bene. Il problema finale è
avere altre formiche che seguono
la traccia di ferormone.
A proposito, per selezionare diverse finestre
sull'interfaccia si clicca su
un spazio libero con il cursore e si trascina
sul pulsante o lo slider o quello che si vuole.
Si può anche fare click destro
dopo aver selezionato il pulsante, poi editare in modi differenti,
Ora torniamo al codice e
modifichiamo il movimento delle formiche
nel 'mondo'. Andiamo a 'to look-for-food'
e aggiungiamo qui il codice.
Dobbiamo impostare alcune nuove variabili
in 'look-for-food', quindi
'let pheromone-ahead? scent-at-angle 0' e spiego cosa significa tra un secondo
'let pheromone-right? scent-at-angle 45'
'let pheromone-left? scent-at-angle -45'
Questo codice è
molto simile al modello della
NetLogo Library. Stiamo semplicemente chiedendo
alle formiche di guardare un po' avanti,
un po' a destra e a sinistra
per determinare se c'è ferormone,
e se c'è seguirlo.
Se non c'è, andare avanti casualmente,
che corrisponde a lasciare lo stesso codice
qui sotto. Poi scriviamo una serie di
cicli if-else
'if-else' - aperta parentesi - pheromone-right? è maggiore di
pheromone-ahead? oppure pheromone-left?
è maggiore di pheromone-ahead? - chiusa parentesi -
'if-else pheromone-right?
è maggiore di pheromene-left?
andiamo a destra di 45 gradi, altrimenti a sinistra di 45 gradi,
e se niente di ciò è vero,
non c'è feromone davanti o non c'è
del tutto. Quindi
se pheromone-ahead? è uguale a 0
andiamo avanti con il resto. Ci occorre
un parentesi aperta e una parentesi chiusa.
Controlliamo. Ci dice che
non c'è niente chiamato 'scent-at-angle'
E' vero, non abbiamo ancora impostato
il scent-at-angle, scorriamo
alla fine del codice.
Mettiamo un reporter
'to report scent-at-angle' e
mettiamo un angolo, [angle] 'let p patch-right-and-ahead'
E queste sono primitive, proprie di
NetLogo. Per controllare a cosa corrisponde una primitiva
potete selezionarla e fare click destro,
e andare in 'Quick Help', che
fornisce una sinopsi della primitiva.
Quindi, a destra e davanti. Useremo
l'angolo appena inserito
e la distanza davanti pure uguale a 1.
Se p non è uguale a niente, quindi
se non c'è ferormone, quindi riporta 0, altrimenti
riporta la quantità di ferormone
di p.
Controlliamo il codice.
Non abbiamo chiuso la parentesi.
Abbiamo un messaggio di errore.
Sembra che la parentesi che manca vada qui.
Ho notato anche un'altra coppia
di parentesi che mancano per queste righe.
Le aggiungo. Scusate.
Controlliamo.
Sembra tutto a posto.
Ritorniamo all'interfaccia.
Sembra che il comportamento sia corretto.
Analizziamo un po' meglio.
Possiamo fare alcune osservazioni su come
funziona. Le lascio a voi.
Noto che molte formiche
si posizionano ai bordi del 'mondo'.
Possiamo mettere a posto
andando in 'setting' e
facendo click su 'world wraps horizontally' e
'world wraps vertically' e fare click su ok.
Sembra che le formiche
siano molto veloci e mangino tutto il cibo,
circa 73 ticks, e nel precedente modello,
prima di aggiungere il ferormone,
avevamo 128 ticks.
E' tutto per il compito n.1,
spero che vi sia piaciuto.
Non vedo l'ora di spiegarvi il prossimo!