-- Introduction au Python scientifique --

TP n°2

Le jeu de la Vie

simon.marie@lecnam.net

Le jeu de la vie est la forme la plus connu d'automates cellulaires, imaginé par John Horton Conway en 1970. Parfois une règle simple ou un ensemble de règles simples peut donner naissance à un algorithme simple entrainant l'emmergence de phénomènes complexes.

On se propose dans ce TP de coder dans une fonction l'évolution des générations du jeu de la vie sur une grille bidimensionelle de $(30,30)$ points. L'évolution est dicté par les deux règles simples suivantes:

  1. Si une cellule vivante (=1) est entouré de 2 ou trois voisines vivantes, elle reste en vie. Sinon elle meurt (=0) (soit car elle n'a pas assez de voisines, soit parcequ'elle en a trop).
  2. Si une cellule morte est entourée d'exactement 3 voisines vivantes, elle nait.

Proposer une fonction evolve(f) qui met à jour la génération courante en fcontion de l'état actuel.

On pourra suivre le caneva suivant:

In [ ]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def evolve(f): 
    # On force les éléments de f a rester des nombres entiers
    fi = f.astype(int)
    neigh = np.zeros(fi.shape)
    # On compte les voisins:
    neigh[1:-1,1:-1] = ...
    new_gen=.... # Trouver un moyen élégant de mettre à jour la nouvelle grille en fonction de neigh...
    return new_gen

def plotgen(F,Ng):
    n=int(np.sqrt(Ng))
    fig=plt.figure(figsize=(16,16))
    p=0
    for i in range(n):
        for j in range(n):
            p+=1
            fig.add_subplot(n,n,p)
            plt.pcolormesh(F.T,cmap='Greys');plt.grid()
            F=evolve(F)

Le planeur¶

On initialise avec le planeur qui fait partie des vaisseaux du jeu de la vie, c'est à dire des structures périodiques qui se déplacent dans une direction donnée. Il en existe de nombreux types différents, mais le planeur est le plus petit d'entre eux et le premier a avoir été découvert dès 1970. C'est une structure de périodicité 4 qui retrouve donc sa forme initiale toutes les 4 générations en s'étant déplacé dans la direction indiqué par sa forme initiale

In [ ]:
nx,ny=20,20
sx=int(4*nx/5)
sy=int(ny/5)
F=np.zeros((nx,ny))
# Le Planeur:
F[sx:sx+2,sy]=1
F[sx-1:sx+1,sy-1]=1
F[sx+1,sy-2]=1
In [ ]:
plotgen(F,16)

Autres formes¶

En vous basant sur les formes initiales connue du jeu de la vie, initialiser une nouvelle forme en choisissant les cellules initialement en vie et étudier sont évolution:

In [ ]:
nx,ny=...,...
F=np.zeros((nx,ny))
# Condition initiale:
F[...]=1
In [ ]:
plotgen(F,16)

Conclusion

In [1]:
from IPython.core.display import HTML
style=open('notebooks.css', "r").read()
HTML(style)
Out[1]:

Retour en haut de la page