Voyageur de commerce
La distance
On souhaite rédiger un algorithme glouton pour résoudre le problème du voyageur de commerce. Pour cela, on doit comprendre le fonctionnement des tableaux à deux dimensions.
Si vous ne savez pas ce qu'est une liste à deux dimensions, réalisez cet exercice.
On utilisera donc une liste de listes sous la forme distances[ville1][ville2]
pour connaître la distance de ville1
à ville2
, tous deux des entiers de 0
à n
exclu. On déduit rapidement que distances[ville1][ville2]
et distances[ville2][ville1]
ont la même valeur.
Dans l'exemple ci-dessous, on obtient :
villes = ["A", "B", "C", "D"] # Donc n = 4
distances = [[0, 4, 3, 1],
[4, 0, 1, 2],
[3, 1, 0, 5],
[1, 2, 5, 0]]
Question
À l'aide du tableau des distances donné en introduction, rédiger le contenu des variables villes
et distances
associées.
La ville la plus proche
On cherche désormais à connaître la ville la plus proche d'une ville donnée, connaissant les villes déjà visitées ou non.
Pour chaque ville non visitée, on doit regarder sa distance avec la ville actuelle, et renvoyer la ville la plus proche trouvée.
Afin de connaître les villes déjà visitées, on dispose d'une liste de booléens qui associe à chaque ville une valeur True
si elle a déjà été visitée et False
sinon.
Par exemple, si visitees = [True, False, True, False, False]
, alors les villes numérotées 1, 3 et 4 peuvent être la prochaine destination.
Question
Compléter la fonction plus_proche(ville, distances, visitees)
qui renvoie le numéro de la prochaine ville à visiter.
ville
est un entier indiquant la ville actuelle.distances
est une liste de listes comme défini plus haut.visitees
est une liste indiquant si une ville a été visitée ou non. On suppose quevisitees[ville]
vautTrue
.
N'oubliez pas de rédiger les docstrings de votre fonction, avec un exemple simple vu en cours.
def plus_proche(ville, distances, visitees):
# On règle un cas de base où la distance est très grande
ville_plus_proche = -1
distance_plus_proche = 10000000
n = len(visitees)
# On regarde parmi toutes les villes
for une_ville in range(n):
# Si cette ville n'est PAS déjà visitée
if not ...... :
distance_entre_villes = distances[.....][.....]
# Si cette distance est plus petite que celle enregistrée
if ..... < ..... :
# On met à jour le meilleur résultat.
ville_plus_proche = .....
distance_plus_proche = .....
# On renvoie la ville la plus proche
return ville_plus_proche
L'algo final
Il ne reste plus qu'à appliquer le principe de l'algorithme glouton vu en cours.
Question
Compléter la fonction voyageur_glouton(villes, distances, depart)
ci-dessous :
def voyageur_glouton(villes, distances, depart):
"""
Doc-string à compléter avec l'exemple vu en cours
"""
n = .....
visitees = [False] * n # Permet de créer une liste contenant n fois la valeur False
courante = ..... # Ville qu'on est en train de visiter (ville de départ au début)
visitees[.....] = True
chemin = [.....] # Chemin de visite final
while False in visitees:
suivante = plus_proche(.....)
courante = ..... # La nouvelle ville courante
chemin.append(.....)
visitees[.....] = True
chemin.append(.....)
return .....
Question
Pour les plus rapides :
Afficher le résultat sous forme de texte, et en calculant la distance parcourue.
Testez votre fonction avec d'autres valeurs.
Rédiger un algorithme qui teste tous les chemins possibles, et mesurer son temps d'exécution. Le comparer à l'algorithme glouton.