Graphique

Retrouver tous les sujets résolus.
Invité

Re: Graphique

Message par Invité » ven. 3 janv. 2020 22:26

Merci pour votre réponse.

Je suis désolé, mais non, c'est un transport de marchandises que l'on considère et non un transport de passagers... Je l'avais mis dans mon premier message dans la consigne du professeur mais peut-être que ce n'était pas clair.

Que faut-il donc modifier ? Comment intégrer Dunkerque Port Ouest (par exemple) au réseau des autres lignes ?

Bonne soirée.
sos-math(21)
Messages : 7625
Enregistré le : lun. 30 août 2010 11:15

Re: Graphique

Message par sos-math(21) » sam. 4 janv. 2020 09:56

Bonjour,
donc il faut changer dans le code et mettre ligne[2] == 'O' dans la condition de liste_gares pour dire que l'on veut du fret.
Ensuite, pour une ligne comme Dunkerque port ouest, il faut aller dans l'autre fichier "ligne par type", rechercher la ligne correspondante (ici 302511, code commun aux deux fichiers) et regarder les coordonnées de début et de fin et voir s'ils coïncident avec une des gares de la liste listes_gares.
Je ne vois pas d'autre méthode pour le moment,
Bonne continuation
Invité

Re: Graphique

Message par Invité » sam. 4 janv. 2020 11:35

Merci pour la réponse. Et si je veux la relier "à la main", moi-même, comment puis-je faire ? Il fait que j'ajoute quoi dans quel dictionnaire ? Et avec quel code ?

Encore merci.
sos-math(21)
Messages : 7625
Enregistré le : lun. 30 août 2010 11:15

Re: Graphique

Message par sos-math(21) » sam. 4 janv. 2020 13:45

Si tu trouves une gare qui coïncide avec le début ou la fin de la ligne, tu peux alors ajouter cette gare à la ligne, donc rajouter un élément au dictionnaire ayant comme entrée "Dunkerque Port-Ouest".
Bonne continuation
Invité

Re: Graphique

Message par Invité » sam. 4 janv. 2020 21:19

Merci beaucoup pour votre réponse.

Mais quel est le code à écrire pour entrer dans le dictionnaire à la fois la distance de la gare de Dunkerque Port Ouest à la gare de Dunkerque et indiquer que Dunkerque Port Ouest est sur la ligne de Dunkerque ?

C'est vraiment ça que je ne comprends pas...

Merci encore et bonne fin de vacances. J'espère que je n'ai pas gâché les vôtres avec ce projet.
sos-math(21)
Messages : 7625
Enregistré le : lun. 30 août 2010 11:15

Re: Graphique

Message par sos-math(21) » dim. 5 janv. 2020 10:05

Bonjour,
le fait de rajouter le noeud de Dunkerque Port ouest dans le dictionnaire associé à Dunkerque établit de fait que Dunkerque Port-Ouest appartient à une ligne qui contient aussi Dunkerque.
Le dictionnaire, tel qu'on l'a construit, correspond aux sommet et aux arêtes du graphe donc si tu rajoutes le sommet Dunkerque-Port-Ouest : distance au dictionnaire de Dunkerque, cela signifie qu'il existe une arête, donc une ligne, entre ces deux sommets.
Bonne continuation pour ce projet qui est loin d'être simple... J'espère que ton professeur vous donnera des indications supplémentaires à la rentrée.
Bon courage
Invité

Re: Graphique

Message par Invité » dim. 5 janv. 2020 11:35

Merci beaucoup pour votre réponse.

Une dernière question avant la rentrée : quel est le code pour "rajouter le sommet Dunkerque-Port-Ouest : distance au dictionnaire de Dunkerque" ? J'ai essayé avec un append mais cela ne fonctionne pas....

Merci encore et bon dimanche.
sos-math(21)
Messages : 7625
Enregistré le : lun. 30 août 2010 11:15

Re: Graphique

Message par sos-math(21) » dim. 5 janv. 2020 11:54

Bonjour,
la syntaxe pour ajouter une couple clé:valeur à un dictionnaire dico est

Code : Tout sélectionner

dico[clé] = valeur
donc ici comme c'est un dictionnaire de dictionnaires, on écrit dico['Dunkerque'] pour accéder au dictionnaire associé à Dunkerque
puis on créé l'entrée Dunkerque-Port-Ouest :

Code : Tout sélectionner

dico['Dunkerque']['Dunkerque-Port-Ouest'] = distance
Bonne continuation
Invité

Re: Graphique

Message par Invité » dim. 5 janv. 2020 12:00

Mince je vois que le forum ferme à midi...

Alors je vous pose dans l'urgence une dernière question : quel est le code pour les 2 autres graphes (impact environnemental et coût) ? Il faudrait multiplier la distance entre chaque noeud en km par le coût d'un km pour chaque arête. Mais je ne vois pas : quel code écrire ? Une boucle for ?

J'espère que vous pourrez me répondre avant la fermeture du forum. Encore. Merci.
Je réponds dans ton message : il faut effectivement utiliser une boucle for (même deux) ; tu peux copier le code de la fonction dico_lignes et modifier ce code au moment de mettre la distance : au lieu de mettre

Code : Tout sélectionner

distance((gare[3],gare[4]),(element[3],element[4])
tu mets

Code : Tout sélectionner

distance((gare[3],gare[4]),(element[3],element[4])*cout
Bonne reprise
Invité

Re: Graphique

Message par Invité » mer. 8 janv. 2020 19:07

Bonsoir,

Merci pour la réponse. J'ai cours de ce projet Maths-Informatique vendredi matin, donc il me reste encore un peu plus d'une journée...
Mais j'ai un problème :

J'ai essayé d'exécuter le code donné dans votre message du 2 janvier à 17h13, mais j'obtiens un message d'erreur :
IndexError: list index out of range

Je comprends ce que ça veut dire, mais je n'ai aucune idée de comment faire pour que ça fonctionne car pour moi c'est la bonne instruction...

Voyez-vous où est l'erreur dans le code du 2 janvier à 17h13 ?

Merci encore.
sos-math(21)
Messages : 7625
Enregistré le : lun. 30 août 2010 11:15

Re: Graphique

Message par sos-math(21) » jeu. 9 janv. 2020 07:35

Bonjour,
en fonction de tes demandes, j'avais fait évoluer mon code depuis le 2 janvier, il y a peut-être des éléments qui ne sont plus corrects.
Je te redonne donc le code complet :

Code : Tout sélectionner

import csv
import geopy.distance as gd

with open('lignes-par-type.csv',newline='',encoding='utf-8') as f :
    lire = csv.reader(f)
    liste = [ligne for ligne in lire]
    liste_lignes = liste[1:]
    lignes_debut_fin=[int(ligne[0]) for ligne in liste_lignes]

with open('liste-des-gares.csv',newline='',encoding='utf-8') as h :
    extraction  = csv.reader(h)
    liste_brute = [ligne for ligne in extraction]
    liste_brute = liste_brute[1:]
    liste_gares = [[int(ligne[0]),ligne[1],int(ligne[4]),float(ligne[15]),float(ligne[16])] for ligne in liste_brute if ligne[2]=='O' and ligne[15] != '']

def distance(point1,point2):
    return gd.distance(point1, point2).kilometers

def graphe_lignes() :
    dico={}
    numero_lignes = lignes_debut_fin
    for gare in liste_gares :
        liste = []
        for element in liste_gares :
            if element[0] != gare[0] and element[2] == gare[2]:
                liste.append((element[1],distance((gare[3],gare[4]),(element[3],element[4])),element[2]))
        if gare[1] in dico.keys():
            dico[gare[1]] = dico[gare[1]] + liste
        else :
            dico[gare[1]] = liste
    return dico

def dico_lignes() :
    dico={}
    for gare in liste_gares :
        dico_noeud = {}
        for element in liste_gares :
            if element[0] != gare[0] and element[2] == gare[2]:
                dico_noeud[element[1]] = (distance((gare[3],gare[4]),(element[3],element[4])),element[2])
        if gare[1] in dico.keys():
            dico[gare[1]].update(dico_noeud)
        else :
            dico[gare[1]] = dico_noeud
    return dico

def liste_lignes(gare):
    liste = []
    for element in liste_gares :
        if element[1] == gare and element[2] not in liste :
            liste.append(element[1])
    return liste
Celui-ci doit fonctionner... en tout cas il fonctionne chez moi.
À noter que le dernière fonction liste_lignes était juste faite pour répondre à ta demande "comment faire pour retrouver les gares d'une même ligne ?"
Bonne continuation
Invité

Re: Graphique

Message par Invité » sam. 11 janv. 2020 20:03

Bonsoir,

Avez-vous quelque instants ce soir pour une toute petite question ?

Merci !
sos-math(21)
Messages : 7625
Enregistré le : lun. 30 août 2010 11:15

Re: Graphique

Message par sos-math(21) » lun. 13 janv. 2020 16:59

Bonjour,
j'ai vu ton message un peu tard (dimanche soir).
Quelle était ta question ?
Bonne continuation
Invité

Re: Graphique

Message par Invité » mar. 14 janv. 2020 20:56

Pas de problème, vous n'êtes pas non plus tout le temps à ma disposition, je comprends !

Je suis en train de construire le graphe du réseau ferroviaire. Mais j'ai toujours du mal car je n'arrive pas à construire le dictionnaire de dictionnaires dont vous me parlez.

Surtout que mon prof a dit vendredi qu'il doit contenir la distance entre chaque gare d'une même ligne. Pour cela, j'ai cette idée : extraire dans la liste des lignes SNCF toutes les gares sur une même ligne. Ensuite trier les gares d'une même ligne par ordre de PK croissant (point kilométrique). Puis enfin calculer PK(gare A) - PK (gare B) pour avoir la distance entre 2 gares consécutives À et B d'une même ligne. Mais comment faire tout ça en Python à partir du fichier liste des lignes que je vous avais donné ?

C'est bien ça mon problème. Avez-vous une idée de code peut-être ?

MERCI encore.
sos-math(21)
Messages : 7625
Enregistré le : lun. 30 août 2010 11:15

Re: Graphique

Message par sos-math(21) » jeu. 16 janv. 2020 11:24

Bonjour,
le principe du dictionnaire que je t'ai fait construire est que chaque gare est une entrée et qu'à chaque gare on associe les gares qui lui sont associées sur une même ligne et auxquelles on rajoute la distance les séparant.
Donc dans le code, cette demande me semble déjà traitée. La seule différence est que je t'ai fait calculer les distances avec un distancier utilisant les coordonnées géographiques alors que c'est sûrement plus précis avec les points kilométriques (je ne sais pas comment cela fonctionne) mais si toi, tu sais, il suffit de changer l'instruction de la distance en te servant des entrées liées au point kilométrique (il faudra sûrement reprendre l'extraction des listes car je n'ai pas inclus les entrées liées au point kilométrique extraites des fichiers csv).
Si tu as compris la logique des fonctions construites, cela devrait se faire relativement facilement en modifiant un peu le code.
Bonne continuation
Répondre