TIPE Physique

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]))