1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| import numpy as np
import numpy.random as rd
def evacuation (M,iporte,jporte):
Temps_evacuation=0
(L,l)=np.shape(M)
nombre_obstacles=0
for i in range (L):
for j in range (l):
if M[i,j]==2:
nombre_obstacles+=1
while np.sum(M)>2*nombre_obstacles:
print M
Temps_evacuation+=1
M[iporte,jporte]=0 #On remet la porte à 0
for i in range (L):
for j in range (l):
if M[i,j]==1:
distance=np.ones(4)*1000 #On génère un vecteur rempli d'un grand nombre pour que le nombre reste grand si on ne peut pas calculer la distance
if i>=0 and i+1<=L and j>=0 and j+1<=l:
if i>0 and M[i-1,j]==0:
distance[0]=np.sqrt((i-1-iporte)**2+(j-jporte)**2) #case du haut
if i<L-1 and M[i+1,j]==0:
distance[1]=np.sqrt((i+1-iporte)**2+(j-jporte)**2) #case du bas
if j>0 and M[i,j-1]==0:
distance[2]=np.sqrt((i-iporte)**2+(j-1-jporte)**2) # case de gauche
if j<l-1 and M[i,j+1]==0:
distance[3]=np.sqrt((i-iporte)**2+(j+1-jporte)**2) # case de droite
distancemin = min (distance)
indice_case_valeur_min=[]
for k in range (4): #On cherche l'indice associé à la valeur minimale
if distance[k]==distancemin:
indice_case_valeur_min.append(k)
if len (indice_case_valeur_min)==2: #Si deux distances sont les mêmes on tire au hasard
indice=rd.randint (0,2)
if indice==0:
indice_case_valeur_min=indice_case_valeur_min[0]
if indice==1:
indice_case_valeur_min=indice_case_valeur_min[1]
else :
indice_case_valeur_min=indice_case_valeur_min[0]
if indice_case_valeur_min==0 and i>0 and M[i-1,j]!=2:
M[i-1,j]=3
M[i,j]=0
if indice_case_valeur_min==1 and i<L-1 and M[i+1,j]!=2:
M[i+1,j]=3
M[i,j]=0
if indice_case_valeur_min==2 and j>0 and M[i,j-1]!=2:
M[i,j-1]=3
M[i,j]=0
if indice_case_valeur_min==3 and j<l-1 and M[i,j+1]!=2:
M[i,j+1]=3
M[i,j]=0
if M[i,j]==2: #Les 2 sont inchangés
M[i,j]=2
if M[i,j]==0: #Les 0 sont inchangés
M[i,j]=0
for i in range (L): #On rechange les 3 en 1
for j in range (l):
if M[i,j]==3:
M[i,j]=1
return Temps_evacuation |
Partager