Programmation Dynamique & Optimisation Algorithmique
🎯 Analyse des attentes et critères d’évaluation des jurys
Section titled “🎯 Analyse des attentes et critères d’évaluation des jurys”Dans les concours de la filière MP (Mines-Ponts, Centrale-Supélec, X-ENS), les épreuves d’informatique accordent une importance capitale à la rigueur de la modélisation mathématique et à l’efficacité des algorithmes. La programmation dynamique (PD) n’est pas seulement perçue comme une technique de codage, mais comme un pont entre la récursivité mathématique et l’optimisation de complexité.
Les correcteurs et les membres de jurys attendent des candidats :
- Une caractérisation formelle rigoureuse : Avant d’écrire la moindre ligne de code, le candidat doit définir clairement l’espace des états, l’équation de récurrence (ou relation de Bellman) et les conditions initiales.
- Une justification de la complexité : L’analyse de la complexité en temps et en espace doit être systématique. Le passage d’une complexité exponentielle à une complexité polynomiale (souvent linéaire ou quadratique) doit être explicitement commenté.
- Une maîtrise des choix d’implémentation : Distinguer l’approche descendante avec mémoïsation (top-down) de l’approche ascendante (bottom-up), en sachant justifier le choix de l’une ou l’autre selon la structure des dépendances et les risques de récursion excessive (limite de la pile d’appels en Python).
- La propreté du code Python : Utilisation adéquate des tableaux dynamiques (
listou modules commenumpysi autorisé), respect de la typage et absence d’effets de bord non maîtrisés.
📐 Rappels théoriques & Démonstrations incontournables
Section titled “📐 Rappels théoriques & Démonstrations incontournables”La programmation dynamique s’applique aux problèmes d’optimisation vérifiant deux propriétés fondamentales :
-
La sous-structure optimale : Une solution optimale du problème global se compose de solutions optimales des sous-problèmes. Si l’on note la valeur optimale pour le sous-problème , on cherche une relation de la forme :
-
Le chevauchement des sous-problèmes : Un algorithme récursif naïf recalculerait plusieurs fois les mêmes états. La programmation dynamique stocke ces résultats dans une structure de données (tableau ou dictionnaire) pour garantir un temps de calcul polynomial.
📌 Question / Problématique classique 1 : Sous-structure optimale et chevauchement des sous-problèmes
Section titled “📌 Question / Problématique classique 1 : Sous-structure optimale et chevauchement des sous-problèmes”💡 Méthode de rédaction canonique
Section titled “💡 Méthode de rédaction canonique”Pour répondre à ce type de question, la rédaction doit suivre un plan invariable :
- Définition de l’état : Introduire rigoureusement la variable d’état ou en précisant sa signification en français.
- Établissement de la relation de récurrence : Démontrer l’équation de Bellman en prouvant par l’absurde ou par disjonction de cas que la sous-structure optimale est vérifiée.
- Cas de base : Fixer les conditions initiales (frontières du tableau).
📋 Exercice type concours résolu pas à pas
Section titled “📋 Exercice type concours résolu pas à pas”Énoncé inspiré Mines-Ponts : On considère un escalier de marches. À chaque étape, on peut monter de , ou marches. On cherche le nombre de chemins distincts pour atteindre le sommet.
Rédaction type : Soit le nombre de chemins distincts pour atteindre la marche . Pour atteindre la marche (avec ), on a nécessairement provenu de la marche , ou . Les ensembles de chemins menant à ces trois marches sont disjoints. Par conséquent, d’après le principe fondamental du dénombrement, on obtient la relation de récurrence suivante : Les cas de base sont :
- (un seul chemin : ne rien faire)
- (un seul pas de )
- ( ou )
⚠️ Les pièges majeurs relevés dans les rapports de jury
Section titled “⚠️ Les pièges majeurs relevés dans les rapports de jury”- Oubli des cas limites : Ne pas définir correctement les indices ou entraîne des erreurs de type
IndexErrorlors de l’implémentation. - Absence de démonstration : Affirmer la formule sans expliquer pourquoi les sous-problèmes sont indépendants et couvrent toutes les possibilités est lourdement sanctionné.
📌 Question / Problématique classique 2 : Implémentation ascendante (bottom-up) vs mémoïsation
Section titled “📌 Question / Problématique classique 2 : Implémentation ascendante (bottom-up) vs mémoïsation”💡 Méthode de rédaction canonique
Section titled “💡 Méthode de rédaction canonique”Le jury demande souvent de comparer ou d’implémenter les deux approches :
- Mémoïsation (Top-Down) : Fonction récursive avec un dictionnaire ou un tableau de cache (souvent initialisé à
Noneou-1). Avantage : ne calcule que les états strictement nécessaires. Inconvénient : risque de dépassement de pile (recursion depth exceeded). - Ascendante (Bottom-Up) : Boucles iteratives remplissant un tableau de bas en haut. Avantage : pas de risque de récursion, meilleure localité cache. Inconvénient : calcule parfois des états inutiles.
📋 Exercice type concours résolu pas à pas
Section titled “📋 Exercice type concours résolu pas à pas”Implémentation des deux versions pour le calcul des nombres de Fibonacci.
def fibo_memo(n: int, memo: dict | None = None) -> int: """Calcule le n-ieme nombre de Fibonacci par memoisation.""" if memo is None: memo = {} if n in memo: return memo[n] if n <= 1: return n memo[n] = fibo_memo(n - 1, memo) + fibo_memo(n - 2, memo) return memo[n]
def fibo_bottom_up(n: int) -> int: """Calcule le n-ieme nombre de Fibonacci de maniere ascendante.""" if n <= 1: return n t = [0] * (n + 1) t[1] = 1 for i in range(2, n + 1): t[i] = t[i - 1] + t[i - 2] return t[n]⚠️ Les pièges majeurs relevés dans les rapports de jury
Section titled “⚠️ Les pièges majeurs relevés dans les rapports de jury”- Mutables par défaut en Python : Utiliser
memo: dict = {}comme argument par défaut est une erreur classique relevée par les correcteurs (effet de bord persistant entre les appels de fonctions). Préférermemo: dict | None = None. - Complexité spatiale non optimisée : Ne pas voir qu’un tableau de taille peut souvent être réduit à une ou deux variables si l’on a uniquement besoin des états précédents (par exemple, pour Fibonacci, garder seulement
aetbramène l’espace à ).
📌 Question / Problématique classique 3 : Application au problème du sac à dos et à la distance d’édition
Section titled “📌 Question / Problématique classique 3 : Application au problème du sac à dos et à la distance d’édition”💡 Méthode de rédaction canonique
Section titled “💡 Méthode de rédaction canonique”Ces deux classiques des concours nécessitent la construction d’une matrice (programmation dynamique à deux dimensions).
- Définir l’état : par exemple, la valeur maximale avec les premiers objets et une capacité .
- Écrire la double boucle d’initialisation et de remplissage.
- Extraire le résultat final et, si demandé, reconstruire la solution (le chemin ou les objets choisis) en remontant la matrice (backtracking).
📋 Exercice type concours résolu pas à pas
Section titled “📋 Exercice type concours résolu pas à pas”Problème de la distance d’édition (Levenshtein) entre deux chaînes et de longueurs respectives et .
Relation de récurrence : Soit la distance d’édition entre les préfixes et .
undefined