Évacuation d'une salle

Évacuation d'une salle - Python - Programmation

Marsh Posté le 19-05-2015 à 13:41:39    

Bonjour,  
 
J'essaye de programmer, dans le cadre d'un projet en informatique, une fonction qui va donner le temps d'évacuation d'une salle remplie de personnes et d'obstacles (comme des tables par exemple) en nombre d'itérations. Elle prend en arguments un tableau (composé de 0 (les vides), de 1 (les personnes) et de 2 (les obstacles)) modélisant la salle et la position (iporte,jporte) de la porte. Pour chaque 1 je calcule la distance à la porte des 4 cases l'entourant grâce à la formule : distance = sqrt((i-iporte)²+(j-jporte)²). La case vide de distance minimale reçoit un 3 (pour que le 1 ne soit pas déplacé plusieurs fois en une boucle) et l'ancienne un 0. Une boucle rechange ensuite tous les 3 en 1. Si la case contient un obstacle (2) ou est vide (0), elle n'est pas modifiée. A chaque entrée de boucle en remet à 0 la porte. Lorsque la somme des cases du tableau est égale à la somme des obstacles (il n'y a plus aucun 1) la fonction s'arrête et renvoie le nombre d'itérations nécessaires à l'évacuation de la salle. J'ai essayé de coder cette fonction en Python mais elle ne s'arrête pas et je ne vois pas où est le problème. Voilà le code de la fonction, est-ce que vous pourriez m'aider à voir ce qui ne vas pas ? Merci d'avance !  
 

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


Message édité par sherlock1995 le 19-05-2015 à 13:45:49
Reply

Marsh Posté le 19-05-2015 à 13:41:39   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed