Programmation Dynamique : Concepts Clés
Programmation Dynamique : Concepts Clés
Nom de l’enseignant :
PRESENTES PAR :
1
SOMMAIRE
I-Introduction
II Historique et origine
V. Étapes et généralités
1. Suite de Fibonacci
2. Problème du sac à dos (Knapsack)
2
3. Plus court chemin
4. Algorithme de Bellman-Ford
5. Multiplication de chaînes de matrices
[Link] et ordonnancement
2. Gestion des stocks
3. Chaînes logistiques
4. Allocation de ressources
5. Décision séquentielle
Avantages :
a. Évite les recalculs
b. Accélère fortement les algorithmes
c. Applicable à de nombreux problèmes réels
Limites :
a. Peut consommer beaucoup de mémoire
b. Nécessite une structure optimale
c. Complexité parfois difficile à réduire
IX. Conclusion
3
INTRODUCTION
Cette technique est née dans un contexte où l’optimisation des ressources était
cruciale, notamment dans les domaines militaires et scientifiques des années 1950.
Elle s’est ensuite diffusée dans de nombreux secteurs, allant des mathématiques
appliquées à l’intelligence artificielle. Aujourd’hui, elle constitue un outil
incontournable pour traiter des problèmes où la recherche d’une solution optimale
repose sur la décomposition en étapes successives.
1. Définition
La programmation dynamique est une méthode qui repose sur le principe de
diviser pour régner et sur la mémoïsation (stockage des résultats
intermédiaires).
c’est une méthode qui consiste à résoudre un problème en le décomposant en
sous-problèmes, puis à résoudre les sous-problèmes, des plus petits aux plus
grands, en mémorisant les résultats intermédiaires.
4
● Applications modernes
5
1-Richard Bellman
En termes simples :
Richard Bellman a créé la programmation dynamique dans les années 1950 afin de
résoudre des problèmes d’optimisation complexes, souvent séquentiels. À cette
6
époque, de nombreux problèmes de planification nécessitaient de prendre une série
de décisions successives, où chaque choix influençait les suivants. Les méthodes
classiques étaient alors trop lentes et entraînaient une explosion combinatoire, rendant
les calculs impraticables même pour les ordinateurs de l’époque.
Pour répondre à cette difficulté, Bellman a proposé de décomposer ces problèmes en
sous-problèmes plus simples et de mémoriser leurs solutions afin d’éviter les calculs
redondants. Cette approche repose sur son principe d’optimalité, selon lequel une
solution globale optimale est construite à partir de solutions optimales à chaque étape
intermédiaire. Il cherchait ainsi une méthode efficace pour la planification et
l’ordonnancement dans des domaines comme l’économie, l’ingénierie et le contrôle
optimal.
Raisons principales de sa création
• Résolution de problèmes d’optimisation séquentiels : Trouver la meilleure succession
de décisions possibles, par exemple en minimisant un coût, une trajectoire ou un
temps.
• Gestion de la complexité : Plutôt que de recalculer plusieurs fois les mêmes sous-
problèmes (comme dans le calcul naïf de la suite de Fibonacci), Bellman a introduit la
mémorisation, aussi appelée tabulation ou memoization, permettant d’échanger du
temps de calcul contre de l’espace mémoire.
• Formalisation du principe d’optimalité : L’idée qu’une solution optimale d’un
problème global contient nécessairement les solutions optimales de ses sous-
problèmes.
• Applications pratiques concrètes : Initialement développée pour des problèmes réels
tels que la gestion des stocks, l’allocation de ressources et le contrôle optimal,
notamment dans le cadre du guidage de systèmes complexes comme les fusées.
La programmation dynamique a été créée par Richard Bellman pour rendre
abordables et efficaces des problèmes d’optimisation séquentiels trop complexes pour
les méthodes classiques, en évitant les recalculs inutiles grâce à une résolution
structurée et mémorisée des sous-problèmes.
7
La programmation dynamique repose sur un principe fondamental : résoudre un
problème complexe en le décomposant en une série de sous-problèmes plus simples
et plus faciles à gérer. Cette méthode permet d’éviter les calculs redondants en
réutilisant les solutions des sous-problèmes déjà résolus.
Dans le contexte de la recherche opérationnelle, cette décomposition est essentielle
pour traiter des problèmes d’optimisation, comme la gestion des ressources, la
planification ou encore la logistique. Le problème initial est divisé en étapes
successives, où chaque étape dépend des décisions prises aux étapes précédentes.
Prenons un exemple simple : le problème du plus court chemin dans un graphe. Au
lieu de recalculer tous les chemins possibles, on peut calculer le plus court chemin
vers chaque sommet à partir du point de départ, en s’appuyant uniquement sur les
résultats déjà obtenus pour les sommets précédents. Chaque sous-problème
correspond ici à la recherche du chemin optimal jusqu’à un certain sommet.
Ainsi, la décomposition en sous-problèmes permet non seulement de simplifier la
résolution, mais aussi d’améliorer considérablement l’efficacité de l’algorithme,
surtout pour les problèmes à grande échelle.
1- Fonction récursive
8
L’approche Top-Down en programmation dynamique consiste à partir du problème
principal pour le résoudre en le divisant progressivement en sous-problèmes plus
petits. Cette méthode utilise une fonction récursive pour exprimer la solution du
problème global à partir des solutions des sous-problèmes.
La fonction récursive est une fonction qui s’appelle elle-même tant qu’elle n’a pas
atteint un cas de base (ou condition d’arrêt). Elle permet de parcourir l’espace des
solutions de manière descendante, en décomposant le problème étape par étape.
Cependant, une fonction récursive classique peut recalculer plusieurs fois les mêmes
résultats, ce qui est inefficace. C’est pourquoi l’approche Top-Down utilise la
mémorisation (memoization) : chaque fois qu’un sous-problème est résolu, son
résultat est stocké (en mémoire ou dans une structure comme un tableau ou un
dictionnaire). Si le même sous-problème se présente à nouveau, le résultat déjà
calculé est réutilisé.
Cette technique permet d’améliorer considérablement les performances des
algorithmes récursifs en évitant les redondances de calcul, tout en conservant une
structure simple et intuitive.
9
B. Approche du Bottom-Up (Tabulation)
1. Construction d’un tableau
Principe général
• En programmation dynamique, l’approche bottom-up consiste à résoudre un
problème en partant des sous-problèmes les plus simples et en remontant
progressivement vers le problème global.
• On utilise un tableau (ou une matrice) pour mémoriser les résultats
intermédiaires afin d’éviter les calculs répétés.
• Contrairement à l’approche top-down (mémoïsation) qui repose sur la
récursivité, le bottom-up est itératif.
i Dp[i] Explication
0 0 Cas de base : F(0)=0
1 1 Cas de base : F(1)=1
2 1 F(2)=F(1)+F(0)=1+0
3 2 F(3)=F(2)+F(1)=1+1
4 3 F(4)=F(3)+F(2)=2+1
5 5 F(5)=F(4)+F(3)=3+2
6 8 F(6)=F(5)+F(4)=5+3
10
7 13 F(7)=F(6)+F(5)=8+5
8 21 F(8)=F(7)+F(6)=13+8
9 34 F(9)=F(8)+F(7)=21+13
10 55 F(10)=F(9)+F(8)=34+21
Avantages de la tabulation
Objectif
• Le problème doit avoir une structure optimale : la solution globale peut être
construite à partir de solutions de sous-problèmes.
• Il doit aussi présenter des chevauchements de sous-problèmes (les mêmes
sous-problèmes apparaissent plusieurs fois).
• On remplit les premières cases du tableau avec les valeurs triviales connues
(ex. : dp[0], dp[1]).
11
e. Remplir le tableau de bas en haut
Problème
Données
• coins = [1, 3, 4]
• S=6
Étapes de résolution
1. Définir le tableau
a. dp[i] = nombre minimal de pièces pour rendre la somme i
b. Taille : dp[0...S]
2. Initialisation
o dp[0] = 0 (zéro pièce pour rendre 0)
o Les autres cases sont initialisées à l’infini (∞) pour représenter une
solution inconnue
3. Remplissage
Résultat
12
• dp[S] contient le nombre minimal de pièces pour rendre S.
Code complet
# Exemple
print(rendu_monnaie([1, 3, 4], 6)) # Résultat : 2 (2 pièces de 3)
V- Etapes et généralités
13
Exemple 1 : La suite de Fibonacci ; Le problème consiste à calculer. Les sous-
problèmes sont les valeurs pour tout. L’état est défini par un seul paramètre : la
valeur de Chaque est une solution réutilisable.
14
En programmation dynamique, deux approches principales permettent de résoudre
un problème : Top-Down (avec mémorisation) et Bottom-Up (avec tabulation). Le
choix entre ces deux dépend de plusieurs critères :
- Top-Down (mémorisation) :
Cette approche est plus intuitive, car elle commence par le problème global et le
décompose en sous-problèmes plus petits. Elle est basée sur la récursivité et
convient lorsque l'on ne connaît pas d’avance l’ordre d'exécution des sous-
problèmes. Elle est plus facile à écrire mais peut entraîner un dépassement de pile si
la profondeur de récursion est trop grande.
- Bottom-Up (tabulation) :
Elle consiste à résoudre d’abord les plus petits sous-problèmes pour construire
progressivement la solution du problème global. Elle n’utilise pas la récursivité, mais
des boucles, ce qui la rend plus efficace en termes de mémoire et de temps dans
certains cas. Elle est préférable lorsque tous les sous-problèmes doivent être
calculés.
Conclusion :
- On privilégiera Top-Down pour sa simplicité de mise en œuvre et sa clarté.
- On optera pour Bottom-Up lorsqu'on a besoin d'une meilleure performance,
notamment en temps et en espace.
15
La mémorisation ou le remplissage du tableau est la clé de l’efficacité de la
programmation dynamique, permettant de résoudre des problèmes complexes en
temps raisonnable.
3)Identifier les états : Identifier les différentes étapes du problème, c'est à dire pour
prendre une décision.
1-Suite de Fibonacci
16
Deux méthodes permettent d'optimiser :
- Top-Down avec mémorisation : on stocke les résultats des appels récursifs dans un
tableau (ou dictionnaire), et on les réutilise si nécessaire.
- Bottom-Up : on commence par calculer les valeurs de F(0) et F(1), puis on remplit
progressivement un tableau jusqu’à F(n).
Exemple en Bottom-Up :
c
int fibonacci(int n) {
int fib[n+1];
fib[0] = 0;
fib[1] = 1;
for(int i = 2; i <= n; i++) {
fib[i] = fib[i-1] + fib[i-2];
}
return fib[n];
}
Cette méthode a une complexité en temps linéaire O(n), bien plus efficace que
l’approche récursive simple.
17
• A + B : poids total = 2 + 3 = 5 kg, valeur totale = 7 (solution acceptable).
• A + C : poids total = 6 kg, dépasse la capacité du sac.
• B + C : poids total = 7 kg, dépasse la capacité du sac.
• C seul : poids total = 4 kg, valeur = 5.
Solution optimale
La meilleure solution est de choisir les objets A et B, car ils respectent la capacité du
sac tout en donnant la valeur totale maximale de 7
4-Algorithme de Bellman-Ford
A- Énoncé
18
L'algorithme de Bellman-Ford est une méthode utilisée pour trouver le plus court
chemin d'un sommet source unique vers tous les autres sommets d'un graphe
pondéré, même si certaines arêtes ont des poids négatifs. Contrairement à
l'algorithme de Dijkstra, il est capable de gérer ces poids négatifs et de détecter la
présence de circuits de poids négatifs.
B- Principes
-Objectif : Déterminer les distances minimales depuis un point de départ unique vers
toutes les destinations possibles dans un graphe dirigé pondéré.
-Capacité Unique : Il est l'un des rares algorithmes capables de fonctionner avec
des poids d'arêtes négatives.
-Détection de Cycles Négatifs : L'algorithme permet de détecter si le graphe contient
un circuit (cycle) dont la somme totale des poids est négative, auquel cas aucun plus
court chemin n'existe, car la distance pourrait être réduite indéfiniment.
C- Fonctionnement
L'algorithme utilise une approche itérative appelée relaxation, qui réduit
progressivement l'estimation de la distance entre les sommets.
a- Initialisation
-La distance du sommet de départ à lui-même est initialisée à 0.
-Les distances à tous les autres sommets sont initialisées à l'infini.
b- Itérations de Relaxation
-L'algorithme parcourt toutes les arêtes du graphe un nombre fixe de fois : V - 1 fois
(où V est le nombre de sommets).
-À chaque passage, pour chaque arête (u, v), il vérifie si le chemin passant par 'u'
est plus court que le chemin actuellement connu pour atteindre 'v'. Si oui, la distance
de 'v' est mise à jour (relâchée).
-Ce processus garantit qu'après V-1 itérations, le plus court chemin est trouvé pour
tous les sommets accessibles, à condition qu'il n'y ait pas de cycle négatif.
c- Vérification des Cycles Négatifs
- Une V-ième itération est effectuée sur toutes les arêtes.
- Si, lors de cette dernière itération, une distance est encore réduite, cela signifie
qu'un cycle de poids négatif est présent dans le graphe, rendant impossible la
détermination d'un plus court chemin absolu. L'algorithme signale alors cette
condition.
NB:
L'algorithme de Bellman-Ford a une complexité temporelle de O(V × E), où V est le
nombre de sommets et E le nombre d'arêtes, ce qui le rend plus lent que l'algorithme
de Dijkstra (qui est plus efficace pour les graphes sans poids négatifs).
19
5-MULTIPLICATION DE CHAÎNES DE MATRICES
20
Soit m[i,j] = le [Link] de multiplications scalaires pour le calcul de Ai..j =
AiAi+1...Aj.
Un parenthésage optimal est le produit de 2 parenthésages optimaux
((Ai..k).(Ak+1..j))
pour une certaine valeur de k.
Les dimensions des matrices produits Ai..k et Ak+1..j sont respectivement pi−1 × pk
et pk ×pj.
Donc on obtient m[i,j] = m[i][k] + m[k + 1][j] + pi−1pkpj.
2. Définition récursive de la valeur optimale
Exemple :
Supposons 3 matrices :
21
• A : 10 × 30
• B : 30 × 5
• C : 5 × 60
Deux façons possibles :
1) (A × B) × C
Coût = (10 ×30 × 5) + (10 × 5 × 60)
= 1500 + 3000
= 4500
2) A × (B × C)
Coût = (30× 5 × 60) + (10 × 30 × 60)
= 9000 + 18000
= 27000
1- Planification et ordonnancement
I-Définition de quelques concepts utilisés dans le domaine
En production industrielle, les termes ordonnancement, planification et
contraintes ont des significations spécifiques liées à l'organisation et à la
gestion des tâches. Voici la définition de chaque terme :
I-1. Ordonnancement :
L’ordonnancement désigne la méthode de gestion du temps et des
ressources pour réaliser les différentes tâches ou opérations de production. Il
s'agit de déterminer l'ordre dans lequel les différentes tâches doivent être
réalisées pour atteindre les objectifs de production dans les délais impartis.
L'ordonnancement peut concerner :
• L'assignation de tâches aux machines, opérateurs, ou lignes de production.
• La gestion des priorités des tâches en fonction de l'urgence ou de l'importance.
• L'optimisation de la production pour minimiser les coûts et les délais.
• L'ordonnancement peut être statique (fixe, avec peu de changements) ou
dynamique (adaptatif, avec des ajustements en temps réel).
L’ordonnancement est un processus essentiel dans le domaine de la
gestion de la production et de la chaine d’approvisionnement
I-2. Planification:
22
. I-2-1 Définitions
La planification industrielle est un processus anticipatif et stratégique qui
consiste à définir les objectifs de production à long terme, à moyen, à court
terme et à établir un programme de travail pour les atteindre. Ce programme
de travail vise à élaborer et à réviser un ensemble de plans interdépendants de
(ventes, fabrication, achats, trésorerie) en vue de garantir le meilleur équilibre
possible entre l’offre et la demande en tout point de la chaîne logistique à tout
moment. Voire figure 1.
Sa réalisation exige l’implication de plusieurs fonctions de l’entreprise afin de
déterminer les délais et les priorités de la production. De la direction générale
qui a une vision à plus long terme jusqu’au responsable de production qui gère
le planning journalier.
Demande Offre
( Besoins du marché ) ( Ressources entreprise )
23
• Elle s’étale sur plus de • Elle s’étale sur une
• Elle couvre une
cinq ans. période pas plus qu’un an.
période de cinq ans au
• Il s’agit : • Les cadres inférieurs
maximum.
− d’analyser certains aspects de définissent :
• Les chefs de
l’environnement externe. − les tâches à accomplir
départements et les
− de repérer les forces et les − les programmes, les
directeurs élaborent :
faiblesses. projets, les opérations et les
des plans détaillés,
• Le dirigeant détermine : activités propres à leurs
coordonnés, qui
− la mission de l’entreprise. − les unités organisationnelles.
concerne la
objectifs généraux de l’entreprise • Elle consiste aussi à
production, la
(objectifs annuels, prévisions de mettre en œuvre et
commercialisation et
besoins, investissements). contrôler les réalisations.
les ressources
humaines...
− les politiques et les stratégies.
Elle se déploie en trois étapes :
• Une analyse préalable,
• La définition d'objectifs spécifiques (conception du plan)
• La répartition des tâches (l'exécution.).
2. LA METHODE PERT
Principe de la méthode : Réduire la durée totale d'un projet par une analyse
détaillée des tâches ou activités élémentaires et de leur enchaînement. On
étudie les délais sans prendre en compte les charges.
Notions de base :
Étape : commencement ou fin d'une tâche. Une étape n'a pas de durée. On
symbolise une étape (ou « nœud ») sur le réseau par un
cercle.
24
B (6 )
1 2 3
A
(12) Exemple de réseau :
A (12 )
Tâches successives :
Exemple :
25
Exemple :
D (4 )
3 5
B (6)
A (12)
1 2
C (3)
4
D (4 )
3 4
B (6)
A (12)
1 2 X (0)
C (3)
3'
Exemple :
1
A (12)
C (3 )
3 4
B (6)
Ici, la tâche A (12) a une durée de 12 unités de temps, B(6) a une durée
de 6 unités de temps. On constate que la tâche A dure plus
longtemps que B. A est dite « Pénalisante ».
26
Nous pouvons calculer la durée du projet (ici : 12+3 = 15 unités de
temps) en prenant le chemin le plus long dit « chemin critique ».
Ce « chemin critique » pourra être repéré en rouge. Les tâches de ce
chemin seront à surveiller prioritairement.
Normalisation du graphe.
Si le graphe doit débuter par plusieurs tâches simultanées, il ne doit y
avoir qu'une seule étape d'entrée (ou étape de début, ou étape de
départ). Les étapes seront donc regroupées en une seule.
Exemple :
A (12)
1 4 2
A (12)
B (6) B (6)
2 5 1 3
C (3)
B (6) 6
3 4
NON OUI
Exemple :
T (2)
11 14 11 T (2)
U (4) 15 12 U (4)
12 14
V (6)
V (6) 16
13 13
NON
OUI
Problèmes de dépendances : A enclenche B, A enclenche D, C
enclenche D.
27
1 4
A (12)
B (6)
3
C (3)
D (4)
2 FAUX 5
A (12) C (3)
1 3 4
X (0)
B (6) D (4)
2 3' 5
28
- Déterminer des antériorités : tâches immédiatement antérieures, et tâches
antérieures. - Déterminer les niveaux d'exécution ou rang des tâches
(optionnel). - Construire le réseau PERT.
Calculer la durée du projet, les dates début et de fin des tâches.
Déterminer le chemin critique. Mettre en évidence les marges.
Application.
Soit les tâches suivantes qui constituent un projet : A (3), B (4), C (2), D (3), E
(4).
Nous pouvons utiliser une matrice (ou grille) de dépouillement des données
(dite : « matrice de dépouillement par les sommets ») : On met une croix
lorsqu'il y a une antériorité entre une tâche et une autre. On cherche s'il existe
des croix dans l'une des colonnes. Si nous ne trouvons pas de croix dans
certaines, cela signifie que les tâches repérées en haut des colonnes n'ont pas
d'antériorité. Elles sont alors de rang 1. On note ces tâches, puis on barre les
lignes horizontales correspondant à ces tâches et on réitère l'opération
précédente. On détermine les tâches de rang 2 et ainsi de suite.
29
Matrice (ou grille) de dépouillement :
Après → A B C D E
Avant
A X X
B X
C X
D
E
A (3) D (3)
1 2 4
B (4) C (2)
E (4)
3. LA METHODE M.P.M.
Notions de base :
31
La méthode est une représentation graphique qui permet de bâtir un « réseau
».
Tâche A : 4 jours
Début Fin
:23/10/2000 :26/10/2000
Exemple de réseau :
- Établir la liste des tâches (faire le partitionnement des tâches en fonction des
ressources).
32
- Déterminer des antériorités : tâches immédiatement antérieures, et tâches
antérieures.
- Déterminer les niveaux d'exécution ou rang des tâches (très facile avec cette
méthode).
- Construire le réseau MPM.
- Calculer la durée du projet, les dates début et de fin des tâches. Déterminer
le chemin critique. Impossible ici de mettre en évidence les marges : voir
diagramme de Gantt.
4. Le diagramme de GANTT
Exemple :
Tâches A B C D E F G H I J K L M
Durée 1 2 1 3 2 5 2 5 2 1 4 5 4
Antériorités - - A - B E C, D - H - I, J F, G K, L
33
Réseau MPM :
A:1 C:1
D:3 G:2
J:1
5 jours
4
jours
34
Analyse :
- Le projet est réalisable en 18 jours ouvrés. Ici, avec les fins de semaines
non travaillées il faudra 3 semaines et 3 jours.
- Les tâches normales sont représentées en bleu.
- Les tâches critiques sont représentées en rouge : B, E, F, L, et M.
- On distingue les marges totales en noir, et les marges libres en vert. Les
tâches C, G, J, et K font apparaître de la Marge Libre.
5. Le PERT probabilisé
La durée des tâches est supposée fixe pour réaliser les études
précédentes. Or, généralement, la durée d'une tâche n'est pas fixe et peut
fluctuer. Le PERT probabilisé prend en compte l'incertitude, la fluctuation au
niveau de la durée d'exécution des tâches.
On peut définir pour chaque tâche :
35
On en déduit alors la durée estimée la plus probable d'exécution de la tâche :
te = a + 4.m + b 6 ou de = do + 4 . dm +
dp 6
N
Temps le plus
probable
Temps moyen
Temps le plus
optimiste
Temps le plus
pessimiste
(*) : L’incertitude associée aux résultats d’un mesurage peut être regroupée
en deux catégories en fonction des méthodes utilisées pour estimer leur
valeur numérique :
Les incertitudes standards de type A qui sont évaluées par
des méthodes statistiques Les incertitudes standards de
type B qui sont évaluées par d’autres méthodes.
NB : Aucun rapport avec les erreurs systématiques et aléatoires. Le mot
standard signifie que l’on se réfère à une norme.
On détermine la variance pour chaque durée d'exécution de tâche, temps
estimé, soit : V = (b-a)² / 36
On détermine les temps de début et de fin au
plus tôt, soit : Fto = Cto + t
On détermine les temps de début et de fin au plus
tard, soit : Cta = Fta - t
On détermine alors les écarts possibles :
E = Cta – Cto = Fta – Fto
Les tâches ayant un écart E = 0 sont les tâches critiques dont le non respect
de la durée estimée risque de compromettre le projet.
36
On considère que la distribution concernant la durée de réalisation du
projet suit une loi normale, ce qui nous permet d'écrire que la variance
relative à l'ensemble du projet est égale à la somme des variances de
chacune des tâches critiques :
Les durées des tâches sont des paramètres sur lesquels l'entreprise peut
agir. Dans de nombreux cas, à travers l'attribution de moyens
supplémentaires, l'entreprise sera capable d'agir.
La gestion des coûts apparaît alors comme le corollaire de la gestion des
temps et il devient concevable d'envisager la gestion du couple coût-durée.
La méthode qui s'y attache et appelée « PERT-COST » ou « PERT-COÛT ».
6.1. Méthodologie :
37
t
n
–
t
a
Le « CMA » indique le coût supplémentaire associé à la réduction de la
durée d'exécution de la tâche (exemple : 200 € / heure).
Si l'objectif est défini à priori : Sur quelles tâches faut-il agir pour respecter
l'objectif, avec le minimum de coûts supplémentaires ?
Exemple :
Soit le projet suivant :
38
K 5 J 2 1 500,00 €
Méthodologie proposée :
39
Les logiciels informatiques proposés dans le domaine de la gestion de
projets sont nombreux, on peut aisément utiliser :
LEXIQUE :
M.P.M. :
40
« Méthode des Potentiels Métra » = Planning sous forme de réseau
représentant graphiquement l'ordonnancement des opérations d'un projet.
M.R.P. :
Méthode de management des ressources qui permet de construire un plan
directeur. Méthode de gestion de production utilisée par les progiciels.
Ordonnancement :
L'ordonnancement, c'est l'arrangement qui permet d'exécuter
séquentiellement les tâches ou les ordres de fabrication, de façon à ce que
l'ensemble du projet ou de la production soit achevé dans le temps imparti.
P.E.R.T. :
[Eco.] Planning d'organisation montrant sous forme de réseau maillé
l'enclenchement des tâches relatives à la construction d'un ouvrage.
Planning :
[Eco.] Représentation graphique précisant les débuts et fins de tâches sur la
durée d'un projet, d'un chantier, ainsi que les contraintes d'enclenchement des
tâches les unes par rapport aux autres.
SMED :
Méthode « Toyota » ou « Single Minute Exchange of Die », c'est à dire réduire
le temps de changement de production à moins de 10 minutes. C'est une des
méthodes permettant l'amélioration de la qualité. La finalité su SMED est de
réduire au maximum le temps d'arrêt requis d'une machine pour procéder à un
changement de fabrication.
41
- Exemple : Un magasin veut gérer son stock de produits frais. On peut utiliser la
programmation dynamique pour décider combien commander chaque semaine pour
minimiser les pertes et les coûts.
Objectif :
Déterminer *quand* et *combien* commander pour satisfaire la demande tout en
minimisant les coûts totaux.
3-Chaînes logistiques
La programmation dynamique peut être utilisée pour modéliser et optimiser les
chaînes logistiques, c’est-à-dire l’ensemble des opérations permettant de gérer le
flux de produits, d’informations et de ressources depuis les fournisseurs jusqu’aux
clients finaux.
Dans ce contexte, les décisions sont souvent séquentielles, comme :
- la quantité de produit à commander à chaque période,
- la gestion des stocks,
- la planification des livraisons,
- ou encore l’allocation des ressources de transport.
Exemple d'application : gestion des stocks
On cherche à minimiser les coûts totaux d'une chaîne logistique sur un horizon
donné, en tenant compte :
- des coûts de commande (chaque fois qu’un réapprovisionnement est effectué),
- des coûts de stockage (par unité et par période),
- des coûts de rupture de stock.
Utilisation de la programmation dynamique :
On divise le problème en sous-problèmes : à chaque période, on décide combien
commander en fonction du stock actuel et de la demande future. La relation de
récurrence permet d’exprimer le coût optimal à partir des décisions précédentes.
Ainsi, la programmation dynamique permet de :
- Optimiser la politique d’approvisionnement,
- Réduire les coûts,
- Améliorer la satisfaction client.
4-Allocation de ressources
42
L’allocation de ressources est un aspect essentiel de la programmation dynamique
en recherche opérationnelle. Elle consiste à répartir de manière optimale des
ressources limitées (comme le temps, l’argent, les matériaux ou la main-d'œuvre)
entre différentes activités ou projets pour atteindre un objectif donné, tel que
minimiser les coûts ou maximiser les profits.
Dans un problème d’allocation de ressources, on cherche généralement la meilleure
façon de distribuer les ressources disponibles à chaque étape ou à chaque tâche,
tout en respectant les contraintes imposées. La programmation dynamique permet
de résoudre ce type de problème en décomposant le processus en plusieurs sous-
problèmes plus simples, résolus de manière séquentielle.
Un exemple classique est la répartition d’un budget entre plusieurs projets pour
obtenir le meilleur rendement global. Grâce à la programmation dynamique, on peut
évaluer toutes les options possibles à chaque étape, en tenant compte des décisions
précédentes, pour trouver la solution optimale.
Imaginons une entreprise qui dispose d’un budget de 10 000 FCFA à répartir entre
trois projets A, B et C. Chaque projet a un coût et un rendement associés. Le but est
de répartir ce budget pour maximiser le rendement total.
Grâce à la programmation dynamique, l’entreprise peut modéliser les différentes
combinaisons possibles d’allocation, analyser le rendement de chaque option et
choisir la meilleure. Le problème est résolu étape par étape : on commence par le
premier projet, puis on ajoute progressivement les autres en tenant compte des
ressources déjà utilisées.
Contexte :
Budget total : 10 000 FCFA
Objectif : Allouer le budget aux projets A, B et C pour maximiser le rendement.
43
2. Étape 2 : Calculer les combinaisons possibles (ex. A + B, B + C…).
3. Étape 3 : Vérifier les combinaisons valides (qui ne dépassent pas 10 000 FCFA).
4. Étape 4 : Calculer le rendement total de chaque combinaison.
5. Étape 5 : Choisir la combinaison avec le meilleur rendement.
44
La décision séquentielle est essentielle dans de nombreux domaines : gestion des
stocks, planification de production, finance, intelligence artificielle et apprentissage par
renforcement. Elle permet de résoudre des problèmes où l’incertitude, le temps et les
choix successifs jouent un rôle central.
Sources : Sutton, R. S. & Barto, A. G. (2018). Reinforcement Learning: An
Introduction. MIT Press.
Avantages
L'adoption de la programmation dynamique repose sur trois piliers majeurs :
a. Éviter les recalculs superflus (Mémorisation) :
C’est le cœur même de la méthode. Dans un algorithme récursif classique, les mêmes
sous-problèmes sont souvent résolus des dizaines, voire des milliers de fois. La
programmation dynamique stocke le résultat de chaque sous-problème dans une
"table" (tableau ou dictionnaire). Dès qu'un résultat est nécessaire une seconde fois, il
est récupéré instantanément.
b. Accélération massive des algorithmes :
En évitant les calculs redondants, on réduit souvent la complexité temporelle de
manière spectaculaire. Par exemple, pour le calcul de la suite de Fibonacci :
Récursion simple : Complexité exponentielle O(2^n).
Progression dynamique : Complexité linéaire O(n).
Cela permet de traiter des données de grande taille qui seraient impossibles à gérer
autrement.
c. Polyvalence et applications réelles :
Ce n'est pas qu'un concept théorique. Elle est indispensable dans des domaines
variés : Logistique : Problème du sac à dos (optimisation de chargement). Bio
informatique : Comparaison de séquences ADN (algorithme de Needleman-Wunsch).
Réseaux : Calcul d'itinéraires (algorithmes de plus court chemin).
Limites
a-Peut consommer beaucoup de mémoire
La programmation dynamique nécessite le stockage systématique des solutions
intermédiaires afin d’éviter les recalculs. Cette mémorisation, bien qu’efficace pour
améliorer les performances en temps, entraîne une consommation importante de
mémoire. Lorsque le nombre d’états est élevé ou que le problème dépend de
45
plusieurs paramètres, la taille des structures de stockage devient rapidement très
grande, ce qui peut dépasser les capacités mémoire disponibles. Cette contrainte
limite l’utilisation de la programmation dynamique pour certains problèmes de grande
dimension.
Source : Bellman, R. (1957). Dynamic Programming. Princeton University Press.
b-Nécessite une structure optimale
La programmation dynamique n’est applicable que si le problème satisfait le principe
d’optimalité de Bellman, selon lequel toute solution optimale globale est composée
de solutions optimales à ses sous-problèmes. Si cette condition n’est pas respectée,
la décomposition du problème en sous-problèmes indépendants devient impossible
ou inefficace. Par conséquent, certains problèmes ne peuvent pas être résolus par
programmation dynamique, ce qui restreint son champ d’application.
Source : Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009).
Introduction to Algorithms. MIT Press.
c-Complexité parfois difficile à réduire
Bien que la programmation dynamique permette de réduire les recalculs, elle
n’élimine pas toujours une complexité élevée. Dans certains cas, le nombre d’états et
de transitions reste important, ce qui peut conduire à des algorithmes coûteux en
temps de calcul. De plus, la définition des états et des relations de récurrence peut
être complexe, rendant la mise en œuvre difficile. Cette complexité limite parfois
l’efficacité pratique de la programmation dynamique pour des problèmes de grande
taille.
Source : Wikipédia – Programmation dynamique (consulté en 2025).
XI- Conclusion
Nous avons vu que cette technique repose sur la mémorisation des résultats
intermédiaires, ce qui permet d’éviter les recalculs inutiles et d’améliorer
considérablement les performances des algorithmes. À travers les différentes
approches, notamment Top-Down et Bottom-Up, ainsi que les exemples classiques
comme la suite de Fibonacci, le problème du sac à dos et le calcul du plus court
chemin, la programmation dynamique montre toute sa puissance et sa polyvalence.
46
de nombreux domaines tels que la planification, la gestion des ressources, les
chaînes logistiques et la prise de décision. Elle occupe ainsi une place centrale dans
l’optimisation moderne, l’informatique et l’intelligence artificielle.
47