́ ###Sujet 7: generation aleatoire de labyrinthe:
set.seed(42);
Je pense que la probabilite de rejet sera proportion de p. Plus p sera grand plus la probabilite de rejet sera grande. De plus je pense que la probabilite de rejet augmentera aussi avec la taille du labyrinthe.
Le zero represente des cases libre et les zero des cases occupes. Le labyrinthe sera donc represente par une matrice de taille N*N. On commence par generer aleatoirement des labyrinthe:
#Fonction generation: Elle permet de generer un labyrinthe avec des obstacle mais qui ne contient pas forcement un chemin possible.
#Taille: La taille en largeur et en hauteur du labyrinthe.
#Proba: La probabilite d'avoir un obstacle sur une cse données.
generation = function (taille, proba){
M = matrix(data = 0, nrow = taille, ncol = taille);
for (i in (1:taille)){
for (j in (1:taille)){
if (runif (n=1, min=0, max =1)<= proba){
# Génération d'un obstacle
M[i,j]=1;
}
}
}
return (M);
}
On crée ensuite une fonction qui permet de tester si il existe un chemin dans un labyrinthe donée.Elle renvoie un booléen, et fonctionne de maniere recursive. Elle rend en parametre les coordonées du point de depart, les coordonées du point d’arrives, la taille du labyrinthe, et le labyrinthe.
#Fonction chemin: teste s'il existe un chemin dans le labyrinthe donné
chemin = function (i=1,j=1,i_a=N,j_a=N, taille=N, chemin_parcouru=c_par, M=L){
#si on est sur un obstacle il n'y a pas de chemin par ici
if (M[i,j]==1) return (FALSE);
# si on est a l'arrivée c'est qu'on a trouvé un chemin
if (i==i_a && j==j_a) return (TRUE);
#sinon on regarde si il y a un chemin
chemin_parcouru[i,j]=1;
res=FALSE;
if ((j<taille) && ((chemin_parcouru [i,j+1])==0)) {
if (chemin (i, j+1,i_a,j_a,taille, chemin_parcouru,M)){
return (TRUE); #a droite
}
}
if (i<taille&& chemin_parcouru [i+1,j]==0) {
res= chemin (i+1,j,i_a,j_a,taille, chemin_parcouru,M);
if (res==TRUE){
return (TRUE)
}
}#en bas
if ( (i>2) && ((chemin_parcouru [i-1,j]) == 0)){
res=chemin(i-1,j,i_a,j_a,taille, chemin_parcouru, M);
if (res==TRUE){
return (TRUE)
}
}
# en haut
if (j>2&& chemin_parcouru [i,j-1]==0) {
if (chemin (i,j-1,i_a,j_a,taille, chemin_parcouru,M)){
return (TRUE);# a gauche
}
}
return (res);
}
Enfin on cré une fonctionne qui genere uniformement un labyrinthe comportant un chemin vers l’arrivée depuis le depart en utilisant la methode du rejet.
generation_finale = function (taille, proba){
valide=FALSE;
lab=matrix(data =0, nrow = taille, ncol = taille);
while (! valide){
lab= generation(taille = taille, proba = proba);
c_par=matrix(data =0, nrow = taille, ncol = taille);
valide= chemin(i=1,j=1,i_a=taille,j_a=taille, taille=taille, chemin_parcouru=c_par, M=lab);
}
return (lab)
}
On represente graphiquement quelque labyrinthe: Avec une petite probabilite:
generation_finale(10,0.1)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 0 0 0 0 0 0 0 0 0 0
## [2,] 0 0 0 0 0 0 0 0 0 0
## [3,] 0 0 0 0 1 0 0 0 0 0
## [4,] 0 0 0 0 1 0 1 0 0 0
## [5,] 0 0 1 0 0 0 0 0 0 0
## [6,] 0 0 0 0 1 0 0 0 0 0
## [7,] 0 0 0 0 0 0 0 0 0 0
## [8,] 1 0 0 0 0 0 1 0 0 1
## [9,] 0 0 0 0 0 0 0 1 1 0
## [10,] 0 1 0 0 0 0 0 0 0 0
Avec une grande probabilite:
generation_finale(5,7/10)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0 0 0 1 1
## [2,] 1 0 1 0 1
## [3,] 1 0 0 1 0
## [4,] 1 1 0 0 0
## [5,] 0 1 1 1 0
Nous alons estimer la probabilite de rejet. pour cela nous allons modifier le programme de generation pour savoir combien de labyrinthe sont rejeter.
generation_finale_rej= function (taille, proba){
valide=FALSE;
nb_rejet=-1;
lab=matrix(data =0, nrow = taille, ncol = taille);
while (! valide){
nb_rejet=nb_rejet+1;
lab= generation(taille = taille, proba = proba);
c_par=matrix(data =0, nrow = taille, ncol = taille);
valide= chemin(i=1,j=1,i_a=taille,j_a=taille, taille=taille, chemin_parcouru=c_par, M=lab);
}
return (nb_rejet)
}
On essaye d’estimer la probabilite de rejet en fonction de la probabilite (avec une taille fixe)
nb_rejet_moy=function(nb_rep, taille,proba){
v=c()
for (i in 1:(nb_rep+1)){
v[i]=generation_finale_rej (taille, proba)
}
v
moy=0
for (i in 1:nb_rep){
moy=moy+v[i]
}
moy= moy/nb_rep
return (moy)
}
affichage = function(taille ){
proba_max=8
v=c()
for (i in 0:proba_max){
print (i)
v[i+1] =nb_rejet_moy(100,taille,i/10)
}
print (v)
plot(x=NULL,y=NULL,xlab= "Probabilité d'apparition",ylab= "Nombre de rejet", xlim= c(0,proba_max), ylim=c(0,700))
lines(x = c(0:proba_max),y=v,type="l", col= "blue")
}
Je n’arrive pas a generer des resultat pour un labyrinthe de taille 10 et 20 car les calculs prenne trop de temps.Je vous mets tout de meme les calculs que je pense qu’il faudrait effectuer. Je le fait pour un labirynthe de taille 3:
affichage(3)
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 0.00 0.23 0.68 1.34 3.42 9.71 26.91 98.49 821.77
et pour un de taille 5:
affichage (5)
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 0.00 0.39 0.89 2.32 7.71 29.69 167.40 1442.48
## [9] 39839.46
On observe que le nombre de rejets semble etre une fonction exponentielle de la probabilite d’appartion d’un obstacle. Je me suis donc arreter a une probabilite de 80% par ceque apres les calcul prenais trop de temps. Le nombre de rejet augmente aussi avec la taille du terrain.