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