[MATLAB] Gioco della vita

InGeek
Buongiorno a tutti :D
vorrei una mano su questo quesito,
devo creare una funzione in matlab di nome life che acquisisca 4 valori che sono rispettivamente
1 numero di righe di una matrice (m)
2 numero di colonne della matrice (n)
3 numero di probabilità che in una cella sia presente o no una particella viva (0 4 numero di generazioni che vogliamo far svilummare (ng>0)
grazie :smt023

Risposte
apatriarca
Dove incontri esattamente difficoltà? Non hai neanche detto esattamente che cosa dovrebbe fare la funzione per cui per ora posso solo fornirti questo (ho messo un valore di ritorno anche se non ne hai parlato..):
function y = f(m, n, p, ng)

end

InGeek
Scusatemi :oops: credevo che con gioco della vita avessi introdotto il problema, mi spiego meglio:
Le regole del gioco della vita sono le seguenti:
-ogni organismo con due o tre organismi vicini sopravvive nella generazione successiva
-ogni organismo con più di tre organismi vicini muore per sovraffollamento
-ogni organismo con meno di due organismi vicini muore per isolamento
-in ogni cella vuora che abbia esattamente tre organismi vicini nasce un nuovo organismo
:smt023
Il programma deve essere realizzato sotto forma di una funzione che acquisisca 4 argomenti come detto sopra.
La funzione dovrà visualizzare in un grafico XY la popolazione iniziale e quella di ciascuna nelle ng generazioni successive.
se due generazioni successive dovessero essere identiche la funzione si dovrebbe arrestare. La matrice (mxn) deve rispettare i seguenti vincoli: m<=5, n<=100, 00.
tale funzione deve essere risolta con il minor numero di while possibili.
Spero di essere stato abbastanza chiaro. :D

apatriarca
Sì, mi è più chiaro il problema ora. Tuttavia non capisco in cosa tu stia incontrando difficoltà, nessuno si metterà a risolvere il problema per te. Al massimo possiamo cercare di darti indicazioni, correggere gli errori e aiutarti con i tuoi dubbi. Sai dare per esempio una risposta ai seguenti punti?

1. Hai idea di come creare una matrice di partenza che possa essere utilizzata per il gioco basandoti su quegli argomenti?
2. Hai idea di come implementare le regole del gioco della vita per passare da una iterazione alla successiva?
3. Hai idea di come creare un grafico XY di ogni iterazione?
4. Hai idea di come confrontare due matrici in modo da decidere se il gioco si deve fermare?

InGeek
1. Si ho creato una matrice di patenza che contiene in modo casuale, seguendo la % di probabilità, "popolata" da 1 e 0.
2. Per verificare le condizioni della vita ho pensato di utilizzare uno scema [i,j] a otto coordinate e cercare all'interno la presenza di 0 e 1, ma non mi è molto chiaro il tutto.
3. Per il grafico non dovrei avere problemi, attribuisco a ogni 1 il valore di un puntino e genero un grafico che per ogni generazione mi disegna la matrice corrispondente.
4.Qui pensavo che una volta creata la generazione potrei scrivere : if generazione==genrazione[i+1] break.

apatriarca
Quindi il principale problema è nel punto 2? Perché non inizi a mostrare il punto a cui sei arrivato?

P.S. E' certamente possibile scrivere tutto senza fare ricorso a cicli while (o di altro tipo) ma non ho idea di cosa tu sappia di matlab o possa usare nella funzione. Per esempio c'è una implementazione questo articolo che fa uso di operazioni abbastanza avanzate di Matlab a cui dubito tu ti possa ispirare.

InGeek
Per ora ho scritto questo :-D
mp
[/code]
Grazie dell'aiuto :wink:

apatriarca
Il codice per creare la tua matrice mi sembra eccessivamente complicato. Mi sembra che quello che stai cercando di fare sia sostanzialmente quello che segue:
M = zeros(m+2, n+2);
M(2:end-1,2:end-1) = rand(m,n) < p;

Ho insomma creato una matrice un po' più grande di quello che ti serve per poi assegnare valori casuali solo nella parte interna. Mi sembra più semplice di quello che stai cercando di fare passando dalle matrici sparse e poi usando la concatenazione.

I due cicli dovranno poi essere inclusi in un ulteriore ciclo per le iterazioni.. ma suppongo che già ci avessi pensato e che tu stia principalmente cercando di lavorare su una singola iterazione per ora. Se vuoi fare la tua operazione senza usare cicli puoi fare qualcosa come segue:
C = M(1:end-2,1:end-2) + M(2:end-1,1:end-2) + M(3:end, 1:end-2) + M(1:end-2, 2:end-1) + M(3:end, 2:end-1) + M(1:end-2,3:end) + M(2:end-1,3:end) + M(3:end, 3:end);

Non è esattamente semplice da leggere ma se l'obiettivo è minimizzare i cicli questo è il metodo per farlo. Corrisponde ai tuoi due cicli senza gli if all'interno. Questa matrice va poi usata per creare una nuova M usando un codice simile a quello che segue:
M(2:end-1,2:end-1) = (C == 3) | ( (C == 2) & (M(2:end-1,2:end-1) != 0) );

E' ovviamente corretto anche come hai fatto tu. Ti ho inserito il codice principalmente se vuoi arricchire le tue conoscenze e abilità su Matlab.

InGeek
Perfetto grazie mille credo di esserci riuscito, ora il mio unico problema è quello di stampare le "generazioni".
Come faccio a plottare una matrice in un grafico XY che per il valore 1 assume un puntino o un cerchietto per esempio? :?:
GRAZIE ancora apatriarca :smt023

apatriarca
Credo che la funzione spy dovrebbe funzionare per quello che vuoi fare..

InGeek
Ok grazie mille :D , così parte, solo asseggnando manualmente gli elementi però quando creo la funzione mi da questo problema:
function with duplicate name "life_m" cannot be defined, come posso correggerlo ? :cry:

apatriarca
Prova a cambiare nome..

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.