CLASSE LIFE LABORATORIO 12 Life (vita, in inglese) è un automa cellulare inventato dal matematico John Conway per studiare un'emulazione elementare dei processi vitali. Life è diventato famoso dopo la sua descrizione su Scientific American nel 1971. L'automa cellulare rappresenta la vita di un insieme di nxm cellule che possono essere in due stati: vive o morte. Le cellula sono organizzate in una matrice di n righe e m colonne. Come mostrato nella tabella sotto, attorno a ogni cellula ci sono otto cellule adiacenti (nord, sud, est, ovest, nordovest N-O, nord-est N-E, sud-ovest S-O e sud-est S-E ). N-O Nord N-E Nord Cellula Est S-O Sud S-E Notate che la relazione di vicinanza tra le cellule della matrice è considerarsi ciclica: il bordo destro della matrice è da considerarsi adiacente a quello sinistro (il bordo destro è da considerarsi a sinistra del bordo sinistro), così come il bordo superiore è adiacente a quello inferiore (il bordo inferiore è sopra il bordo superiore). Altrimenti detto, le cellule sul bordo sinistro hanno come vicine dal lato ovest le cellula del bordo destro della matrice; le cellule sul bordo alto hanno come vicine sul lato nord le cellule del bordo basso della matrice; eccetera. Nella Tabella sottostante, le cellule del bordo sinistro (in giallo) hanno come vicine alla loro sinistra, quindi sul lato ovest, le cellule del bordo destro (in arancione). Le cellule del bordo sopra (in azzurro) hanno come vicine a nord, ovvero sopra di loro, le cellule del bordo sotto (in blu). Ad esempio, come mostrato nella tabella sotto, la cellula di coordinate (0, 0) Segnata con X in tabella ha a est la cellula (0,1), a ovest la cellula (0, m 1), a sud la cellula (1,0), a nord la cellula (n 1, 0), a sud-est la cellula (1,1), a sudovest la cellula (1, m-1), a nord-est la cellula (n-1,1), a nord-ovest la cellula (n-1,m-1). X E O S S-E S-O N N-E N-O Le regole di evoluzione della vita in Life sono molto semplici: - se una cellula è viva, sopravvive all'istante di tempo successivo se nel suo intorno ci sono 2 o 3 cellule vive; altrimenti muore per solitudine o sovraffollamento. - se una cellula è morta e nel suo intorno ci sono esattamente tre cellule vive diventa viva all'istante successivo.
Scrivere un programma che simuli Life e visualizzi graficamente l'evoluzione di una matrice le cui dimensioni sono specificate sulla riga di comando. A tal fine implementate la classe Automa che, contiene le seguenti variabile di istanza: - boolean/int/ [][] auto: questa è la matrice - di cui sceglierete voi il tipo (!!) - che contiene le cellule (ovvero il loro stato) - tutte le altre variabili di istanza che ritenete necessarie Oltre alle variabili di istanza, la classe contiene i seguenti metodi: un costruttore public Automa(int n, int m, double p): riceve in ingresso il numero di righe (n) e di colonne (m) della matrice di cellule, e un valore double p tale che 0<p<1. Questo valore è da intendersi come un valore di probabilità p che viene utilizzato per inizializzare la matrice delle cellule: ogni cellula sarà viva con probabilità p. Per sfruttare tale numero, generate un numero casuale rand tra 0 e 1; se rand<p la cellula è viva, altrimenti è morta. il metodo String tostring(): restituisce una stringa che rappresenta lo stato dell automa (ovvero restituisce una stringa che raffigura la matrice di cellule). Per ottenere la visualizzazione grafica, potete stampare la matrice emettendo il carattere + per le cellule morte, e il carattere o per le cellule vive. il metodo void evolvi(): fa evolvere la matrice di cellule facendola passare allo stato successivo. tutti gli altri metodi che ritenete necessari. Il programma Life deve prendere in input sulla riga di comando quattro parametri: il numero n, il numero m, una probabilità p, e un numero intero num positivo o nullo (num 0), che rappresenta il numero di evoluzioni da simulare. Il programma: - crea un oggetto della classe Automa che contie nxm cellule, inizializzate tramite la probabilità p; - stampa l automa dopo l inizializzazione; - fa evolvere l automa e si ferma dopo num evoluzioni o dopo una evoluzione in cui tutte le cellule sono morte; dopo ogni evoluzione viene stampato lo stato dell automa. - al termine dell evoluzione, Life stampa il numero di cellule vive dopo l inizializzazione dell automa e dopo ogni sua evoluzione. SUGGERIMENTI 1: 1. Per realizzare il passo di evoluzione nel metodo evolvi() potreste utilizzare una matrice di ausilio, che chiamiamo aux. Partendo dallo stato di auto, calcolate la configurazione successiva, che memorizzerete in aux. A questo punto dovete 2. Per ottenere l'effetto di avere relazioni di vicinanza cicliche, dovete incrementare o decrementare le coordinate utilizzando l'aritmetica modulare. Ad esempio, se la matrice si chiama a, le celle adiacenti ad a[x][y] sono: - cellula a sud: a[(x+1) % n][y] = a[(x+n+1) % n][(y+m) % m] - cellula a nord: a[(x+n-1) % n][y] = a[(x+n-1) % n][(y+m) % m] - cellula a est: a[x][(y+1) % m] = a[(x+n) % n][(y+m+1) % m] - cellula a ovest: a[x][(y+m-1) % m] = a[(x+n) % n][(y+m-1) % m] - cellula a sud-est: a[(x+1) % n][(y+1) % m] = a[(x+n+1) % n][(y+m+1) % m] - cellula a nord-est: a[(x+n-1) % n][(y+1) % m] = a[(x+n-1) % n][(y+m+1) % m] - cellula a sud-ovest: a[(x+1) % n][(y+m-1) % m] = a[(x+n+1) % n][(y+m-1) % m] - cellula a nord-ovest: a[(x+n-1) % n][(y+m-1) % m] = a[(x+n-1) % n][(y+m-1) % m]
Attenzione: non eliminate i +n e i +m apparentemente ridondanti; sono necessari perché l'implementazione del modulo sui numeri negativi è errata. Esempio di esecuzione Il comando >java Life 8 11 0.1 20 POTREBBE produrre il seguente output (attenzione! Il vostro output potrebbe variare a seconda della inizializzazione delle cellule! L inizializzazione viene fatta con una probabilità!!) + + + o + + + + + + + + + + o + + + + + + + + + + + + + + + + o + Numero Cellule vive dopo inizializzazione=7 Cellule vive dopo evoluzione numero 1=0 Notate che, nonostante siano state richieste 20 evoluzioni, il programma si ferma subito dopo la prima perché tutte le cellule sono morte Per dimostrarvi che il vostro programma subisce la variabilità data dall utilizzo di una probabilità per inizializzare il problema, lanciate di nuovo la classe Life con lo stesso input. Io ho ottenuto: >java Life 8 11 0.1 20 + + + + + + + + o + + + o + + + + + + + + + + + + + + o + + + + + + o + + + + + + + + + Numero Cellule vive dopo inizializzazione=4
Cellule vive dopo evoluzione numero 1=0 Il comando >java Life 8 11 0.35 10 POTREBBE produrre il seguente output + o o o + o + o o + + + + + + + + o + + + o + + + o + + + o + o + + + o + + + o + o + + + + o + o o + + + o o + o + o + o + + o o o o + + + o + + + o + + + o + + o + o o o o o Numero Cellule vive dopo inizializzazione=35 + o o o o o + + + + o + + + o o + o + + o + + + + + + + o o o o + + + o + o o o o o + o o o o + o o o o + + o + o o o + o + + o + + + o o o o + o + + + + + o + + o + o + + + o + o + + + + o + + o o + + + + + + o + + o o + + o + o + + + + + o o + + + + o o o + o o + + + + + + + + + + + o + + + + + + + + + o o + + + + + + + + o o + + + + + + + + + + + + + + + + o o + + + + + + + + + o + o + + o + + + + + + o + + o + o + + + + + + + + o + o + + + + + + + + + o + + + + + o o o + + + + + + + + + + + o + o
+ + + + + + o o o + o + + + + + + o + o o + + + + + + + + + o o + o + + + + + + + + + o + + + + + o + + o o + + + + + + o o + + + o + + + + + + o + + + o + + + + + + + o + + + + + + + + + + + o o + + + + + + o o o o + + + + + + + o + + + o + + + + + + o o + + o o + + + + + o o o + + + + + + + + + + o o o + + + + + + + + + o o + + + + + + + + o o o + + + + + + o + + o + + + + + + + o + + o + + + + + + o + + + o o + + + + + o + + + + o o + + + + + o + + + + o + + + + + + + + + o + + + + + + + + o + + + + + + + o o + o o + + + + + + o + o o o + o o + + + o + o o o + o + + + + + + + + + + o + + + + + + + + + o o + + + + + o o + o + + + + + + o + + + o o + + + + o o + o + + + o o + + o o + o o + + o + + + + + + + o o + + + + + + + + + + + o o
+ + + + + o + o o o + + + + o o + o + o o + o + + o o + o + + + o Cellule vive dopo evoluzione numero 1=43 Cellule vive dopo evoluzione numero 2=15 Cellule vive dopo evoluzione numero 3=15 Cellule vive dopo evoluzione numero 4=15 Cellule vive dopo evoluzione numero 5=18 Cellule vive dopo evoluzione numero 6=17 Cellule vive dopo evoluzione numero 7=22 Cellule vive dopo evoluzione numero 8=18 Cellule vive dopo evoluzione numero 9=19 Cellule vive dopo evoluzione numero 10=24