Lundi 2 mars 2009
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
%___________________________________________________
Par cnickelfr - Communauté : Science
Ecrire un commentaire - Voir les commentaires - Recommander
Retour à l'accueil

Présentation

Recherche

Calendrier

Novembre 2009
L M M J V S D
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
<< < > >>

Créer un Blog

Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus