sherlock1995 | 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 :
- 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
|
Message édité par sherlock1995 le 19-05-2015 à 13:45:49
|