def cout_h () : #Même fonction que cout_q en remplaçant q par h q = 5 x=[] #contient les différentes valeurs de h testées y=[] #contient le temps d'execution associé for h in range(10,101) : #on enlève les petites valeurs pour ne pas avoir un temps trop petit (et un problème lors du passage au log) p = Paramètres(q,h,T,m,alpha) x.append(log(h)) y_moyen = 0 for i in range(30) : #On réalise 100 simulations pour chaque point t=time() init_ville(p) t=time()-t y_moyen+=t y.append(log(y_moyen/30)) #Réalisons ensuite une régression linéaire pour trouver a et b tels que log(t) = a*log(h) + b : regressor = LinearRegression() X = [[i] for i in x] regressor.fit(X, y) a = regressor.coef_[0] b = regressor.intercept_ r2 = regressor.score(X,y) y_droite = [a*i + b for i in x] #On trace ensuite les points obtenus en effectuant les simulations, et la droite obtenue par régression linéaire. plt.plot(x,y, label = "log(t) en fonction de log(h)") plt.plot(x,y_droite, label = "log(t)="+str(a)+"log(h)+"+str(b)+", r² ="+str(r2)) plt.title("Temps d'exécution t en fonction du nombre d'emplacements par quartiers h² (90 points créés à partir de 30 simulations chacuns)") plt.xlabel("log(h)") plt.ylabel("log(t) (t en secondes)") plt.legend() plt.show()
def cout_q () : h = 20 x=[] #contient les différentes valeurs de h testées y=[] #contient le temps d'execution associé for q in range(1,51) : p = Paramètres(q,h,T,m,alpha) x.append(log(q)) y_moyen = 0 for i in range(30) : #On réalise 100 simulations pour chaque point t=time() init_ville(p) t=time()-t y_moyen+=t y.append(log(y_moyen/30)) #Réalisons ensuite une régression linéaire pour trouver a et b tels que log(t) = a*log(h) + b : regressor = LinearRegression() X = [[i] for i in x] regressor.fit(X, y) a = regressor.coef_[0] b = regressor.intercept_ r2 = regressor.score(X,y) y_droite = [a*i + b for i in x] #On trace ensuite les points obtenus en effectuant les simulations, et la droite obtenue par régression linéaire. plt.plot(x,y, label = "log(t) en fonction de log(q)") plt.plot(x,y_droite, label = "log(t)="+str(a)+"log(q)+"+str(b)+", r² ="+str(r2)) plt.title("Temps d'exécution t en fonction du nombre de quartiers q² (50 points créés à partir de 30 simulations chacuns)") plt.xlabel("log(q)") plt.ylabel("log(t) (t en secondes)") plt.legend() plt.show()
def simulation( p, i_max, nb_graph): #choisis de sorte que i_max divisible par (nb_graph-1) ville = init_ville(p) trace_ville(ville, p, 0) sub_i = i_max // (nb_graph - 1 ) # Nombre d'itérations entre chaque graphique for i in range(1, nb_graph): for j in range(sub_i): actualise(ville, p) trace_ville(ville, p, i)
def test_init_ville(self): p = Paramètres(2, 3, 1, 0.5, 0.2) ville = init_ville(p) n_al = 0 #nombre de personnes altruistes : normalement 3 n_eg = 0 #nombre de personnes égoïstes : normalement 15 for i in range(p.l): for j in range(p.l): if ville.ville[i, j] == 1: n_eg += 1 elif ville.ville[i, j] == 2: n_al += 1 self.assertEqual([n_eg, n_al], [15, 3])
def test_actualise(self): p = Paramètres( 4, 5, 100, 0.2, 0.1) #Une grande valeur de T permet d'accélérer les déménagements ville = init_ville(p) copie_ville = np.copy( ville.ville) #list permet de faire une copie indépendante copie_densites = np.copy(ville.densites) ville2 = Ville(copie_ville, copie_densites) test = True while test: #on réactualise la ville jusqu'à ce qu'un déménagement ait lieu actualise(ville2, p) for i in range(p.l): for j in range(p.l): if ville.ville[i, j] != ville2.ville[i, j]: test = False #A ce stade, test vaut 1 si la ville est inchangée, et 0 sinon # Vérification de la grille de la ville : n_al = 0 #nombre de personnes altruistes : normalement 3 n_eg = 0 #nombre de personnes égoïstes : normalement 15 n_change = 0 #nombre de changements entre ville et ville2 for i in range(20): for j in range(20): if ville2.ville[i, j] == 1: n_eg += 1 elif ville2.ville[i, j] == 2: n_al += 1 if ville.ville[i, j] != ville2.ville[i, j]: n_change += 1 test = (n_eg == 180) and (n_al == 20) and ( n_change == 2 ) #vérifie qu'il y a bien le bon nombre d'individus altruistes et égoistes, et que seules deux cases de la ville ont été modifiées #Vérification de la matrice des densités : for i in range(4): for j in range(4): d = np.sum(ville2.ville[i * 5:(i + 1) * 5 - 1, j * 5:(j + 1) * 5 - 1] != 0) test = (test and ((d / 25) == ville2.densites[i, j]) ) #vérifie que les densités sont bonnes self.assertEqual(test, True)