nsi:tds:algorithmes:glouton:plus_court_chemin
Table des matières
Glouton : Plus court chemin
Présentation
On considère une liste de points dont les coordonnées sont données.
Par exemple A(0;0), B(3;2), C(18;11)… X(100,100).
J'ai donné des noms au points. C'est seulement pour l'explication. Ces noms n'ont aucune importance.
- On part toujours du premier de ces points (ici A),
- on cherche à atteindre le dernier point (ici X),
- entre deux points, la distance est calculée de façon habituelle :
$$d_{BC} = \sqrt{(x_C - x_B)^2 + (y_C - y_B)^2} \approx 17,49$$
- on ne passe pas deux fois par un même point,
- d'un point donné on a le droit d'atteindre tous ceux, non visités, à une distance inférieure à L (paramètre à définir)
On cherche à effectuer le trajet en totalisant une distance minimale.
Les données
On vous fournit un tableau de coordonnées. Par exemple :
coords = [(0,0), (40, 41), (16, 58), (0, 32), (30, 90), (29, 76), (88, 47), (17, 60), (54, 7), (24, 34), (55, 97), (62, 24), (80, 23), (11, 40), (78, 64), (4, 1), (35, 40), (19, 45), (69, 93), (0, 52), (58, 32), (100,100)]
On pourra aussi fournir les coordonnées sous forme d'un fichier comme coords.csv.
Approche gloutonne
- On note le point à atteindre,
Dest, qui est le dernier point, - on part du premier point,
- et pour les pas suivant,
- on cherche les points non visités à une distance inférieure à
L, - parmi ceux-là, on sélectionne celui qui est le plus proche de
Dest
À faire
Un premier module de fonctions
# glouton.py
from math import sqrt
def distance(p1, p2)->float:
"""
p1: paire (x1, y1)
p2: paire (x2, y2)
renvoie la distance de p1 à p2
"""
# à compléter
def glouton(coords, L:float):
"""
coords: liste de coordonnées (x,y)
L: longueur de saut maximal
renvoie une liste de coordonnées du parcours glouton et sa longueur
Si le chemin trouvé n'aboutit pas, renvoie chemin, -1
parcours glouton : du premier au dernier point de coords,
en sautant vers le plus proche de l'arrivée, par saut < L
sans passer 2x au même endroit
"""
def coords_from_file(filename:str):
"""
filename: nom de fichier
renvoie la liste de coordonnées (x:int,y:int) contenues dans le fichier
"""
Un script de démonstration
# demo1.py import matplotlib.pypplot as plt from glouton import glouton coords = [(0,0), (40, 41), (16, 58), (0, 32), (30, 90), (29, 76), (88, 47), (17, 60), (54, 7), (24, 34), (55, 97), (62, 24), (80, 23), (11, 40), (78, 64), (4, 1), (35, 40), (19, 45), (69, 93), (0, 52), (58, 32), (100,100)] # ajouter l'exécution du code glouton avec L = 20 # puis l'affichage de tous les points avec matplotlib # et l'affichage du parcours obtenu
Et une autre démonstration
# demo2.py
import matplotlib.pypplot as plt
import glouton
coords = glouton.coords_from_file('coords.csv')
# exécution de l'algo glouton avec L = 20
# affichage comme dans le précédent
nsi/tds/algorithmes/glouton/plus_court_chemin.txt · Dernière modification : de goupillwiki
