(pour signaler une erreur monnerat@u-pec.fr)

Automates cellulaires : la fourmi de Langton.

Une fourmi, assimilable à un petit automate, se promène sur une grille de points colorés; pour commencer, tous les points sont blancs.
  • la fourmi est initialement placée au centre de la grille. Elle se déplace dans les quatre directions cardinales. Initialement, elle va vers l'est.
  • A chaque pas, elle se déplace d'une case dans sa direction. Son parcours est dicté par les deux règles suivantes :
    • Si la case atteinte est noire, elle la repeint en blanc, et tourne de \(90^\circ\) à gauche.
    • Si la case est blanche, elle la repeint en noire, et tourne de \(90^\circ\) à droite.
  • Elle continue son chemin en suivant ces règles.



    Les 9 premiers pas de la fourmi
  1. Ecrire un programme qui affiche le trajet de la fourmi à l'écran. On prendra une unité raisonnable pour la représentation d'une case.
  2. Que remarquez-vous après un certain nombre d'itérations ?
  3. Généralisation : On ne se limite plus à deux couleurs, mais à \(n\) couleurs. La règle du déplacement est donnée par un nombre binaire \(x\) de \(n\) bits. Lorsque la fourmi arrive sur une case de couleur \(k\), elle la repeint en la couleur \(k+1\), et elle tourne à gauche si le kième bit de \(x\) est \(1\), à droite sinon. La fourmi de langton est la cas particulier \(x=10\).
  4. Simuler le comportement pour \(x=100,110,1000,1100\).

\(n=10\)

\(n=1001\)

\(n=11011\)

Un début de programme

#include<stdio.h>
#include<unistd.h>
#include<graph.h>
#define N 200 
#define L 1000
#define H 1000
 
void dessinerDamier(int damier[N][N]){
	couleur w,b;
	b=CouleurParNom("black");
	int i,j;
	int dx = L/N;
	int dy = H/N;
	ChoisirCouleurDessin(b);
	for(i=0;i<L;i++){
		DessinerSegment(0,i*dy ,L , i*dy);  
		DessinerSegment(i*dx ,0, i*dx,H);  
	}
}
 
int fourmiLangton(int damier[N][N]){
	int d = 0,dx=1,dy=0;  // direction, deplacement en x et en y
	int dir[4][2]={}; // tableau qui code pour chaque direction, 
                    // le deplacement en x et en y
 
	couleur  c[10];   // couleurs
 
	int x=N/2,y=N/2;  // position initiale
	while(1){
		usleep(100);
	}
}
 
int main(){
	int damier[N][N]={0};
	InitialiserGraphique();
	CreerFenetre(10,10,L,H);
	dessinerDamier(damier);
	fourmiLangton(damier);
	Touche();
	FermerGraphique();
}