Link Station > Section Généraliste > Discussion Libre >

[SCIENCE] Les Automates Cellulaires




Aller au Forum:
Notez ce sujet :

  Sujet précédent   Sujet suivant
Auteur
Sujet    Tout développer | Tout contracter NOUVEAU SUJET    RÉPONDRE
Réduire ce messageZZakathGuruNiveau 29 · CascadeurRéférenceur Aguerri
Membre depuis
2002
Messages
9866
Plus
Membre n°
7213
Inscription
15 Dec 2002
Localisation
Copenhague
Sujets lancés
426
Ancienneté
97 %
Participation
92 %
Post [SCIENCE] Les Automates CellulairesAncien message 30-01-2005 14:41
Je sais qu'Oxmo est surtout un forum technique, mais je me suis dit que le sujet vous intéresserait peut-être.

Il s'agit en effet d'informatique théorique, et accessoirement de mon futur thème de recherche. Comme je passe pas mal de temps dessus, je me suis dit que ça pourrait être rigolo de vous exposer ça, histoire de faire un peu partager ce sujet passionant et aussi de voir si je suis capable de bien vulgariser la chose.

En très bref, les automates cellulaires sont surtout connus par l'intermédiaire du Jeu de la Vie de John Conway. On peut les voir comme un modèle de calcul (à la manière des machines de Turing, pour ceux qui connaissent) ou simplement comme des choses qui font des jolis dessins.

L'idée est la suivante : on se donne un grille (infinie ou juste torique) de dimension d et un ensemble d'états Q = {q1, q2,... qn}. Chaque élément de la grille est une "cellule" qui peut se trouver dans un des états de Q. A chaque instant t, on applique un jeu de règles pour déterminer le nouvel état de chaque cellule. Ces règles dépendent de l'état des voisins de la cellule considérée.

Le jeu de la vie, par exemple, utilise une grille torique de dimension 2 (donc un plan) et deux états. Le voisinage considéré est celui des 8 cases voisines. Si une cellule dans l'état 1 a deux ou trois voisins dans l'état 1, elle reste dans cet état, sinon elle passe à l'état 0. Si elle est dans l'état 0 et a exactement 3 voisins, elle passe dans l'état 1, sinon reste dans l'état 0.
Il y a de nombreuses pages sur le jeu de la vie, en voici une en français.

Un autre exemple, plus intéressant, est celui de l'automate 110 (selon la numérotation de Wolfram). Cette fois en dimension1, donc une ligne, ce qui permet de placer son évolution temporelle sur le diagramme. On a toujours 2 états, 0 et 1, et le voisinage est simplement : {cellule à ma gauche, moi-même, cellule à ma droite}. Si on écrit 110 en binaire et qu'on trie lexicographiquement les voisinages, cela nous donne le jeu de règles, soit :
000 -> 0
001 -> 1
010 -> 1
011 -> 1
100 -> 0
101 -> 1
110 -> 1
111 -> 0

Ce qui est proprement surprenant, c'est qu'on arrive à générer des comportement extrêmement complexes avec ces règles aussi simples et des conditions initiales qui le sont tout autant.
Un exemple d'évolution de 110 :

et


Il a été démontré très récemment que 110 était intrinsèquement universel, ce qui veut dire qu'il peut simuler n'importe quel autre automate cellulaire unidimensionnel.


Selon les intérêts soulevés, je peux développer beaucoup sur les différents détails ou clarifier tout ce qui n'est pas clair dans la courtissime présentation ci-dessus (mais dites-moi si vous ne comprenez pas, et ce que vous ne comprenez pas !). Un jeu de transparents est également à l'étude.

__________________
Allez jeter un œil à mon portfolio !

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageFflemingSuper ModerateurNiveau 29 · CascadeurRéférenceur Assidu
Membre depuis
2003
Messages
19502
Plus
Membre n°
7849
Inscription
06 Jan 2003
Localisation
Augustoritum
Sujets lancés
319
Ancienneté
97 %
Participation
100 %
Ancien message 30-01-2005 19:53
Moi j'ai à peu près compris et j'ai trouvé ça intéressant...


... mais c'est peut-être parce que mon mémoire de maîtrise de maths avait pour sujet les codes lexicographiques et les graphes de Lenstra en petites dimensions.



j'avais même avec ma binôme démontré un théorème à l'époque, mon plus haut fait d'armes (et je serais bien incapable de m'y remettre maintenant 8 ans plus tard), la preuve, je l'ai retrouvé par hasard il y a quelques semaines, j'ai voulu jeter un coup d'oeil... et j'ai rien compris !

__________________

Les tôles ondulées mais les vaches aussi.

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageKKissTheFutureConnectéGuruNiveau 19 · ChroniqueurRéférenceur Novice
Membre depuis
2002
Messages
11547
Plus
Membre n°
6223
Inscription
17 Nov 2002
Localisation
Arras
Âge
46 ans
Sujets lancés
108
Ancienneté
98 %
Participation
95 %
Ancien message 30-01-2005 21:59
moi je cherchais un thread pour m'aider à m'endormir et je dois te remerci........

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageSshakes808080GuruNiveau 27 · FigurantRéférenceur Appliqué
Membre depuis
2002
Messages
8978
Plus
Membre n°
517
Inscription
08 Mar 2002
Sujets lancés
354
Ancienneté
100 %
Participation
91 %
Ancien message 31-01-2005 10:10
Très intéressant... maintenant, faudrait montrer ce que ça donne concrètement par exemple : on a tous des PC capables de faire des simulations de ce genre, il faudrait juste un petit programme .

__________________
Racket logiciel

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageAAlexielMaitreNiveau 17 · Critique de comptoirRéférenceur Appliqué
Membre depuis
2002
Messages
4920
Plus
Membre n°
1788
Inscription
21 May 2002
Localisation
steack haché......
Âge
45 ans
Sujets lancés
67
Ancienneté
100 %
Participation
80 %
Ancien message 31-01-2005 11:06
tu dois pas être mauvais en vulgarisation puisque j'ai presque tout compris!! Sauf quelques termes, mais j'ai compris le but général...

__________________

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageZZakathGuruNiveau 29 · CascadeurRéférenceur Aguerri
Membre depuis
2002
Messages
9866
Plus
Membre n°
7213
Inscription
15 Dec 2002
Localisation
Copenhague
Sujets lancés
426
Ancienneté
97 %
Participation
92 %
Ancien message 31-01-2005 16:35
Message écrit par shakes808080, le 31-01-2005 à 10:10
Très intéressant... maintenant, faudrait montrer ce que ça donne concrètement par exemple : on a tous des PC capables de faire des simulations de ce genre, il faudrait juste un petit programme .


Oui, ce n'est vraiment pas difficile, surtout pour les unidimensionnels.
Si tu veux, je peux te passer mes sources C (avec le Makefile qui va bien) pour gcc sous Linux (il te faut la SDL pour le graphisme) qui font ces zolis dessins.


Edit: voila la chose, recopie dans les fichiers qui vont bien puis fais un make. Il te faut gcc et SDL. Il y a deux règles, 54 et 110, renomme celle de ton choix en rules.c puis recompile. Le lancement se fait avec

Code
./cells largeur etapes random seed




Makefile:
Code
CC = gcc
CFLAGS = -Wall
SRC = rules.c graph.c sim.c
PROG = cells
INC = -I /usr/include/SDL
INCLIBS = -lSDL

all: $(PROG)

$(PROG):
	$(CC) $(CFLAGS) $(INC) $(SRC) -o $@ $(INCLIBS)

clean:
	rm cells



sim.c :
Code
/* you must rename the rules files you intend to use in rules.c/rules.h */

#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include "rules.h"
#include "graph.h"

int* conf;
int size;
int voisin[VECTS];


void compute (void) {
  int i, j, k;
  int valide;
  int* tmp;
  tmp = calloc (size, sizeof(int));
  
  for (i = 0; i < size; i++) {
    valide = 1;
    for (j = 0; j < VECTS; j++) {
      k = i + vects[j][0];
      if (k >= 0 && k < size)
	voisin[j] = conf[k];
      else {
	valide = 0;
	break;
      }
    }
    if (valide)
      tmp[i] = delta(voisin);
    else
      /* On choisit de remplir les bords extérieurs avec des 0 */
      tmp[i] = 0;
  }
  free (conf);
  conf = tmp;
  return;
}




int main (int argc, char* argv[]) {
  int i;
  SDL_Surface* screen;
  int steps, is_random, seed;

  if (argc != 5) {
    printf ("Bad number of arguments. Expected 4 and received %d\n", argc-1);
    exit (0);
  }

  if (DIM != 1) {
    fprintf (stderr, "As for now, only unidimensionnal automata are supported, sorry\n");
    exit (0);
  }

  screen = SDL_Initialisation();

  size      = atoi(argv[1]);
  steps     = atoi(argv[2]);
  is_random = atoi(argv[3]);
  seed      = atoi(argv[4]);

  srand(seed);

  conf = calloc (size, sizeof(int));

  if (is_random) {
    for (i = 0; i < size; i++) {
      conf[i] = rand()%STATES;
    }
  } else {
    for (i = 0; i < size; i++) {
      if (i == size/2)
	conf[i] = 1;
      else
	conf[i] = 0;
    }
  }

  for (i = 0; i < steps && i < HEIGHT/2; i++) {
    compute();
    paint_line (conf, i, size, screen);
  }

  getc(stdin);
  free (conf);
  return 0;
}



graph.c :
Code
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <SDL.h>
#include "graph.h"

int color_r[2] = {0xff, 0x00};
int color_g[2] = {0xff, 0x00};
int color_b[2] = {0xff, 0x00};


SDL_Surface* SDL_Initialisation (void) {
  SDL_Surface *screen;
  SDL_Init(SDL_INIT_VIDEO);
  atexit(SDL_Quit);
  screen = SDL_SetVideoMode(WIDTH, HEIGHT, 8, SDL_SWSURFACE);
  return (screen);
}



void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel) {
  int bpp = surface->format->BytesPerPixel;
  /* Here p is the address to the pixel we want to set */
  Uint8 *p = (Uint8 *)surface->ixels + y * surface->itch + x * bpp;

  switch(bpp) {
    case 1:
      *p = pixel;
      break;

    case 2:
      *(Uint16 *)p = pixel;
      break;

    case 3:
      if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
	p[0] = (pixel >> 16) & 0xff;
	p[1] = (pixel >> 8) & 0xff;
	p[2] = pixel & 0xff;
      } else {
	p[0] = pixel & 0xff;
	p[1] = (pixel >> 8) & 0xff;
	p[2] = (pixel >> 16) & 0xff;
      }
      break;

    case 4:
      *(Uint32 *)p = pixel;
      break;
  }
}


void paint_pixel (SDL_Surface* screen, int y, int x, int r, int g, int b) {
  Uint32 yellow;

  yellow = SDL_MapRGB(screen->format, r, g, b);

  if ( SDL_MUSTLOCK(screen) ) {
    if ( SDL_LockSurface(screen) < 0 ) {
      fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
      return;
    }
  }

  putpixel(screen, x, y, yellow);

  if ( SDL_MUSTLOCK(screen) ) {
    SDL_UnlockSurface(screen);
  }

  return;
}


void paint_line (int* bin, int line, int size, SDL_Surface* screen) {
  int i, r, g, b;
  int col;
  for (col = 0; col < WIDTH/2 && col < size; col++) {
    i = bin[col];
    r = color_r[i];
    g = color_g[i];
    b = color_b[i];
    paint_pixel (screen, 2*line,   2*col, r, g, b);
    paint_pixel (screen, 2*line+1, 2*col, r, g, b);
    paint_pixel (screen, 2*line,   2*col+1, r, g, b);
    paint_pixel (screen, 2*line+1, 2*col+1, r, g, b);
  }
  SDL_UpdateRect(screen, 0, 2*line, WIDTH, 2);
  return;
}



graph.h :
Code
#include <SDL.h>
#define WIDTH  1024
#define HEIGHT 768

SDL_Surface* SDL_Initialisation (void);
void         paint_line         (int*, int, int, SDL_Surface*);



rules.h :
Code
/* dimension de l'automate */
#define DIM    1
/* Nombre d'états */
#define STATES 2
/* Nombre de vecteurs de voisinage */
#define VECTS  3

int vects[VECTS][DIM];
int delta (int*);



r54.c :
Code
/* Rule 54 */
#include "sample.h"

int vects[VECTS][DIM] = {{-1}, {0}, {1}};

int delta (int* v) {
  if (v[1] == 0) {
    if (v[0] == 0 && v[2] == 0)
      return 0;
    else
      return 1;
  }
  if (v[0] == 0 && v[2] == 0)
    return 1;
  return 0;
}



r1110.c :
Code
/* Rule 110 */
#include "sample.h"

int vects[VECTS][DIM] = {{-1}, {0}, {1}};

int delta (int* v) {
  if (v[0] == 1) {
    if (v[1] == v[2])
      return 0;
    else
      return 1;
  } else {
    if (v[1] == 0 && v[2] == 0)
      return 0;
  }
  return 1;
}

__________________
Allez jeter un œil à mon portfolio !

Edité par Zakath le 31-01-2005 à 22:40

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageAAlexielMaitreNiveau 17 · Critique de comptoirRéférenceur Appliqué
Membre depuis
2002
Messages
4920
Plus
Membre n°
1788
Inscription
21 May 2002
Localisation
steack haché......
Âge
45 ans
Sujets lancés
67
Ancienneté
100 %
Participation
80 %
Ancien message 01-02-2005 00:20
Bon...... là, je suis larguée........

__________________

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messagePPateretou[2]MaitreNiveau 16 · Critique de comptoirRéférenceur Assidu
Membre depuis
2002
Messages
3991
Plus
Membre n°
1666
Inscription
16 May 2002
Localisation
Nepal et bientot Tibet
Sujets lancés
184
Ancienneté
100 %
Participation
76 %
Ancien message 01-02-2005 01:40
Bah heu je suis pas sur que tout le monde puisse compiler sous linux la ...

__________________
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messagePPateretou[2]MaitreNiveau 16 · Critique de comptoirRéférenceur Assidu
Membre depuis
2002
Messages
3991
Plus
Membre n°
1666
Inscription
16 May 2002
Localisation
Nepal et bientot Tibet
Sujets lancés
184
Ancienneté
100 %
Participation
76 %
Ancien message 01-02-2005 01:45
blou blou, il gere pas les <> vbulletin, il cherche des balises la
bloublou y a un include sample.h qui est foireux

__________________
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messagePPateretou[2]MaitreNiveau 16 · Critique de comptoirRéférenceur Assidu
Membre depuis
2002
Messages
3991
Plus
Membre n°
1666
Inscription
16 May 2002
Localisation
Nepal et bientot Tibet
Sujets lancés
184
Ancienneté
100 %
Participation
76 %
Ancien message 01-02-2005 01:52
Allez hop, j'ai "adapté" sous windows, mais j'ai eu la flemme de faire un truc graphique pour changer les options et tout et tout(et oh, z'avez vu l'heure j'ai une femme qui m'attend au lit moi!)

Donc les sources sont la (VC7) :
https://www.crapules.com/~pateretou/zakath/zak.rar
et l'executable (pour ceux qui veulent pas s'embeter a recompiler tout ca tout ca) :
https://www.crapules.com/~pateretou/zakath/zak_exe.rar

Pour l'executer, il faut ouvrir une fenetre ms-dos et taper un truc du genre :

Code
C:\Documents and Settings\pateretou\My Documents\Visual Studio Projects\zak\Debug>zak.exe 500 500 400 4000


pour quitter, un ctrl-C dans la fenetre ms-dos

J'ai pas eu le temps de m'y pencher mais j'ai pas reussi a trouver de "jolies trucs".
Heu c'est tout ?
oui je crois, si tu as des choses a rajouter zak, moi je t'avoue que j'ai pas trop le tps la mais ca a l'air interessant je checkerais ca a l'occas

Ah vi, j'ai compilé avec le rul110 mais libre a vous de remplacer le contenu de rules.cpp par le contenur de rul54.c de zakath au dessus!

Bonne nuit

__________________
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageZZakathGuruNiveau 29 · CascadeurRéférenceur Aguerri
Membre depuis
2002
Messages
9866
Plus
Membre n°
7213
Inscription
15 Dec 2002
Localisation
Copenhague
Sujets lancés
426
Ancienneté
97 %
Participation
92 %
Ancien message 01-02-2005 07:09
Erf oui, IL ne faut pas lire #include "sample.h" mais #include "rules.h", désolé.
Merci beaucoup d'avoir converti pour windows, je n'ai aucune idée de comment ça marche...

Si tu ne veux pas commencer avec un truc aléatoire, il faut lui donner un 0 en 3ème option. Je ne sais pas ce que tu appelles de "jolis trucs", mais ce qu'il y a à voir, ce sont des structures (d'après Ollinger, des particules) qui se déplacent sur un fond régulier et qui vont aller s'entrechoquer pour fusionner et potentiellement donner d'autres structures. C'est grâce à ça qu'on peut simuler une machine de Turing (moyennant un codage ignoble, mais bon).

Dès que j'ai un peu de temps dans la semaine, je pense rajouter la possibilité de continuer à regarder ce qui se passe "plus bas" (enfin plus haut, parce que les diagrammes espace-temps vont de bas en haut, dans l'école française).

__________________
Allez jeter un œil à mon portfolio !

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messagePPateretou[2]MaitreNiveau 16 · Critique de comptoirRéférenceur Assidu
Membre depuis
2002
Messages
3991
Plus
Membre n°
1666
Inscription
16 May 2002
Localisation
Nepal et bientot Tibet
Sujets lancés
184
Ancienneté
100 %
Participation
76 %
Ancien message 01-02-2005 11:16
zak : oui je parlais de "jolies structures"
Pour le portage, c'est du copiez collez et de l'include de lib sdl la ou il faut dans VC, c'est tout et ca va pas chercher plus loin ... (et qq modif au code : tu definis deux fois la meme global)

__________________
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!

Signaler ce message à un modérateur | IP: Logguée

Il est actuellement 19:13 (GMT) NOUVEAU SUJET    RÉPONDRE   
  Sujet précédent   Sujet suivant
Link Station > Section Généraliste > Discussion Libre > [SCIENCE] Les Automates Cellulaires

Aller au Forum:
Notez ce sujet :


Réponse rapide
Afficher une version imprimable | Chercher dans ce sujet | Envoyer cette page par email | S'inscrire à ce sujet | Télécharger ce sujet
Règles du forum :
Créer de nouveaux sujets
Répondre aux messages
Attacher des fichiers
Editer vos messages
: not autorisé
: not autorisé
: not autorisé
: not autorisé
Le Code HTML est OFF
Le BBCode est ON
Les Smileys sont ONs
Le code [IMG] est ON
Page générée en 0.064586 secondes en exécutant 48 requêtes SQL.
Apache - Compression GZIP : Activée.