Inscription / Connexion Nouveau Sujet

1 2 +


Niveau maths spé
Partager :

Optimisation

Posté par Profil etudiantilois 31-12-19 à 15:12

Bonjour,

Je suis débutant en Python.

Dans le cadre de mes études, je dois écrire un programme en Python qui puisse permettre, à partir des coordonnées (latitude, longitude) du domicile d'un habitant de Paris, de déterminer la station de métro à laquelle il doit se rendre, la plus "intéressante" pour son trajet, en fonction de là où il veut aller...

Cependant, j'ai vraiment du mal à trouver quel type de programme mettre en place.

Après quelques recherches, je pensais utiliser l'algorithme de Dijkstra, mais je ne vois pas comment l'utiliser concrètement.

Pourriez-vous donc me mettre sur la piste s'il vous plaît ?

J'ai la liste des stations de métro avec pour chacune, ses coordonnées (latitude, longitude).

Merci par avance pour votre, je suis vraiment désemparé...

Posté par
lionel52
re : Optimisation 31-12-19 à 15:25

Il te faut certes les coordonnées du métro mais il te faut aussi absolument le temps de trajet sur chaque rue sinon tu peux rien dire de plus à part prendre la distance euclidienne entre ton point et le métro

Posté par
lionel52
re : Optimisation 31-12-19 à 15:26

Enfin pour l'instant c'est pas clair, il te faut beaucoup plus d'info
- La durée d'une station à une autre  sur une ligne
- La durée pour arriver à une station

Posté par Profil etudiantiloisre : Optimisation 31-12-19 à 15:39

Merci pour votre réponse.

Oui, je peux calculer la distance entre le domicile et des stations de métro aux alentours avec un module de Python.

Mais c'est pour la suite que j'ai un problème : une fois que j'ai tout ça, quoi faire ?

Posté par Profil etudiantiloisre : Optimisation 31-12-19 à 16:08

Sur ce forum, qui sait programmer en Python ?

Perroquet ?
Mathafou ?
Dpi ?
Carpediem ?
Sylvieg ?
Verdun ?
Jezebeth ?
Yzz ?

J'ai tellement besoin d'aide...

Posté par
carpediem
re : Optimisation 31-12-19 à 16:16

salut

programmer n'est pas le pb !!!

le pb est : quel est ton pb ?

et ce pb a été soulevé par lionel52 : pb trop imprécis pour savoir quel objectif atteindre ...

Posté par
lionel52
re : Optimisation 31-12-19 à 16:23

Je me débrouille plutôt bien en Python mais là le problème n'est pas Python mais de savoir bien  modéliser le problème. Tu n'as pas un exemple de données que tu as?

La partie code après et Djikstra ensuite c'est facile

Posté par Profil etudiantiloisre : Optimisation 31-12-19 à 16:31

Pour résumer, voici ce que j'ai :

- La liste des stations du métro parisien avec pour chacune, ses coordonnées (latitude, longitude)
- La possibilité de calculer un itinéraire piéton entre un point A et une station de métro
- Une fonction qui me permet de calculer la distance en ligne droite entre deux points repérés par leurs coordonnées (latitude, longitude)

Avec tout ça, je dois construire un programme qui donne le meilleur itinéraire entre un point A et un point B. Il n'est pas nécessaire de donner le numéro de la ligne de métro, dire simplement : entrer à la station Châtelet et descendre à Montparnasse est possible.

Donc quelle est la première chose à faire ?

Je dirais que c'est de modéliser le réseau de métro par un graphe avec la liste des coordonnées de chaque station de métro ?

Mais comment faire ça ?

Merci infiniment de m'aider.

Posté par
lionel52
re : Optimisation 31-12-19 à 16:45

Ok et dernière question comment tu calcules le temps de trajet entre 2 stations de métro?

Posté par Profil etudiantiloisre : Optimisation 31-12-19 à 16:50

Justement, ça, je ne le sais pas...

Mon idée serait de prendre la vitesse moyenne v d'un métro, et de calculer avec la fonction évoquée précédemment la distance en ligne droite d entre 2 stations de métro...

Puis, on utilise simplement v=d/t donc t=d/v...

Problème : le tracé entre deux stations de métro n'est pas en ligne droite, donc la distance est faussée...

Qu'en pensez-vous ? Avez-vous une meilleure idée ?

Merci beaucoup de m'aider en tout cas car je commençais vraiment à désespérer...

Posté par
lionel52
re : Optimisation 31-12-19 à 17:05

Bah si t'as pas d'autres infos c'est la seule possibilité oui

Posté par Profil etudiantiloisre : Optimisation 31-12-19 à 17:19

D'accord, merci.

Mais comment calculer la distance entre chaque station de métro ?

Sachant qu'il y a 302 stations... Mais elles ne sont pas toutes liées entre elles ! Par exemple la station Châtelet n'est pas directement reliée à la station Montrouge ! (Je ne suis pas du tout de la région parisienne mais j'ai regardé sur un plan du métro...)

Alors comment faire pour calculer les bonnes distances ?

Merci encore.

Posté par
lionel52
re : Optimisation 31-12-19 à 17:31

Chatelet est relié à Montrouge (ligne 4)

Si tu as pas les données de quelle station est liée à laquelle on peut pas le faire pour toi!

Posté par
lionel52
re : Optimisation 31-12-19 à 17:33

En gros il faut que tu nous donnes un échantillon de tes données sinon on peut rien faire et c'est trop vague

Posté par Profil etudiantiloisre : Optimisation 31-12-19 à 17:34

Citation :
Si tu as pas les données de quelle station est liée à laquelle on peut pas le faire pour toi!


Non, je n'ai pas ça...

Posté par
Ulmiere
re : Optimisation 31-12-19 à 18:36

La durée du trajet, tu peux l'approximer en disant qu'entre la gare du Nord et la gare de l'Est il y a une minute de trajet (peut-être plus je sais pas, regarde sur le site de la ratp).
Tu supposes (c'est audacieux, mais mieux que rien) que si deux stations de la ligne 4 A et B consécutives sont séparées par une distance euclidienne de n fois celle entre la gare du Nord et la gare de l'Est, le temps de trajet est multiplié par n.
Pour calculer le temps de trajet entre deux stations de la ligne 4 : tu sommes les petits bouts de trajet entre deux stations consécutives. Tu peux éventuellement rajouter une minute à chaque fois que le métro s'arrête, pour prendre les voyageurs.
Tu peux précalculer tout ça et faire lire ces données au besoin à ton application dans un fichier.

Bien sûr tout ça ne prend pas en compte les grèves, mais il ne faut pas s'en faire, car à l'évidence la SNCF non plus ne sait pas les gérer

Posté par Profil etudiantiloisre : Optimisation 31-12-19 à 18:47

Merci beaucoup pour votre réponse Ulmiere.

Mais voici mon problème : je n'ai pas les données pour chaque ligne des stations consécutives...

Alors, certes, je pourrais le faire à la main, mais il y a 302 stations à répartir sur une quinzaine de lignes...

Alors quoi faire selon vous ?

Posté par
Ulmiere
re : Optimisation 31-12-19 à 18:52

Tu codes un scrapper en Python ou Javascript qui va aller chercher ça lui même sur le site de la ratp, éventuellement avec un OCR
Ou bien tu cherches si quelqu'un n'aurait pas déjà fait ça en ligne
Ou bien ici :
Une petite regex et c'est fini. Il ne te restera qu'à prendre une unité de temps de référence pour chaque ligne en te servant du simulateur de la ratp (pour la ligne 4, tu regardes par exemple Gare du Nord <-> Gare de l'Est. Pour la ligne 14 tu peux prendre Chatelet <-> Gare de Lyon. etc)

Posté par
ty59847
re : Optimisation 31-12-19 à 18:55

Si tu as la liste des stations, mais pas la liste des lignes, ton résultat sera purement fictif.

Dans quel  cadre tu dois faire cet exercice. Si c'est un exercice de programmation, tu peux t'inventer une liste des lignes. Si c'est plus sérieux, tu dois certainement pouvoir télécharger quelque part la vraie liste des lignes.( ... mais je n'ai pas trouvé)

L'autre point qui est assez fictif dans cet exercice, c'est que pour aller d'un point A à la station la plus proche, le plus court chemin n'est pas forcément la ligne droite. Paris n'est pas un grand désert où on peut aller d'un point A à un point B en ligne droite ; il y a des immeubles qui empêchent d'aller en ligne droite. Mais le biais dû à ce point est faible comparé au 1er point.

Au tout début, tu disais 'je suis débutant en Python'. Ca me paraît un exercice difficile pour un débutant Python.

Posté par
Ulmiere
re : Optimisation 31-12-19 à 19:05

Imaginons que tout ait été scrappé et soit disponible à la lecture
La latitude et la longitude ne servent qu'en dehors du métro.
Tu peux sans doute faire l'hypothèse qu'une fois que tu prends un métro, tu peux décider de changer de ligne modulo un malus de temps, mais pas de quitter la gare et de faire le chemin à pied jusqu'à la prochaine ligne (sinon tu vas péter un cable, trop compliqué). Dès que tu vois la lumière du jour, c'est fini.

T'es à ton point de départ à pieds (localisation), tu regardes quelles sont les trois stations de métro les plus proches
Pour chacue d'elles tu calcules le temps qu'il faudra pour arriver et tu le sommes au temps qu'il faut pour arriver jusqu'à la station de départ à pieds.
Tu choisis celle qui donne le plus petit temps, ou le moins de correspondances si c'est presque pareil.

Posté par Profil etudiantiloisre : Optimisation 31-12-19 à 19:07

C'est pour un exercice de prépa.

On a le choix entre cet exercice ou bien quasiment le même... Mais avec la liste des gares SNCF de France qui est disponible ici :

Est-ce que cela serait plus simple ? Car il y a beaucoup de données sur le site data... La liste des lignes par exemple :

Est-ce que c'est mieux ?

Posté par Profil etudiantiloisre : Optimisation 31-12-19 à 23:41

Qu'est-ce que vous en pensez Ulmiere ?

Et bon réveillon ! 20 minutes avant 2020...

Posté par Profil etudiantiloisre : Optimisation 02-01-20 à 12:20

Bonjour,

Finalement je pense que je vais plutôt travailler sur le sujet avec les gares de France car il y a plus de données.

Pour l'instant, je dois donc construire la liste d'adjacence du graphe contenant toutes les gares de France. Je dois faire ça avec ces données :

Mais j'ai un souci. Il faut donc que je connaisse chaque gare voisine d'une gare, car l'arête existe uniquement si la voie ferrée entre les 2 gares existe !

Dans le fichier avec les données mis au-dessus, il y a les numéros des lignes. J'ai donc, pour chaque ligne, la liste des gares voisines car on peut les trier dans l'ordre de succession sur la ligne avec Excel.

Par contre, comment puis-je ensuite relier les lignes ? Savoir, en quelque sorte, quelle ligne est voisine d'une autre ?

J'ai trouvé ce fichier : . Je pense qu'il peut m'être utile car il y a les coordonnées géographiques du début de la ligne et de la fin, ainsi que le numéro de la ligne. Comment puis-je donc utiliser ce fichier pour relier les lignes entre elles dans le graphe ?

Merci encore, je sens vraiment que je progresse dans le projet, maintenant je vois mieux où je dois aller !

Posté par
carpediem
re : Optimisation 02-01-20 à 12:37

franchement je ne comprends pas comment on peut donner un tel exercice sans avoir la base de données nécessaire ...

on se fout donc de savoir si telle gare est reliée ou non à tel autre gare ...

et se donner une base de données théorique :

un graphe (ou une carte) avec n sommets et un certain nombres d'arêtes (orientées ?) reliant ces sommets ...

ensuite vient alors le pb de déterminer le chemin minimal (en quel sens d'ailleurs : en temps, en distance, ...) et c'est là qu'interviennent les algo de résolution de ce genre de pb ...

Posté par Profil etudiantiloisre : Optimisation 02-01-20 à 12:50

Bonjour carpediem,

Merci beaucoup pour votre réponse.

En fait, le premier objectif de l'exercice, selon mon prof que j'ai contacté par mail hier et qui m'a répondu ce matin, est justement de construire le graphe avec toutes les gares de France. Selon lui, ça fait partie de l'exercice et toujours selon lui, il est possible de construire la liste ou la matrice d'adjacence à partir des deux liens que j'ai mis dans mon message précédent.

Mais moi je ne vois pas comment faire pour construire cette matrice d'adjacence avec autant de données... Avez-vous une idée ? En manipulant ces 2 fichiers en CSV peut-être ?

Merci encore.

Posté par
carpediem
re : Optimisation 02-01-20 à 12:58

je ne suis pas suffisamment connaisseur ... désolé ...

Posté par Profil etudiantiloisre : Optimisation 02-01-20 à 13:02

Merci quand-même !

Est-ce qu'un autre membre du forum pourrait donc m'aider ? Ulmiere ? ty59847 ?

Merci infiniment par avance.

Posté par
ty59847
re : Optimisation 02-01-20 à 22:53

A priori , dans le lien que tu as trouvé sur la SNCF, il y a un fichier avec des n° de ligne, et des n° de tronçon.
Il faut vérifier, mais je suppose que les n° de ligne permettent d'identifier les lignes, et que le n° de tronçon donne un n° d'ordre sur chaque ligne.
Mais même avec ça, on n'a pas tout.  Si un trajet demande une correspondance, on a besoin des horaires.

En fait, peut-être qu'il faut voir l'exercice sous un angle totalement différent.
Des outils qui proposent un trajet 'idéal', ça existe : Google Maps , Sytadin , Transilien, le site de la SNCF.  

On peut aborder l'exercice sous un angle différent. On a 2 adresses, on 'ping' l'un ou l'autre de ces sites, pour récupérer le bon trajet.
Et si on a un fichier avec une série de trajets à planifier, on 'ping' ces sites autant de fois que nécessaire.

Interroger automatiquement ces 2 sites, c'est un chantier pas simple.
Et récupérer le trajet suggéré pour le stocker dans son propre environnement, ce n'est pas simple non plus.
C'est une hypothèse, pas une certitude.

Posté par Profil etudiantiloisre : Optimisation 03-01-20 à 03:44

Merci pour la réponse.

Après réflexion, voici, je pense, ce qu'il est attendu de faire :

Je pense qu'il faut construire un dictionnaire où chaque entrée est une gare SNCF et chaque valeur associée est la liste des gares sur la même ligne ainsi que les distances les séparant de la gare de départ.

Mais le problème est : comment construire un tel dictionnaire avec les 2 fichiers donnés dans mon message du 2 janvier à 12h20 ?

Merci infiniment de m'aider.

Posté par
ty59847
re : Optimisation 03-01-20 à 10:47

La distance séparant 2 gares, tu n'en a pas vraiment besoin. Ce qu'il te faudrait, c'est un temps pour aller de l'une à l'autre. 300km sur une ligne TGV , c'est plus long ou plus court que 60km sur une ligne omnibus ?

Mais si tu veux les distances, tu as les éléments pour les calculer dans les fichiers en question.
Tu as les coordonnées de chaque gare (colonnes X_WGS84 et Y_WGS84). Tu as également les colonnes X_L93 et Y_L93 qui font doublon avec les 2 autres colonnes.

X_WGS84 et Y_WGS84, c'est la longitude et la latitude.  Ca permet de placer très précisément le point sur une carte géographique. Et ensuite, pour calculer des distances, c'est "simplement" des maths.  Ca donnera une distance à vol d'oiseau.

X_L93 et Y_L93, c'est la même chose, mais avec un système de cartographie différent, appellé Projection de Lambert 93. Je crois que les géographes préfèrent ce jeu de coordonnées... mais je ne connais pas vraiment.

Donc le dictionnaire que tu veux construire  (liste des gares sur une même ligne), tu dois pouvoir le construire à partir du fichier en question.


En fait, je viens de télécharger le fichie 'liste-des-gares.csv', et la réponse à ta question est dans ce fichier.
La colonne code_ligne est un identifiant de ligne.
La colonne rg_troncon n'est pas utile, mais la colonne pk est exactement ce que tu recherches.
Cette colonne contient le kilométrage entre le point de départ de la ligne et la gare  en question.
Exemple ligne n°420000 , qui va de Paris-Montparnasse à Brest.
Paris-Montparnasse, pk=000+400
Chartres, pk=078+137
Rennes, pk=373+250
Brest, pk=622+422

Je pense que tu aurais pu observer cela par toi-même , non ?

Posté par Profil etudiantiloisre : Optimisation 03-01-20 à 11:48

Merci, je comprends mieux !

Mais pensez-vous que je suis sur la bonne piste en créant ce dictionnaire ?

Est-ce qu'avec ça je pourrai calculer la distance entre une gare A et une gare B ?

Mon problème est surtout : comment relie les lignes entre elles ? Par exemple, comment savoir que la 420000 est reliée à la 289000 (j'ai pris des numéros de ligne au hasard, ce n'est probablement pas relié en réalité) ?

Merci beaucoup.

Posté par
ty59847
re : Optimisation 03-01-20 à 12:29

2 lignes sont reliées entre elles si il y a une gare commune aux 2 lignes. Lapalissade.
Si tu cherches toutes les lignes qui passe par Marseille-St-Charles, tu cherches tous les enregistrements du fichier qui ont Marseille-St-Charles en colonne 2 (ou tous les enregistrements du fichier qui ont 87751008 en colonne 1), et tu trouveras 5 lignes (les lignes n°830000, 938000, 905000, 939001 et 930000)

J'ai l'impression d'écrire des évidences.

Bémol quand même, je constate qu'il y a une seule ligne passant par Paris-Montparnasse, et ça me surprend un peu. Pourquoi pas, ce n'est pas incohérent. Les lignes Paris Nantes ou Paris StMalo partent de Montparnasse, mais ces lignes ont un troncon commun avec la ligne Paris Brest. C'est donc inutile de dupliquer l'information.
Ce fichier décrit le réseau et uniquement le réseau : il y a une ligne qui va de gare X à gare Y en passant par telles et telles gares.  

Ce fichier ne dit pas qu'il y a certains trains qui sont directs de ParisMontparnasse à Nantes, ou de ParisMontparnasse à StMalo. Ce fichier dit même qu'il n'y a pas de ligne passant par ParisMontparnasse et par StMalo.

A l'utilisateur de voir qu'il y a une ligne Paris-Rennes (420000)  et une ligne Rennes-StMalo (441000).

Posté par Profil etudiantiloisre : Optimisation 03-01-20 à 12:45

Merci pour votre réponse.

Et donc en Python, comment écrire un code donnant, pour une gare donnée, toutes les lignes qui passent par cette gare ?

J'ai essayé d'écrire un tel code avec une boucle for, mais je n'ai pas réussi... Auriez-vous donc une idée de code ?

Merci encore.

Posté par
ty59847
re : Optimisation 03-01-20 à 13:15

Fais voir ce que tu as fait. Je connais très peu Python, mais ça devrait être assez facile de corriger ce que tu as fait, si tu pars sur l'idée d'une boucle for.

En Python, il y a certainement des moyens 'ensemblistes' qui seront beaucoup plus efficaces qu'une boucle for.  Mais je je saurai pas t'aider pour ça.

Posté par Profil etudiantiloisre : Optimisation 03-01-20 à 13:46

OK. Je vous envoie ça ce soir car là je n'ai pas mon ordinateur à disposition.

D'ici là, est-ce que quelqu'un qui maîtrise bien Python pourrait m'aider ?

Ulmiere ? lionel 52 ?

Pour avoir effectivement un moyen plus efficace qu'une boucle for...

Merci beaucoup par avance.

Posté par
fUnderscoreE
re : Optimisation 06-01-20 à 09:59

hi,

1) Il n'est pas demandé de calculer toi-même les itinéraires mais d'en restituer un à l'utilisateur. Si ton énoncé est correctement recopié, alors il est bien plus malin d'utiliser le site de la ratp OU celui de la scnf (et prendre le trajet (à priori) le plus court (en temps):
- Si le site a une API, regarde si elle accepte une geoloc
- Si oui, fait un call api...
- Si non, converti la geoloc en adresse (ex: google maps/api geocode  ou https://geo.api.gouv.fr/adresse)
- Si le site a pas d'API, utilise, soit une requete http et parse la réponse, soit un truc type phantomjs ou pyppeter et même combat: saisit le départ, l'arrivée, lance la recherche et récupère le résultat


2) Si le but c'est de calculer toi même les temps de trajets, les métros sont plus simples que les gares: moins de stations.
Tu as les temps interstation sur une même ligne: https://dataratp.opendatasoft.com/explore/dataset/offre-transport-de-la-ratp-format-gtfs/information/
Il te reste à modéliser sous forme de graphe (et joindre les stations en tant que noeuds d'une ligne à l'autre).

l'approche 2) est clairement faisable, mais c'est des efforts, je pense que 1) est beaucoup moins fatiguant (et probablement plus pertinent car prend en compte les aléas de la journée). 1) ne semble pas non plus déconnant vu que ça met en jeu des notations informatiques: calls http, cookies (eventuels), scrapper, étude d'api existantes, ihm
Mais bon, demande confirmation à ton prof au cas où ca serait con d'avoir zéro

Posté par Profil etudiantiloisre : Optimisation 13-02-20 à 21:41

Bonsoir,

Je reviens sur ce sujet.

J'ai désormais plusieurs fichiers CSV : chacun contient la liste des gares d'une ligne de métro, en partant d'un terminus, vers un autre (dans le sens de succession sur la ligne).

Maintenant, je dois me débrouiller avec ça pour appliquer un algorithme de Dijkstra.
La première étape est donc de déterminer toutes les gares qui permettent une correspondance, et de préciser avec quelle ligne la correspondance est possible.

Mais comment faire ceci en Python ? Avec l'outil "intersection" (set) de Python ? Mais je n'ai réussi à écrire aucun programme qui fonctionne avec... Alors quoi faire ?

Merci beaucoup par avance pour votre aide.

Posté par
fUnderscoreE
re : Optimisation 14-02-20 à 09:05

Tu as l'air un peu dans le stress, relax c'est d'une trivialité banale.

1) Tu clarifies ton but
Tu appliques pas Djikstra comme le saint graal. Tu appliques Djikstra sur un graphe pour trouver une distance minimale entre deux noeuds du graphe.

Ton graphe a pour noeud des stations, et les stations sont reliées entre elles (arrêtes).

Assez intuitivement, tu veux un truc associatif: à chaque station, quelles sont les stations auxquelles j'ai __directement__:

https://www.plandeparis.info/metro-de-paris/ratp-metro.html
- Ourcq a pour (seuls) voisins: Laumière et Porte de Pantin
- Jaurès a pour voisins: Louis, Bolivar, Colonel, Stalingrad, Laumière

De cette manière: tu as définis tes arrêtes:

Ourcq <-> Laumière
Ourcq <-> Porte de Pantin
Jaurès <-> Bolivar
Jaurès <-> Colonel
Jaurès <-> Stalingrad
Jaurès <-> Laumière


2) tu construis ton graphe
Tu crèes un dic {} dont la clé est un nom de station, et dont la valeur est un tableau des stations directement acccessibles. cf 1).

dic  = {
Ourcq: ['Laumière, 'Porte de Pantin'],
...
}

Si tu vois toujours pas l'algo, dans les grands pistes:

pour chaque ligne L.
pour chaque station S de la ligne L, tu ajoutes la station S dans le dic en tant que clé si elle existe pas déjà.
Tu ajoutes en voisin la station précédente de S et la station suivante de S

3) Tu récoles: tu as ce qu'on appèle une liste d'adjacence, qui définis ton graphe et sur laquelle tu peux appliquer Djikstra

Posté par Profil etudiantiloisre : Optimisation 15-02-20 à 13:37

Oui je suis très stressé, les concours approchent beaucoup trop vite, ça, le TIPE......... C'est l'horreur.

Donc là l'objectif c'est de savoir, pour chaque station, à quelles autres stations elle est reliée.

Pour être plus concret, voici donc ce que j'ai. J'ai une liste nommée "métros" contenant 16 listes. Chacune des 16 listes contenue dans "métros" est une liste contenant la succession des stations de métro d'une ligne.

Voici un extrait de la liste "métros" :

métros=[['La Défense Grande Arche','Esplanade de La Défense','Pont de Neuilly','Les Sablons','Jardin d'Acclimatation','Porte Maillot','Palais des Congrès','Argentine','Charles de Gaulle - Étoile','George V','Franklin D. Roosevelt','Champs-Élysées - Clemenceau','Grand Palais','Concorde','Tuileries','Palais-Royal - Musée du Louvre','Louvre - Rivoli','Châtelet','Hôtel de Ville','Saint-Paul','Le Marais','Bastille','Gare de Lyon','Reuilly - Diderot','Nation','Porte de Vincennes','Saint-Mandé','Bérault','Château de Vincennes'],
['Charles de Gaulle - Étoile','Ternes','Courcelles','Monceau','Villiers','Rome','Place de Clichy','Blanche','Pigalle','Anvers','Sacré-Cœur','Barbès - Rochechouart','Chapelle','Stalingrad','Jaurès','Colonel Fabien','Belleville','Couronnes','Ménilmontant','Père Lachaise','Philippe Auguste','Alexandre Dumas','Avron','Nation'],...]

métros[0] est donc la liste des stations de métro de la ligne 1 du métro de Paris. Et là, on voit déjà quelque chose de pas cool : métros[0] alors que c'est la ligne 1...

métros[13] est donc la liste des stations de métro de la ligne 14.

Il faut aussi savoir que j'ai un fichier Excel avec la distance de chaque station par rapport à un des terminus de la ligne. J'ai ça pour toutes les lignes.

Maintenant, comment puis-je automatiser la création du dictionnaire dont vous parlez ?

Merci beaucoup de m'aider, je panique un peu là..............

Posté par
fUnderscoreE
re : Optimisation 15-02-20 à 14:46

1. pour une ligne de métro donnée (subway_line), ainsi que la i-ème station dans le tableau


dic = {}
station = subway_line[i]
# TODO: gerer le cas ou i+1 = len(subway_line)
next = subway_line[i+1]
if station in dic:
  dic[station].append(next)
else:
  dic[station] = [next]

# on ajoute l'arrête dans l'autre sens pour avoir les deux directions
if next in dic:
  dic[next].append(station)
else:
  dic[next] = [station]


2. même ligne mais pour tout index de la ligne

for (i, station) in enumerate(subway_line):
  ...guess what



3. même chose mais pour toute station subway_line

for subway_line in metros:
  ...guess what



commence déjà par vérifier que ton dictionnaire est correctement construit, seulement apres inquiète toi du poids des arrêtes

Posté par Profil etudiantiloisre : Optimisation 15-02-20 à 16:32

Merci beaucoup pour votre réponse.

Alors, je vais commencer en simplifiant, parce que là je m'y perds........

Prenons deux lignes de métro dont les stations peuvent être A, B, C, D ou E :

L1=["A","B","C"]
L2=["B","D","E"]

On peut donc créer : L=[["A","B","C"],["B","D","E"]]

dic = {}

Comment incorporer L dans votre programme ?

Désolé d'être si mauvais...

Posté par Profil etudiantiloisre : Optimisation 15-02-20 à 16:51

J'ai eu des précisions de l'enseignante qui coordonne ce travail, et il veut ceci un dictionnaire par station, avec, pour chaque dictionnaire : l'entrée est une station de métro, et chaque valeur associée est la liste des stations sur la même ligne ainsi que les distances les séparant de la station de départ (terminus).

Sachant que j'ai, pour chaque ligne, un fichier CSV du type : (voir ci-dessous)

Merci beaucoup de m'aider....

Optimisation

Posté par
fUnderscoreE
re : Optimisation 15-02-20 à 16:56

Simplifier est un très bon réflexe.

Tu peux continuer dans la simplification.

Concentrons-nous même sur seule ligne. Mettons L1.

Si je te dis de gérer la station à l'indice i pour un i entre 0 et 2 que codes-tu?

ex: Si i = 0, alors station = L1[i] = A et le résultat attendu est


dic = {
  A: ['B'],
  B: ['A']
}

Posté par Profil etudiantiloisre : Optimisation 15-02-20 à 16:58

Merci beaucoup pour votre réponse très rapide.

Avez-vous quelques minutes pour m'aider, jusqu'à 17h30 par exemple ?

Je réfléchis tout de suite à votre question !

Posté par Profil etudiantiloisre : Optimisation 15-02-20 à 17:01

Pour avoir la liste des stations à traiter, voici ce que j'écrirais :

dic={}
for i in range (len(L)):
    for j in range (len(L[i])):
        station=L[i][j]

Est-ce un bon début ?

Posté par
fUnderscoreE
re : Optimisation 15-02-20 à 17:24

ben ce que tu fais c'est pas faux.
est-ce que c'est un bon début je sais pas.

par contre c'est pas du tout ce que je t'ai demandé

reprends mon message de 16h56, je pense être suffisamment clair. Si je suis pas clair n'hésite pas à me demander d'éclaircir ce qui n'est pas clair, mais ca sert à rien de tenter du code au bonheur la chance

Posté par Profil etudiantiloisre : Optimisation 15-02-20 à 17:33

Alors effectivement je veux bien quelques précisions svp, car je crois que je ne comprends pas ce que vous attendez exactement malheureusement...

Merci encore.

Posté par
fUnderscoreE
re : Optimisation 15-02-20 à 19:08

Dans le poste de 14h46, je te donne les étapes pour construire une liste d'adjacence.
Je pense que t'as vu du code et a considéré le post comme trop complexe. Soit.

Dans le poste de 16h56, j'insiste de manière plus simple.

Je te demande de remplir la variable dic, correspondant à la liste d'adjacence.
Je restreins le problème à __une seule__ ligne de metro: L1 = ['A', 'B', 'C']

Je restreins de surcrois à __une seule__ station, la station L1[i].

Donc si je te donne:
- L1 = ['A', 'B', 'C']
- i = 1

Comment peux tu remplir dic de manière à avoir


dic = {
  'B': ['C'] // vu que C est le successeur de B
  'C': ['B'] // vu que pour le metro dans lautre sens, B est le successeur de C
}

Posté par Profil etudiantiloisre : Optimisation 15-02-20 à 21:39

OK, alors voilà là où j'en suis.

J'ai construit un dictionnaire qui, pour un numéro de ligne de métro donné (clé), donne la liste des station de cette ligne de métro (valeur).

Par exemple : dic[1]=['La Défense Grande Arche','Esplanade de La Défense','Pont de Neuilly','Les Sablons','Jardin d'Acclimatation','Porte Maillot','Palais des Congrès','Argentine','Charles de Gaulle - Étoile','George V','Franklin D. Roosevelt','Champs-Élysées - Clemenceau','Grand Palais','Concorde','Tuileries','Palais-Royal - Musée du Louvre','Louvre - Rivoli','Châtelet','Hôtel de Ville','Saint-Paul','Le Marais','Bastille','Gare de Lyon','Reuilly - Diderot','Nation','Porte de Vincennes','Saint-Mandé','Bérault','Château de Vincennes'].

Je trouve que c'est pas mal.

Maintenant, j'ai besoin de créer le graphe de station de métro, via une liste d'adjacence, comme ce qui est fait sur l'image.

Est-ce possible dans mon cas ?

Mais il faudrait que chaque gare ait un numéro et non un nom ?

Merci encore de m'aider...

Optimisation

Posté par
fUnderscoreE
re : Optimisation 16-02-20 à 00:42

Etudiantlilois, tu demandes de l'aide.
Jte propose liste dadjacence et jte donne deja les algo.
Tu ne daignes PAS lire ni expliquer pourquoi tu rejettes.
Je simplifie.
Tu rejettes encore et dit juste :jai pas compris ce que je dois faire.
Je simplifie encore!!!
Tu ignores, te gratifies de repondre à côté, et demandes de l'aide.

A quoi bon tenter si tu ne prends pas la peine de lire?

1 2 +




Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !