VILLES = [
[1 , 1] ,
[3 , 1] ,
[2 , 2] ,
[4 , 2] ,
[2 , 4]
]
N = l e n ( VILLES )
Dans la suite de l’exercice, on suppose que VILLES et Nsont définies en variable globale.
La première ville est VILLES[0] et se trouve aux coordonnées (1,1). La seconde, VILLES[1] aux coordonnées
(3,1), etc. On a donc VILLES[1][0] == 3,VILLES[1][1] == 1...
On définit un itinéraire entre villes comme une liste d’indices i∈[0, n −1] de villes, tel que chaque indice ap-
paraît une et une seule fois dans la liste. L’itinéraire de la figure 1.(b) est représenté par la liste [0, 3, 1, 4, 2]
et celui de la figure 1.(c) par [0, 1, 3, 4, 2]. Le fait que l’itinéraire soit cyclique est implicite : on ne fait pas
apparaître deux fois l’indice de la ville de départ. On peut remarquer que les dessins des figures 1.(b) et 1.(c)
peuvent être représentées par plusieurs listes (selon le sens de parcours et le choix de la ville de départ).
1.2 Algorithme probabiliste de résolution
Nous allons dans un premier temps écrire une fonction choisir_itineraire() qui choisit un itinéraire au
hasard. Cette fonction va choisir les villes une par une (nchoix pour la première ville, puis n−1choix parmi les
villes restantes, puis n−2...). Choisir un entier dans l’intervalle [0, n]se fait en Python avec randint(0, n)
(randint se trouve dans le module Python random). Il nous reste à implémenter la fonction « choisir une ville
parmi les villes non encore visitées ».
Question 1 (1.5 points) Écrire une fonction choisir_ville(itineraire) qui renvoie une ville (un entier
dans [0, n−1]) qui n’apparaît pas dans itineraire. La ville doit être choisie aléatoirement avec une distribution
uniforme sur les villes non-visitées.
Question 2 (1 point) Quelle est la complexité en pire cas de la fonction choisir_ville(itineraire)
que vous venez d’écrire ? On demande une notation du type O(. . .), et une justification du résultat.
Question 3 (1 point) Écrire une fonction choisir_itineraire() qui construit et renvoie une liste de n
villes différentes choisies aléatoirement.
Question 4 (0.5 point) Écrire une fonction distance(n1, n2) qui renvoie la distance entre la ville
d’indice n1 et celle d’indice n2. Sur notre exemple, distance(0, 1) doit renvoyer 2.
Question 5 (1.5 points) Écrire une fonction longueur_itineraire(itineraire) qui prend en paramètre
un itinéraire et renvoie la longueur de l’itinéraire (i.e. la somme des distances entre les villes apparaissant dans
l’itinéraire, sans oublier la distance à parcourir pour revenir au point de départ).
Question 6 (2 points) Écrire une fonction voyageur(k) qui tire kitinéraires aléatoirement et renvoie
l’itinéraire le plus court parmi ceux-ci.
Question 7 (1 point) Quelle est la complexité de la fonction voyageur que vous venez d’écrire (attention,
la complexité est fonction de plusieurs variables). Justifiez votre réponse.
Question 8 (1 point) Écrire une fonction affiche_itineraire(itineraire) qui prend en argument un
itinéraire et affiche les coordonnées des villes à parcourir.
Par exemple, affiche_itineraire([0, 3, 1, 4, 2]) doit afficher :
[1 , 1]
[4 , 2]
[2 , 2]
[2 , 4]
[3 , 1]
Question 9 (0.5 point) Écrire le code Python qui calcule et affiche l’itinéraire le plus court parmi 1000
tirages aléatoires.
2