Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
jour_tp_chemin [2018/11/16 13:50] – pprea | jour_tp_chemin [2018/11/19 14:38] (Version actuelle) – pprea | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ==== Présentation Générale ==== | ||
+ | Ce TP a été préparé/ | ||
+ | |||
+ | **Contexte** : De nombreux services (Google Map, Via Michelin, Mappy,...) vous donnent, en quelques secondes, le plus court chemin pour aller d'un point A à un point B au sein d'une carte contenant des millions de points. De plus, cet exploit est souvent réalisé | ||
+ | |||
+ | **But** : Le but de ce TP est de réaliser que ceci est infaisable par les méthodes " | ||
+ | |||
+ | **Travail à réaliser** : Pour cela, on résoudra ce problème sur différentes cartes (contenant 100, 1000,... 30000 points), & on extrapolera les résultats aux cartes réelles. | ||
+ | |||
+ | **Objectif** : À la fin de la séance, l' | ||
+ | |||
+ | ===== Travail à Réaliser ===== | ||
+ | <note importante> | ||
+ | Il est " | ||
+ | </ | ||
+ | |||
+ | Les données à traiter sont [[http:// | ||
+ | Par exemple, la ligne | ||
+ | |||
+ | 3503, | ||
+ | |||
+ | indique que, avec 2308 habitants, Port-en-Bessin-Huppain (code postal 14515) est la 3503me ville de France & que ses coordonnées sont : 49.350°Nord & 0.750°Ouest | ||
+ | |||
+ | Le code | ||
+ | |||
+ | <code python> | ||
+ | NAME = ' | ||
+ | LATITUDE = ' | ||
+ | LONGITUDE = ' | ||
+ | POPULATION = ' | ||
+ | |||
+ | def file_to_node_list(file_name, | ||
+ | node_list = [] | ||
+ | flowfile = open(file_name) | ||
+ | for line in flowfile: | ||
+ | the_data = line.split(',' | ||
+ | node_list.append({NAME: | ||
+ | LATITUDE: float(the_data[3]), | ||
+ | LONGITUDE: float(the_data[4]), | ||
+ | POPULATION: int(the_data[5])}) | ||
+ | flowfile.close() | ||
+ | return node_list | ||
+ | </ | ||
+ | transforme ces fichiers en une liste de dictionnaires, | ||
+ | |||
+ | ==== Première chose à faire ==== | ||
+ | |||
+ | À partir de ces fichiers, construire des graphes comme ceux représentés dans ce [[http:// | ||
+ | Le fichier '' | ||
+ | |||
+ | <note importante> | ||
+ | Il est **fortement conseillé** d' | ||
+ | </ | ||
+ | |||
+ | <note importante> | ||
+ | On remarquera que ce graphe est représenté par une liste d' | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | Il n'est pas obligatoire d' | ||
+ | </ | ||
+ | |||
+ | <note importante> | ||
+ | Dès cette étape (& pour toutes les autres), on représentera graphiquement les résultats obtenus. Cela permettra de " | ||
+ | </ | ||
+ | |||
+ | <note importante> | ||
+ | Le dessin est juste une représentation. On ne peut rien faire à partir de lui. On séparera bien cette partie graphique du reste du programme, & celle-ci s' | ||
+ | |||
+ | </ | ||
+ | |||
+ | Pour cette représentation graphique, on utilisera la librairie '' | ||
+ | |||
+ | par exemple, si '' | ||
+ | <code python> | ||
+ | import matplotlib | ||
+ | from matplotlib import pyplot | ||
+ | |||
+ | pyplot.scatter(latitudes, | ||
+ | pyplot.show() | ||
+ | </ | ||
+ | trace tous les points de coordonnées '' | ||
+ | |||
+ | Pour rajouter un trait noir entre deux points de coordonnées [x1, y1] & [x2, y2], on utilisera | ||
+ | <code python> | ||
+ | pyplot.plot([x1, | ||
+ | </ | ||
+ | |||
+ | <note importante> | ||
+ | Attention, c' | ||
+ | <code python> | ||
+ | pyplot.plot([x1, | ||
+ | </ | ||
+ | & non pas | ||
+ | <code python> | ||
+ | pyplot.plot([x1, | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ====Deuxième chose à faire==== | ||
+ | |||
+ | Programmez les algorithme de Dijkstra & de Roy-Floyd-Warshall & essayez-les sur les différents graphes construits. | ||
+ | < | ||
+ | Il est recommandé de conserver les résultats obtenus par l' | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | Pour ceux qui sont pressés, voici le code de l' | ||
+ | </ | ||
+ | Déterminez si ces algorithmes sont utilisables pour un vrai google-map. | ||
+ | |||
+ | Pour mesurer le temps d' | ||
+ | |||
+ | <code python> | ||
+ | import time | ||
+ | |||
+ | beginning = time.clock() | ||
+ | |||
+ | code_à_tester | ||
+ | |||
+ | the_end = time.clock() | ||
+ | print(the_end - beginning) | ||
+ | </ | ||
+ | |||
+ | ====Troisième chose à faire==== | ||
+ | |||
+ | Le but est maintenant d' | ||
+ | |||
+ | L' | ||
+ | |||
+ | Dans l' | ||
+ | |||
+ | Sur un graphe de ' | ||
+ | |||
+ | Tracer ensuite (toujours simultanément) les deux premiers tiers de ces chemins. Qu' | ||
+ | < | ||
+ | **Spoiler :** Vous pouvez regarder [[http:// | ||
+ | </ | ||
+ | |||
+ | Est-ce que cela s' | ||
+ | |||
+ | On ' | ||
+ | |||
+ | On prendra comme ensemble des hubs associés à Marseille (par exemple) la plus grande ville dans le deuxième tiers de chacun de ces chemins. | ||
+ | |||
+ | Montrez qu'on peut alors obtenir, y compris sur des données de grande taille, le plus court chemin entre deux villes. | ||
+ | |||
+ | ====Quatrième chose à faire==== | ||
+ | |||
+ | Adaptez votre algorithme pour qu'il donne des chemins alternatifs, | ||
+ | |||
+ | |||
+ | ====Cinquième chose à faire==== | ||
+ | |||
+ | Quels sont les problèmes résiduels ? Comment les traiter ? |