Cours : Algorithmique : Programmation dynamique
📌 1. Définitions & Cadre d’étude
Section titled “📌 1. Définitions & Cadre d’étude”La programmation dynamique est une méthode algorithmique conçue pour résoudre des problèmes d’optimisation ou de dénombrement. Elle s’applique aux problèmes présentant les deux propriétés structurelles fondamentales suivantes :
- La sous-structure optimale : Une solution optimale du problème global se déduit de solutions optimales de sous-problèmes indépendants ou chevauchants.
- La présence de sous-problèmes redondants : Un algorithme récursif naïf évaluerait plusieurs fois les mêmes sous-problèmes, conduisant à une complexité temporelle généralement exponentielle.
Cadre formel
Section titled “Cadre formel”Soit un problème paramétré par un ensemble de variables (par exemple, un entier , un couple d’indices , ou un poids maximal ). On note la valeur de la solution optimale du sous-problème . L’approche dynamique consiste à :
- Définir récursivement en fonction des sous-problèmes adjacents (relation de récurrence de Bellman).
- Stocker les résultats intermédiaires dans une structure de données (tableau, dictionnaire) pour éviter les recalculs.
📐 2. Théorèmes fondamentaux & Démonstrations clés
Section titled “📐 2. Théorèmes fondamentaux & Démonstrations clés”Théorème de décomposition de Bellman
Section titled “Théorème de décomposition de Bellman”Soit l’ensemble des sous-problèmes d’un problème d’optimisation. S’il existe une fonction de transition telle que pour tout : Alors le calcul global peut être effectué en temps polynomial par rapport au nombre de sous-problèmes et au degré sortant moyen dans le graphe des dépendances.
Démonstration (par récurrence bien fondée)
Section titled “Démonstration (par récurrence bien fondée)”Considérons le graphe orienté où un arc existe si le calcul de requiert . Puisque le problème est acyclique (condition nécessaire pour l’évaluation séquentielle ou mémorisée), est un DAG (Directed Acyclic Graph).
- Initialisation : Pour les sources du DAG (sous-problèmes triviaux, par exemple ou ), la valeur est connue en .
- Hérédité : Supposons que pour tout prédécesseur d’un sommet , a été calculé de manière exacte et optimale. Par hypothèse de récurrence, l’application de l’opérateur sur l’ensemble garantit l’optimalité de .
- Conclusion : Par induction sur le rang topologique dans le DAG, tous les sommets de sont calculés de manière optimale.
💡 3. Méthodes de calcul & Algorithmes
Section titled “💡 3. Méthodes de calcul & Algorithmes”Il existe deux approches principales pour implémenter la programmation dynamique :
A. L’approche ascendante (Bottom-Up) ou Itérative
Section titled “A. L’approche ascendante (Bottom-Up) ou Itérative”On calcule les sous-problèmes du plus petit au plus grand, en remplissant une table de dimension . C’est l’approche privilégiée en Python en CPGE pour éviter les dépassements de pile (RecursionError).
B. L’approche descendante (Top-Down) avec mémoïsation (Memoization)
Section titled “B. L’approche descendante (Top-Down) avec mémoïsation (Memoization)”On écrit une fonction récursive classique, mais on stocke chaque résultat dans un dictionnaire ou un tableau global (souvent initialisé à None). Si le sous-problème a déjà été résolu, on retourne sa valeur en .
Exemple canonique : Le problème du sac à dos 0-1
Section titled “Exemple canonique : Le problème du sac à dos 0-1”Soit objets, de poids respectifs et de valeurs pour . Soit la capacité maximale du sac.
Soit la matrice où représente la valeur maximale atteignable avec un sous-ensemble des premiers objets et une capacité .
Relation de récurrence :
undefined