DS 1 (MPSI tronc commun 2021-2022) — Poteaux télégraphiques¶
Devoir surveillé · MPSI (tronc commun) · 2021-2022 · parties I et II du DS 1
Cours : Algorithmes gloutons
Autres parties : III. Minimiser la longueur du fil
Ce devoir a pour objectif de choisir où placer des poteaux télégraphiques pour relier le point le plus à gauche d'un paysage unidimensionnel au point le plus à droite en fonction de critères de coût. Nous ferons les simplifications suivantes : les fils sont sans poids et tendus ; ils relient donc en ligne droite les sommets de deux poteaux consécutifs. Les normes de sécurité imposent que les fils soient en tout point à une distance d'au moins \(\Delta\) (mesurée verticalement) au-dessus du sol. Les poteaux sont tous de longueur identique \(\ell \geqslant \Delta\). Voici par exemple une proposition valide de placement de poteaux pour le paysage ci-dessous avec \(\Delta=0.5\) et \(\ell=2.0\).

Figure 1 - Un exemple de poteaux où le fil est en tout point au moins \(\Delta\) au-dessus du sol.
I. Planter le paysage¶
Nous définissons le paysage à partir d'une suite de relevés de dénivelés stockés
dans un tableau deniveles de nombres flottants (c'est-à-dire des nombres à
virgule) de taille \(n+1\).
Le paysage est alors décrit par une ligne brisée de \(n+1\) points, dont le \(i\)-ème point \(P_{i}\) est de coordonnées \(\left(i, h_{i}\right)\) où :
Question 1
Écrire une fonction calculHauteurs(deniveles, n) qui renvoie
un tableau hauteurs de taille \(n+1\) tel que hauteurs[i] soit la hauteur du
\(i\)-ème point.
Question 2
Écrire une fonction calculFenetre(n) qui calcule les hauteurs
minimale et maximale d'un point du paysage et les stocke dans deux variables
globales hMin et hMax. Cette procédure stockera également dans deux
variables globales iMin et iMax les indices des points les plus à gauche de
hauteur minimale et maximale respectivement.
On appelle distance au sol de \(i\) à \(j\), la longueur de la ligne brisée allant du point \(P_{i}\) au point \(P_{j}\).
Question 3
Écrire une fonction distanceAuSol(i, j) qui calcule et renvoie
la distance au sol de \(P_{i}\) à \(P_{j}\).
On appelle un pic un point \(P_{i}\) d'indice \(1 \leqslant i<n\) tel que \(h_{i}>\max \left(h_{i-1}, h_{i+1}\right)\). On appelle point remarquable, les pics et les points des bords gauche (point \(P_{0}\)) et droit (point \(P_{n}\)). On appelle bassin toute partie du paysage allant d'un point remarquable au suivant.
Question 4
Écrire une fonction longueurDuPlusLongBassin(n) qui calcule et
renvoie la longueur au sol maximale d'un bassin dans le paysage.
II. Planter les poteaux¶
On souhaite relier le point le plus à gauche au point le plus à droite par un fil télégraphique. Pour cela, nous devons choisir à quels points parmi les \(\left(P_{i}\right)_{0 \leqslant i \leqslant n}\) planter les poteaux télégraphiques intermédiaires. Rappelons que le fil est supposé sans poids et tendu et qu'il relie donc les sommets de chacun des poteaux en ligne droite. Les poteaux sont plantés verticalement et ont tous une longueur identique \(\ell \geqslant \Delta\) (\(\ell\) et \(\Delta\) sont des nombres flottants).
La législation impose que le fil doit rester à une distance supérieure ou égale à \(\Delta\) (mesurée verticalement) au-dessus du sol. Pour tester si un fil tiré entre un poteau placé au point \(P_{i}\) et un poteau placé au point \(P_{j}\) (avec \(j>i\) ou \(j<i\)) respecte la législation, notons
les pentes des fils tirés depuis le poteau en \(P_{i}\) jusqu'à une hauteur \(\Delta\) au-dessus du point \(P_{k}\) d'une part et jusqu'à une hauteur \(\ell\) au-dessus du point \(P_{j}\) d'autre part (voir la Figure 2).
On admet que le fil tiré d'un poteau en \(P_{i}\) à un poteau en \(P_{j}\) respecte la législation si et seulement si : \(\beta_{i, j} \geqslant \max _{i<k<j} \alpha_{i, k}\), lorsque \(j>i\) ; et \(\beta_{i, j} \leqslant \min _{j<k<i} \alpha_{i, k}\), lorsque \(j<i\).

Figure 2 - Condition sur les pentes pour pouvoir tirer un fil.
Question 5
En utilisant cette méthode, écrire une fonction
estDeltaAuDessusDuSol\((i, j, \ell, \Delta)\) qui renvoie true si un fil tiré entre
les sommets d'un poteau placé au point \(P_{i}\) et d'un poteau placé au point
\(P_{j}\) respecte la législation, et renvoie false dans le cas contraire.
Considérons une première stratégie, dite algorithme glouton en avant. Le premier poteau est planté en \(P_{0}\). Pour calculer l'emplacement du prochain poteau, on part du dernier poteau planté et on avance (à droite) avec le fil tendu tant que la législation est respectée (et que \(P_{n}\) n'est pas atteint). Un nouveau poteau est alors planté, et on recommence jusqu'à ce que \(P_{n}\) soit atteint.
La figure 3 illustre la solution produite par cet algorithme.

Figure 3 - Solution produite par l'algorithme glouton en avant. Les poteaux et les fils en pointillés sont ceux violant la législation.
Question 6
Écrire une procédure placementGloutonEnAvant\((n, \ell, \Delta)\) qui
calcule la disposition des poteaux selon l'algorithme ci-dessus. La solution
sera stockée dans un tableau global poteaux de la façon suivante :
- la case
poteaux[0]contiendra le nombre de poteaux utilisés ; - la case
poteaux[t], pour \(t \geqslant 1\), contiendra l'indice \(i\) indiquant que le \(t\)-ème poteau, s'il existe, est planté en \(P_{i}\).
Question 7
Donner une majoration de la complexité du temps de calcul de votre algorithme en fonction de \(n\). Justifier qu'on peut se contenter du calcul de \(O(n)\) pentes pour implémenter l'algorithme glouton en avant. Expliquer succinctement comment modifier votre procédure (si nécessaire) pour obtenir une complexité en \(O(n)\). Aucune implémentation n'est demandée dans cette question.
L'algorithme glouton en avant a tendance à placer beaucoup trop de poteaux, en particulier dans les vallées alors qu'il suffirait de relier les deux extrémités par un unique fil. Nous considérons donc une alternative, dite glouton au plus loin, qui consiste à planter le prochain poteau le plus à droite possible de la position courante. Le premier poteau est toujours planté en \(P_{0}\).
La figure 4 illustre la solution produite par cet algorithme sur le même paysage que celui de la figure 3.

Figure 4 - Solution produite par l'algorithme glouton au plus loin. Les poteaux et fils en pointillés sont ceux violant la législation.
Question 8
Écrire une procédure placementGloutonAuPlusLoin\((n, \ell, \Delta)\)
qui calcule la disposition des poteaux selon l'algorithme ci-dessus. La solution
sera stockée dans un tableau global poteaux de la façon suivante :
- la case
poteaux[0]contiendra le nombre de poteaux utilisés ; - la case
poteaux[t], pour \(t \geqslant 1\), contiendra l'indice \(i\) indiquant que le \(t\)-ème poteau, s'il existe, est planté en \(P_{i}\).