Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1471 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Évacuation d'une salle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Évacuation d'une salle

n°2258369
sherlock19​95
Posté le 19-05-2015 à 13:41:39  profilanswer
 

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
mood
Publicité
Posté le 19-05-2015 à 13:41:39  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Évacuation d'une salle

 

Sujets relatifs
Animation en PythonPython
[Python] Tetris, besoin d'aide pour élimination d'une ligne complète[résolu] Problème de récupération d'une valeur en BDD
Problème de sortie d'une boucle while en PYTHONCréer un classement en python 2.7
programmation score de tennis python pygame[python] 2048 intelligence artificielle
aide pour programme python !Débutant python dictionnaire sérialisé
Plus de sujets relatifs à : Évacuation d'une salle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR