from random import *
import matplotlib.pyplot as plt
#### TOUT VARIE
def situation(arrets_list, frequentation, interval_passages) :
# OBJECTIF : Combien de personnes entre chaque arrêt
# forme de arrets_list = [[nom_arret,population, durée_jusque_arret_suivant],[nom_arret,population, durée_jusque_arret_suivant],[nom_arret,population, durée_jusque_arret_suivant]]
# Liste des nombres de personnes pour chaque arrêt pour chaque retard de la forme simulations[arret][retard] = nombre personnes
simulations = [[] for _ in range(len(arrets_list))]
# On effectue la simulation pour 10 retards différents
for retardrange in range(10) :
# Liste des listes des durées de trajet de chaque usager entre chaque arrêt (nombre d'usagers = len(listes des durées de trajet))
list_nb_personnes = []
## PREMIER AU SECOND ARRET
# Entre premier et deuxième arrêt, nb_personnes = nombre de personnes qui rentrent dans le bus à l'arrêt
# Le nombre de personnes au premier arrêt sera égal à frequentation de la population au premier arrêt, avec une variabilité de 80% sur la valeur
nb_personnes_first_arret = interval_passages * frequentation * arrets_list[0][1] # On a multiplié par 10 en estimant que les personnes se sont accumulées en 10 minutes
nb_personnes_first_arret_variabilite = int(nb_personnes_first_arret)
# Liste dont chaque élément correspond à la longueur de trajet d'un usager
list_durees_trajet = []
for _ in range(nb_personnes_first_arret_variabilite) :
list_durees_trajet.append(1)
list_nb_personnes.append(list_durees_trajet)
simulations[0].append(len(list_nb_personnes[0]))
## A PARTIR DU DEUXIEME ARRET
# Maintenant étudions le nombre de personnes entre les arrêts à partir du deuxième
retard = 0 # Retard initial nul
# Pour chaque arrêt, sauf le premier
for i in range(1, len(arrets_list) - 1) :
# 1) Etudions déjà qui sort, décrémentation des listes de nombre d'arrêts restants, et suppression des 0
list_trajets_apres_sorties = [] # Nouvelle liste pour le départ
for j in range(len(list_nb_personnes[i-1])) :
if list_nb_personnes[i-1][j] - 1 != 0 :
list_trajets_apres_sorties.append(list_nb_personnes[i-1][j] - 1)
# Retard éventuel
retard += retardrange
# 3) Etudions qui rentre
# Pour cela, étudions pendant quelle durée les usagers se sont accumulés à l'arrêt (duree_accumulation) en supposant qu'un bus idéal est passé
duree_accumulation = retard + interval_passages
# On a notre durée pendant laquelle les usagers s'accumulent à l'arrêt, notre tau de fréquentation, et la population aux alentours de notre arrêt
# Générons alors la liste des nouvelles personnes entrantes list_trajets_apres_entrees
nombre_personnes_entrantes = duree_accumulation * frequentation * arrets_list[i][1]
nombre_personnes_entrantes = int(nombre_personnes_entrantes)
# Liste dont chaque élément correspond à la longueur de trajet d'un usager
list_trajets_apres_entrees = []
for _ in range(nombre_personnes_entrantes) :
list_trajets_apres_entrees.append(1)
# On ajoute la liste des usagers présents dans le bus pour ce nouveau trajet
list_nb_personnes.append(list_trajets_apres_sorties + list_trajets_apres_entrees )
simulations[i].append(len(list_nb_personnes[i]))
X = [i for i in range(10)]
for a in range (len(simulations[0:-2])) :
Y = [i for i in simulations[0:-2][a]]
plt.plot(X,Y, label=arrets_list[a][0] + ' : y = ' + str((Y[-1]-Y[0])/(X[-1]-X[0])) + 'x + ' + str(Y[0]))
plt.legend()
plt.show()
return True
def recupArretInTextFile(file) :
f = open(file,'r')
text = f.read()
noms = text.split('<div class="title">\n')
noms.pop(0)
for i in range(len(noms)) :
separe = noms[i].split('\n')
noms[i] = separe[0]
return noms
def makeListFromCSV(csv) :
''' Cette fonction nous retourne des données d'un CSV sous forme de listes. Elle admet pour argument un fichier CSV.
'''
# On ouvre le fichier de données "opendatas"
with open(csv, newline='') as csvfile:
text = csvfile.read(); # Lecture du fichier complet
text = text.split('\n') # Création d'une liste des lignes du fichier
# Pour chaque ligne du fichier sauf la première qui concerne les noms de tables
for i in range(1, len(text)) :
# Création de la liste des éléments de la ligne i
# On modifie l'élément ligne en un élément qui est une liste de elle même des éléments de la ligne
text[i] = text[i].split(',')
# On supprime la ligne relative au nom des tables qui ne nous sert à rien
text.pop(0)
text.pop(-1)
# On transforme la liste en dictionnaire
dict = {}
for i in range(len(text)) :
name = text[i][1]
dict[name] = text[i][18]
return(dict)
def situationLigneC(file_arrets_names, csv) :
arrets_name = recupArretInTextFile(file_arrets_names)
request = [[],0.001,5]
for i in arrets_name :
list_datas = makeListFromCSV(csv)
if i in list_datas :
name = i
population = list_datas[name][0]
duree_jusque_prochain = list_datas[name][1]
request[0].append([name, population, duree_jusque_prochain])
situation(request[0], int(request[1]), int(request[2]))