ALGORITHMES GLOUTONS(2) TP
Algorithmes gloutons (2) – TP
14On rappelle qu’un algorithme glouton est un algorithme qui effectue à chaque instant, le meilleur choix possible sur le moment, sans retour en arrière ni anticipation des étapes suivantes, dans l’objectif d’atteindre au final un résultat optimal.
Exemple du plus court chemin dans le plan
Un livreur doit distribuerncolis ànadresses. Chaque adresseA,B,C,. . . est symbolisée par un point dans le plan et la position de départ est notéeΩ. Pendant sa tournée, le livreur doit passer à chaque adresse une et une seule fois.
Pour aller d’un point à un autre, le livreur parcourt un chemin linéaire.
On suppose que lesnadresses appartiennent à un carré d’arête stockée dans une variablearete. 1. Dénombrer les chemins possibles.
2. Expliquer pourquoi un algorithme qui consisterait à calculer toutes les distances de tous les chemins possibles n’est pas envisageable.
3. Proposer une stratégie plus efficace.
Les coordonnées des différents points du plan sont stockées dans une liste à deux éléments[x, y].
Les différentes coordonnées des adresses sont stockées dans une liste. Par exemple, la liste[[1, 2], [-3, 5]]
correspond aux coordonnées de deux points A(1, 2) et B(−3, 5). Le point de départ Ωn’appartient à la liste des coordonnées car on le prend comme origine du repère. Ses coordonnées sont doncΩ(0, 0).
4. Écrire une fonctiondistance(p1,p2)oùp1etp2sont les coordonnées de deux points et qui renvoie la distance entre ces deux points. On rappelle que la distance d(P1,P2) entreP1(x1,y1) etP2(x2,y2) est donnée par :
d(P1,P2)= q
(x2−x1)2+(y2−y1)2.
La première étape pour mettre en place la stratégie gloutonne est de calculer les distances entre chaque point du plan, point de départ y compris. Toutes les distances calculées seront stockée dans un tableau représenté par une liste de listes comme ci-dessous.
Python
1 # Distances entre A(1,2), B(-3,5) et Omega(0,0).
2 d =
3 [[0, 5.0, 2.23606797749979], # <--- [d(A,A),d(A,B),d(A,Omega)]
4 [5.0, 0, 5.830951894845301], # <--- [d(B,A),d(B,B),d(B,Omega)]
5 [2.23606797749979, 5.830951894845301, 0]] # <--- [d(Omega,A),d(Omega,B),d(Omega,Omega)]
5. Donner l’instruction permettant d’extraire du tableaudla distance deAàB.
G. BOUTARD& S. CALLEA 1 Lycée GAY-LUSSAC
TP ALGORITHMES GLOUTONS(2)
6. Le programme suivant construit le tableaud. Compléter le.
Python
1 def distances(points,omega):
2 """
3 Entrée : liste des coordonnées des points, liste des coordonnées de Omega
4 Sortie : liste de listes
5 Distances entre tous les points A,B,...,Omega
6 """
7 n = len(points)
8 d = [...*[0] for i in range(...)] # A compléter
9 for i in range(n):
10 for j in range(i):
11 d[i][j] = # A compléter
12 d[j][i] = # A compléter
13 for i in range(n):
14 d[i][n] = # A compléter
15 d[n][i] = # A compléter
16 return d
7. Exprimer en fonction denle nombre de distances calculées par la fonctiondistances.
On commence à mettre en place la stratégie gloutonne. Connaissant la position du livreur à un instant donné, l’adresse suivante sera celle dont la distance avec la position du livreur à l’instant donné est la plus courte.
Il conviendra cependant de pouvoir vérifier qu’une adresse a déjà été visitée ou non. Pour cela, on utilisera une liste nonVisitede longueurntelle que :nonVisite[i] = Truesi l’adresse n’a pas encore été visitée par le livreur et nonVisite[i] = Falsesinon.
8. Compléter la fonctionindiceSuivantpermettant de déterminer l’indice de l’adresse suivante.
Python
1 def indiceSuivant(position, d, nonVisite):
2 """
3 Entrée : indice de la position du livreur, tableau des distances,
4 liste des adresses visitées ou non
5 Sortie : indice de la position de l'adresse suivante
6 """
7 n = len(d) - 1
8 mini = 2 * arete
9 for i in range(n):
10 if nonVisite[i] == True :
11 dist = d[position][i]
12 if dist < mini:
13 mini = dist
14 indice = i
15 return indice,nonVisite
PCSI 2021 – 2022 2 G. BOUTARD& S. CALLEA
ALGORITHMES GLOUTONS(2) TP
9. Expliquer le fonctionnement de la fonction suivante : Python
1 def plusCourtChemin(points,omega):
2 """
3 Entrée : liste des coordonnées des points, liste des coordonnées de Omega
4 Sortie : liste de listes
5 Plus court chemin
6 """
7 n = len(points)
8 position = n # Point de départ
9 chemin = [position]
10 nonVisite = n * [True] # Aucune adresse visitée
11 d = distances(points,omega)
12 for i in range(n):
13 position,nonVisite = indiceSuivant(position, d, nonVisite)
14 chemin.append(position)
15 nonVisite[position] = False
16 return chemin
10. Compter le nombre de distances calculées par la fonctionplusCourtChemin. Comparer au nombre de chemins possibles (question 1).
G. BOUTARD& S. CALLEA 3 Lycée GAY-LUSSAC