Dans un premier temps l'objectif est d’écrire un programme générant un labyrinthe. Plusieurs méthodes vont être explorées. Pour simplifier les choses le labyrinthe est défini par une grille ($n\times n)\in \mathbb{N}^2$ dont les cases peuvent être pleines (mur) ou vides (couloir).
Un labyrinthe peut-être représenté à l'aide d'une matrice carrée de la forme : $\mathcal{M}_{ n,n}(\{0,1\})$ avec $n\in \mathbb{N^*}$. On décide que la valeur $1$ indique un couloir et que la valeur $0$ indique un mur. Par exemple le labyrinthe précédent peut être représenté à l'aide d'une matrice de dimension $(5\times 5)$:
import matplotlib.pyplot as plt
import matplotlib as mpl
from random import *
%matplotlib inline
Question : Détailler précisemment en quelques phrases la signification de ces quatre instructions. Vous insisterez sur les différences entre package et module et vous expliquerez la notion d'alias
Une technique naïve de génération de labyrinthe est décrite par l’algorithme ci-dessous. Elle a pour principal mérite d’illustrer le fait que l’on va construire un labyrinthe en partant d’une matrice simulant un espace entièrement vide ne contenant que des 1 (couloir) et en ajustant aléatoirement certains coefficients à 0 pour la création d'un mur. Son défaut majeur est que le choix purement aléatoire du prochain mur à construire aboutit presque à coup sûr à un labyrinthe qui ne possède pas forcement de solution.
Algorithme naïf:
Générer une matrice labyrinthe aléatoirement
matrice = [] # initialisation d'une liste vide (matrice)
for i in range(3): # pour chaque ligne de la matrice
ligne = [] # une liste vide prête à recevoir les valeurs d'une ligne
for j in range(3): # pour chaque colonne de la matrice
ligne.append(randint(0, 1)) # on ajoute une valeur aléatoire à la liste référencée par ligne
matrice.append(ligne) # on ajoute une ligne complète à la matrice M
# Affichage dans le Notebook
plt.matshow(matrice, cmap='gray', interpolation='none')
plt.show()
Une autre technique est de construire le labyrinthe sur la base d'un taux de remplissage : $p$ est un réel qui appartient à l'intervalle : $[\,0,1\,]$
Les coefficients de la matrice $\mathcal{M}_{ n,n}(\{0,1\})$ avec $n\in \mathbb{N^*}$ correspondante peuvent être définis de la manière suivante :
Soient $i$ et $j$ les lignes et les colonnes de la matrice référencée par labyrinthe
Questions :
$n=10$ , $p=0.3$ | $n=10$ , $p=0.7$ |
---|---|
![]() |
![]() |
L'affichage dans le notebook se fait ensuite de la manière suivante :
lab = creerLabyrinthe(5,0.5)
plt.matshow(lab, cmap='gray', interpolation='none')
plt.show()
Pour voir apparaître un phénomène de percolation, deux ingrédients sont nécessaires :
Le labyrinthe est donc un concept tout à fait approprié au phénomène de percolation
On dit qu'il y a percolation quand l'agent qui se déplace dans les creux de la structure est capable de traverser cette dernière de part en part. Dans le cas de la machine à café, il y a effectivement percolation puisque l'eau chaude traverse la poudre de café. De nombreuses autres situations répondent au phénomène de percolation : infiltration des eaux de pluie, feux de forêt, propagation d'épidémie, etc.
Pour notre labyrinthe aléatoire, il exite un seuil $S_p$, appelé seuil critique de percolation qui est le seuil minimal pour lequel le labyrinthe possède une solution.
Pour remplir un labyrinthe par percolation, on réalise les étapes suivantes
Questions :
# début definition couleurs
couleurs = (['black', 'white', 'yellow'], [0, 1, 2, 3])
cmap = mpl.colors.ListedColormap(couleurs[0])
bounds = couleurs[1]
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
# fin définition couleurs
lab_percole = percolation(couleurs[1][-1], lab)
plt.matshow(lab_percole, interpolation='none',cmap=cmap, norm=norm )
plt.savefig("lab_percole.jpg")
plt.show()
isPercole(lab) renvoie False : | isPercole(lab) renvoie True : |
---|---|
![]() |
![]() |
Dimension de la matrice :
Écrire un script permettant de mettre en relation le taux de remplissage et le taux de percolation en fonction de la dimension de la matrice labyrinthe. On fixera le nombre de labyrinthes étudié à 20 (vous pouvez augmenter cette valeur si votre ordinateur est suffisamment puissant) pour une dimension donnée de la matrice labyrinthe.
Nombre de répétitions nécessaires
Pour une dimension donnée de la matrice combien de répétitions (nombre de labyrinthe généré) sont nécessaires pour déterminer efficacement le taux de remplissage afin d'obtenir percolation ?
Définition : Un labyrinthe est dit parfait quand il n'existe qu'un seul chemin reliant deux cellules quelconques.
Algorithme
Questions :
plt.figure(figsize=(3,3)) # dimensions de l'image
lab = creerLabyrintheParfait(20, 100000)
plt.matshow(lab, cmap='gray', interpolation='none')
plt.show()
Mise en forme des données dans le fichier texte :
def saveLab(filename, lab):
fic = open(filename, "w")
for line in lab:
for c in line:
fic.write(str(c)+"\t".expandtabs(1))
fic.write("\n")
fic.close()
Le contenu du fichier texte lab1.txt est le suivant :
for l in open('lab1.txt'): #ouverture du fichier texte
print(l.strip()) #affichage ligne par ligne en supprimant les espaces avec la fonction : strip
def lireLabyrinthe(filename):
'''
À compléter
'''
fic = open(filename)
return[[int(i) for i in line.strip()] for line in fic]
Questions :
import time
print time.strftime("Version du "+'%d/%m/%y %H:%M',time.localtime())
Christophe Casseau mail : isncaju@gmail.com