| E finalmente... dopo 2 giorni (o forse 3) ecco il nuovo codice corretto e più performante dell'automa cellulare bidimensionale...non dimenticando che lo scopo finale è quello di riuscire a fare il gioco "life" e alla fine la versione gozzolana di tale gioco...alcune note -cambiando da hold on a hold off nella riga 184 si hanno risultati diversi, per alcune configurazioni iniziali è meglio hold off per altre on -Non ho risolto la questione dei bordi (sono stanco, vista l'ora!!!) quindi bisogna tenersi al centro, o eventualmente aumentare le dimensioni di A,C e degli assi (tutti con medesimi valori) -Il prossimo passo consisterà nel fare in modo che invece di scrivere manualmente le coordinate delle cellule vive, besì indicarle con il mouse (sempre se si può fare) per questo spero che qualcuno mi aiuti -contrariamente alla verione precedente, questo è molto più veloce quindi si possono fare tutte le iterazioni che si vogliono (sempre mantenendosi lontani dai bordi) domani posto la foto di qualche bella configurazione CODICE %------AUTOMA CELLULARE BIDIMENSIONALE 1.0 (Fredkin)------------ % by g'OZ 08/09 %funziona bene, rispetta la logica. Per eventuali modifiche fate %attenzione al fatto che l'orientamento è invertito, nel senso %che la cella nord sarà a sud della cella centrale. %nota*:intorno di Von Neumann, per automi bidimensionali con %geometria rettangolare. global A; clc clear
A=zeros(300,300);
disp('iserisci cordinare della prima cellula') x1=input('x=') y1=input('y=') disp('iserisci cordinare della seconda cellula') x2=input('x=') y2=input('y=') disp('iserisci cordinare della terza cellula') x3=input('x=') y3=input('y=') disp('iserisci cordinare della quarta cellula') x4=input('x=') y4=input('y=') disp('iserisci cordinare della quinta cellula') x5=input('x=') y5=input('y=') disp('iserisci cordinare della sesta cellula') x6=input('x=') y6=input('y=') disp('iserisci cordinare della settima cellula') x7=input('x=') y7=input('y=') disp('iserisci cordinare della ottava cellula') x8=input('x=') y8=input('y=') disp('iserisci cordinare della nona cellula') x9=input('x=') y9=input('y=')
it=input('numero iterazioni????')
%X colonna Y riga
A(x1,y1)=[1]; A(x2,y2)=[1];A(x3,y3)=[1];A(x4,y4)=[1];A(x5,y5)=[1]; A(x6,y6)=[1];A(x7,y7)=[1];A(x8,y8)=[1];A(x9,y9)=[1];
hold on plot(y1,x1,'*b') plot(y2,x2,'*b') plot(y3,x3,'*b') plot(y4,x4,'*b') plot(y5,x5,'*b') plot(y6,x6,'*b') plot(y7,x7,'*b') plot(y8,x8,'*b')
plot(y9,x9,'*b') axis([0 300 0 300]) pause
C=zeros(300,300)
for k=1:it
[i,j]=find(A==1);
l=length(i) for m=1:l B(m)=A(i(m)+1,j(m))+A(i(m)-1,j(m))+A(i(m),j(m)+1)+A(i(m),j(m)-1); centro(m)=rem(B(m),2); if centro(m)==0 C(i(m),j(m))=0; else C(i(m),j(m))=1; end
%il problema è proprio qui..quindi ci vuole una matrice solo per i calcoli %nord
Bn(m)=A(i(m),j(m))+A(i(m)+1,j(m)+1)+A(i(m)+2,j(m))+A(i(m)+1,j(m)-1); nord(m)=rem(Bn(m),2); if nord(m)==0 C(i(m)+1,j(m))=0; else C(i(m)+1,j(m))=1; end
%sud
Bs(m)=A(i(m),j(m))+A(i(m)-1,j(m)+1)+A(i(m)-1,j(m)-1)+A(i(m)-2,j(m)); Sud(m)=rem(Bs(m),2);
if Sud(m)==0 C(i(m)-1,j(m))=0; else C(i(m)-1,j(m))=1; end
%est
Be(m)=A(i(m),j(m))+A(i(m),j(m)+2)+A(i(m)+1,j(m)+1)+A(i(m)-1,j(m)+1); Est(m)=rem(Be(m),2);
if Est(m)==0 C(i(m),j(m)+1)=[0]; else C(i(m),j(m)+1)=[1]; end
%Ovest Bo(m)=A(i(m),j(m))+A(i(m)+1,j(m)-1)+A(i(m),j(m)-2)+A(i(m)-1,j(m)-1); Ovest(m)=rem(Bo(m),2); if Ovest(m)==0 C(i(m),j(m)-1)=[0]; else C(i(m),j(m)-1)=[1]; end end A=C [x,y]=find(C==1); pause(0.2) plot(x,y,'.m') axis([0 300 0 300]) hold on grid off drawnow
end
%Avviate, inserite la coordinate di quelle che volete siano le cellule %vive. X-->Colonna Y-->Riga, dopo di che inserite il numero di iterazioni %xcontrariamente alla versione precedente non ci sono più i problemi di %lentezza quindi potete mettere anche un numero significativo. Un unico %avvertimento. Non so bene come si comporta avvicinandosi ai bordi, quindi %cercate di far partire l'evoluzione dell'automa da una posizione centrale % non mettete (x,y)=(1,1) ecc.
|