Lundi 2 mars 2009
1
02
/03
/Mars
/2009
09:40
L'auto organisation est à l'origine de la vie... En effet, il existe de nombreux exemples dans lesquels quelques règles simples conduisent à des organisations complexes, c'est le cas par exemple
des réactions chimiques dites de "réaction diffusion" qui peuvent conduire à la formation de distributions spatiales complexes et structurées les
"Turing paterns". Il est vraissemblable que tout le développement embryonnaire soit régulé par des processus assez comparables. C'est sans
doute le cas aussi de la sturcture de l'univers en galaxies et amas de galaxies qui se forment principalement sous l'action de la gravitation.
C'est assez contre intuitif, mais si globalement l'entropie c'est à dire le désordre augmente, localement peuvent se former des structures organisées.
Les automates cellulaires sont des logiciel simulant des processus d'auto organisation. L'un des plus connus : le jeu de la vie, utilise une grille dont chaque élement est une cellule. Celle çi
peut être soit "vivante" soit "morte" et à chaque génération des régles simples permettent de calculer l'état de chaque cellule à la prochaine génération :
- Si la cellule est vivante et qu'elle est entourée de 2 ou 3 voisines vivantes, elle survit à la prochaine génération.
- Si la cellule est morte et qu'elle est entourée de 3 voisins vivants, elle devient vivante à la génération suivante.
- Dans tous les autres cas la cellule sera morte à la génération suivantes.
Avec ces régles très simples, il est possible de voir apparaitre des élements organisés, comme par exemple des "gliders" (planeurs). Ces "entitées" composées de 5 cellules sont capables de se
déplacer en ligne droite dans la grille. Elles peuvent apparaitre spontanément au bout de quelques génération sur une grille ensemencée aléatoirement (c'est à dire dont l'état vivant ou mort des
cellules à été tiré au sort à le première génération).
Quelques liens dans wikipedia
Game of life (le jeu de la vie)
Cellular automatons (les automates cellulaires)
Un exemple rudimentaire avec Matlab ou Octave
Copier le code si dessous dans un fichier appelé lifegame.m et executez le à partir de Matlab ou de GNU Octave. J'ignore pourquoi exactement mais c'est beaucoup plus rapide dans matlab sous
windows (à mon avis Octave n'est pas optimisé pour windows). On peut jouer sur la taille de la grille (row, col) sur la densité de cellules initiales (d) et sur le nombre de générations (tick). Si
vous n'avez pas la patience d'attendre le nombre de générations suffisant, vous pouvez ensemencer directement des gliders preforme en dé-comentant les lignes de code correspondantes (en elevant le
'%' au début de la ligne). Dans ce cas il vaut mieux baisser la densité initiale de cellules voir même la mettre à 0.
%______________________________________________
function lifegame()
%lifegame
tic();
%initialisation de la matrice et des parametres
row=100;
col=100;
%densite de cellules vivantes
d=0.05;
%nombre de generations
nticks=200;
%nombre total de cellules vivante initialement
n=row*col*d;
%initialisation de la matrice
M=zeros(row,col);
%initialisation de la matrice de generation n+1
Mnext=zeros(row,col);
%initialisation de la matrice qui sert à calculer les voisins
m=zeros(3,3);
%exemples d'automates
hacker=[0 1 0;0 0 1;1 1 1];
blinker=[1 1 1];
%Ensemencement initial de la matrice
for i=1:n
M(ceil(rand*row),ceil(rand*col))=1;
end
%ajout eventuel de gliders preformes
%M(ceil(0.5*row)-1:ceil(0.5*row)+1,ceil(0.25*col)-1:ceil(0.25*col)+1)=hacker;
%M(ceil(0.25*row)-1:ceil(0.25*row)+1,ceil(0.25*col)-1:ceil(0.25*col)+1)=hacker;
%M(ceil(0.75*row)-1:ceil(0.75*row)+1,ceil(0.25*col)-1:ceil(0.25*col)+1)=hacker;
%initialisation de la table de couleurs
cmap=[1.0 1.0 1.0;0.0 0.0 1.0];
colormap(cmap);
%pour chaque generation
for tick=1:nticks
%afficher la matrice
imagesc(M);
drawnow ();
%pour chaque position nombre de voisins
for i=2:row-1
for j=2:col-1
m=M(i-1:i+1,j-1:j+1);
voisin=sum(sum(m))-1; %-1 car si le pixel central=1 ça fait 1 en plus dans la somme
if ( (M(i,j)==1) && ((voisin==2)||(voisin==3)) ) %vivant et 2 ou 3 voisins
Mnext(i,j)=1; %survie
elseif ((M(i,j)==0) && (voisin==2))
%mort et 3 voisins : si le pixel est a 0 ça fait un voisin en moins à cause du -1 donc si il y a 3 voisins la valeur de la %variable 'voisins' et de 2 dans ce cas
Mnext(i,j)=1; %naissance
else
Mnext(i,j)=0; %mort dans tous les autre cas
end
end
end
M=Mnext;
end
toc();
endfunction
%___________________________________________________