Académique Documents
Professionnel Documents
Culture Documents
[Date]
telciman
[nom de la société]
PLAN
INTRODUCTION
OBJECTIF
PRE REQUIS
GENERALITE
TRAVAIL DEMANDE
PRISE DE RECUL
CONCLUSION
INTRODUCTION
La programation dynamique est un paradigme de conception qu’il est possible de voir
comme une amélioration ou une adaptation de la méthode diviser et régner. Ce concept
a été introduit par Bellman, dans les années 50, pour résoudre typiquement des
problème d’optimisation.
La programmation dynamique est une méthode d’optimisation opérant par phases (ou
séquences) dont l’efficacité repose sur le principe d’optimalité de Balmolan : toute
politique optimale est composée de sous-politiques optimales.
Résoudre un problème d’optimalité par la programmation dynamique est, dans ce
contexte précis, une mise en œuvre significative de la diversité des compétences
attendues d’un ingénieur : modélisation du problème, proposition d’une équation de
récurrence, proposition d’un algorithme efficace de résolution du problème
(modélisation informatique des données, évaluation de la complexité) ; étude des
différentes optimisations possibles de l’algorithme ; programmation effective ; possibilité
d’implantation sur architectures spécifiques déduites de l’algorithme et des contraintes
de programmation.
OBJECTIFS
Décomposer le problème en des sous-problèmes plus petits ;
Calculer les solutions optimales de tous ces sous-problèmes et les garder en mémoire.
Calculer la solution optimale `a partir des solutions optimales des sous-problèmes
PRE-REQUIS
Avoir la notion sur l’algorithme de bellman-ford
Structure d’une solution optimale
Cas des graphes sans circuits
GENERALITE
HISTORIQUE
Pour la petite histoire, Bellman a choisi le terme programmation dynamique dans un souci de
communication : son supérieur ne supportait ni le mot « recherche » ni celui de « mathématique ».
Alors il lui a semblé que les termes « programmation » et « dynamique » donnaient une apparence
qui plairait à son supérieur. En réalité, le terme programmation signifiait à l’époque plus planification
et ordonnancement que la programmation au sens qu’on lui donne de nos jours. En un mot, la
programmation dynamique est un ensemble de règles que tout un chacun peut suivre pour résoudre
un problème donné.
TERMINOLOGIE
Paradigmes algorithmiques :
Programmation dynamique :
— Temps discret : A chaque étape, on prend une décision, selon ` l’information disponible.
— Temps continu : la suite de décisions est remplacée par un contrôle, fonction du temps
Stratégie :
La strategie est une règle de prise de décisions qui, pour chaque situation possible, nous dit quelle
décision (ou action) prendre dans le but d’optimiser une fonction objectif globale
Fonction globale :
Une seconde différence entre ces deux méthodes est, comme illustré par la figure ci-dessus, est que
la méthode diviser et régner est récursive, les calculs se font de haut en bas. Tandis que la
programmation dynamique est une méthode dont les calculs se font de bas en haut : on 2 commence
par résoudre les plus petits sous-problèmes. En combinant leur solution, on obtient les solutions des
sous-problèmes de plus en plus grands.
Illustration 1: On débute nos exemples par celui du calcul des nombres de Fibonacci. Le problème est
de calculer le n premiers nombres de Fibonacci donnés par la formule suivante :
La clef à une solution plus efficace est d’éviter la multiplicité de résolution du même sousproblème.
On améliore de loin la complexité temporelle si, une fois calculé, on sauvegarde un résultat, par
exemple dans une table. Et au besoin, on le prend de cette table. Cette remarque nous amène à la
solution suivante :
Cette approche de résolution est connue sous le nom de fonctions à mémoire, qui est très liée à la
programmation dynamique. On y reviendra un peu loin. En suupprimant la récursivité, nous écrivons
cet algorithme dans une forme typique de la programmation dynamique.
Illustration 2 : Avançons un peu plus dans ce concept en prenant un autre exemple qui est celui du
calcul du coefficient binomial.
Si on implante directement cette expression sous cette forme, on obtient la fonction suivante :
Données : Un entier t ∈ N
Objectif : Calculer le n-ième terme de la suite de Fibonacci
F(0) = F(1) = 1, F(n) = F(n − 1) + F(n − 2)).
On peut le calculer en utilisant la programmation dynamique :
fonction Fib-Dynamique (n)
1. F[0]=1; F[1]=1
2. Pour i allant de 3 à n, faire F[i]=F[i-1] + F[i-2];
3. Retourner F[n]
n 0 1 2 3 4 5 ...
F[n] 1 1 2 3 5 7 ...
Complexité : n additions
Formulation sous-forme de problème d’optimisation
Données :
P un ensemble fini de programmes : P = {P1, P2,...,Pn} v une évaluation des éléments de P :
v(Pi) = si Un entier D.
Solutions faisables :
Une solution faisable S est une partie de P telle que
v(S) =∑ v(e) ≤ D
e∈S Notons F l’ensemble des solutions faisables.
Principe et Notation
Ti : le tableau des sommes distinctes de tous les sous-ensembles de Pi = {s1, ..., si}.
Ti[j] = 1 si et seulement si il existe une solution faisable S telle que v(S) = j.
Données :
G = (V, E) : un graphe orienté ou chaque arc possède une longueur non-négative.
Objectif : Calculer la longueur plus court chemin entre toutes les paires de sommets.
L’algorithme de Floyd-Warshall construit une matrice Dn qui donne la longueur du plus court chemin
entre chaque paire de sommets.
1. On initialise D0 à L ;
2. Après litération k, Dk donne la longueur du plus court chemin lorsque l’on utilise que les
sommets dans {1,...,k} comme sommets intermédiaires (ou éventuellement aucun sommet
intermédiaire).
Récurrence
Dans une séquence optimale de décisions, ou de choix, chaque sous-séquence doit aussi
être optimale.
2, alors
(1,4) est le chemin le plus court entre 1 et 4 et (4,2) est le chemin le plus court entre 4
et 2.
Remarque : cela ne marche pas pour les chemins les plus longs.
Algorithme de Floyd-Warshall
Entrée : L, la matrice du graphe G ou` L [i, j] correspond à la longueur de l’arc (i, j).
Données :
P : un ensemble fini de programmes.; v
: une évaluation des éléments de P ; D :
un entier.
on a besoin de coder (n + 1) entiers.
En informatique, les données (les entiers) sont codées par des 0 et des 1.
Combien faut-il de « bits » pour coder un entier i ?
Par exemple :
I 2406 = 2 · 103 + 4 · 102 + 0 · 101 + 6 · 100 (en base 10)
I 1001 = 1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 (en base 2)
AVANTAGES
Facilité de mise en œuvre : La programmation dynamique utilise souvent des techniques de récursion
pour résoudre des problèmes. Ces techniques sont souvent plus faciles à mettre en œuvre que
d'autres méthodes de résolution.
Flexibilité : La programmation dynamique peut être utilisée pour résoudre une grande variété de
problèmes d'optimisation. Elle peut être adaptée à différentes applications, telles que l'optimisation
de la production, la gestion de stocks, la planification de projet, etc.
Utilisation efficace des ressources : En évitant de recalculer plusieurs fois les mêmes sous-problèmes,
la programmation dynamique utilise les ressources de manière plus efficace. Cela peut être
particulièrement important dans des applications où les ressources sont limitées, comme
l'optimisation des processus industriels ou la gestion des ressources financières
INCONVENIENTS
CONCLUSION