Vous êtes sur la page 1sur 14

EXPOSE DE RECHER

THEME : PROGRAMMATION DYNAMIQU

[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 :

● Algorithme glouton : construit une solution de manière incrémentale, en optimisant un


critère de manière locale

● Diviser pour régner : divise un problème en sous-problèmes indépendants (qui ne se


chevauchent pas), résout chaque sous-problème, et combine les solutions des sousproblèmes pour
former une solution du problème initial.

● Programmation dynamique : divise un problème en sousproblèmes qui sont non


indépendants (qui se chevauchent), et cherche (et stocke) des solutions de sous-problèmes de plus
en plus grands

Programmation dynamique :

Ensemble d’outils mathématiques et algorithmiques pour ´étudier les processus de décision


séquentiels et calculer ´éventuellement des stratégies optimales (exactes ou approximative)

Processus de décision séquentiel (PDS) :

— Suite de décisions à prendre, avec un objectif `à optimiser.

— Temps discret : A chaque étape, on prend une décision, selon ` l’information disponible.

— Liens (interactions) entre les décisions.

— En général, on peut recevoir de l’information additionnelle `à chaque étape, et il y a des aléas


dans l’´évolution entre les prises de décision.

— 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 :

Souvent, lorsqu’il y a de l’incertitude, la fonction objective est une espérance mathématique.


La programmation dynamique est similaire à la méthode diviser et régner en ce sens que, une
solution d’un problème dépend des solutions précédentes obtenues des sous-problèmes. La
différence significative entre ces deux méthodes est que la programmation dynamique permet aux
sous-problemes de se superposer. Autrement dit, un sous-problèmes peut être utilisé dans la
solution de deux sous-problèmes différents. Tandis que l’approche diviser et régner crée des sous-
problèmes qui sont complètement séparés et peuvent être résolus indépendamment l’un de l’autre.
Une illustration de cette différence est montrée par la Figure 5.1. Dans cette figure, le problème à
résoudre est à la racine, et les descendants sont les sous-problèmes, plus faciles à résoudre. Les
feuilles de ce graphe constituent des sous-problèmes dont la résolution est triviale. Dans la
programmation dynamique, ces feuilles constituent souvent les données de l’algorithme. La
différence fondamentale entre ces deux méthodes devient alors claire: les sous-problèmes dans la
programmation dynamique peuvent être en interaction, alors dans la méthode diviser et régner, ils
ne le sont pas.

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 :

L’algorithme implantant cette formule est alors comme suit :


Algorithme 1 int function Fibo(int n){
Nous avons vu que la complexité de cet algorithme est en exponentielle. La raison de cette
inefficacité est due à la multiplicité de calcul d’un même nombre, comme le montre la figure
cidessous sur n =4.

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 :

Voyons voir l’exécution de cette fonction sur un exemple de données: n = 5 et k = 2. Remarquez


Pour éviter de calculer plusieurs fois un nombre, l’idée est de créer un tableau où on calcule tous les
nombres de petites tailles, ensuite, de tailles de plus

 Version de la programmation dynamique

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.

I Pour le sous-problème P3 = {4,7,1},


q 0 1 2 3 4 5 6 7 8 9 10

Objectif : Trouver S ∈ F qui maximise la quantité v(S)


T3[q] 1 1 0 0 1 1 0 1 1 0 0
∅ {1} {4} {4,1} {7} {7,1}

Si le problème Pi a une solution faisable S alors le problème


Pi+1 a
I la solution faisable S
I et aussi la solution faisable S ∪ {si+1} si v(S) + v(si+1) ≤ D.

Plus court chemin dans un graphe

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.

Notation : On suppose que


V = {1,...,n}.
G est donné sous forme de matrice L [1...n,1...n] :
I s’il n’y a pas d’arc allant de i `a j, alors L[i,j] = ∞
I sinon L [i, j] correspond à la longueur de l’arc (i, j)
Principe

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).

Définition : Dk est la matrice D après litération k.

Récurrence

Dk [i, j] = min (Dk−1[i, j], Dk−1[i, k] + Dk−1[k, j])

Dans une séquence optimale de décisions, ou de choix, chaque sous-séquence doit aussi
être optimale.

En effet, si (1,4), (4,2) est le chemin le plus court entre 1 et

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).

Sortie : une matrice n × n


D0 ← L ;
Pour k allant de 1 à n faire
I Pour i allant de 1 à n faire
• Pour j allant de 1 à n faire
Dk[i,j] ← min(Dk−1[i,j],Dk−1[i,k] + Dk−1[k,j]) Retourner Dn.

Complexité : O(n3) opérations


Remarque : Codage des entiers

Pour coder les données des instances du problème du stockage,

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 ?

Codage des entiers

Un entier i s’´écrit en base b en utilisant des b chiffres allant de 0 `a b − 1 :


i s’écrit cn...c2c1c0 en base b ssi i = cnbn + ... + c2b2 + c1b1 + c0b0

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)

Un entier i entre 0 et bn − 1 peut être coder en n chiffres, ou en


I dlogb(i + 1)e chiffres
I dlog2(i + 1)e bits si b = 2

On peut le prouver par récurrence.


Le problème du stockage L’algorithme basé sur la programmation dynamique se réalise en

O (D · |P|) opérations, c’est-`a-dire en temps polynomial si l’entier en codé en unaire en


temps exponentiel si l’entier en codé en binaire

car O(D) = O(2log2D)

Remarque : l’algorithme s’exécute en temps polynomial si les entiers sont « petits ».

L’instance du problème est codée avec


O ((n + 1) D) bits si l’entier en codé en unaire,
O ((n + 1) log2D) bits si l’entier en codé en unaire,
AVANTAGES ET INCONVENIENTS

 AVANTAGES

Il y a plusieurs avantages à utiliser la programmation dynamique pour résoudre des problèmes :

Optimisation des performances : La programmation dynamique permet de résoudre des problèmes


d'optimisation complexes de manière plus efficace que d'autres méthodes de résolution. En stockant
les résultats de sous-problèmes dans une table, elle évite de recalculer plusieurs fois les mêmes sous-
problèmes, ce qui permet de gagner en efficacité.

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.

Garantie de trouver la solution optimale : Pour certains types de problèmes, la programmation


dynamique peut garantir de trouver la solution optimale. Cela peut être particulièrement important
dans des applications critiques, telles que la planification des opérations d'une entreprise ou la
conception de systèmes de sécurité.

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

Bien que la programmation dynamique présente de nombreux avantages, elle peut


également présenter quelques inconvénients :
Complexité de mise en œuvre : La mise en œuvre de la programmation dynamique peut être
complexe, en particulier pour des problèmes plus complexes. Il peut être difficile de
décomposer efficacement un problème en sous-problèmes et de définir les relations de
récurrence appropriées.

Besoin de trouver une structure optimale : Pour utiliser efficacement la programmation


dynamique, il est souvent nécessaire de trouver la structure optimale des sous-problèmes.
Cela peut nécessiter une analyse approfondie du problème et une compréhension claire de
sa nature.

Utilisation de l'espace mémoire : La programmation dynamique peut nécessiter l'utilisation


d'une table ou d'un tableau pour stocker les résultats des sous-problèmes. Cela peut
consommer beaucoup d'espace mémoire, en particulier pour des problèmes de grande
taille. Dans certains cas, cela peut limiter l'applicabilité de la programmation dynamique en
raison des contraintes de mémoire.

Sensibilité à la qualité de la fonction de récurrence : La qualité de la fonction de récurrence


utilisée dans la programmation dynamique peut avoir un impact significatif sur les
performances et la précision des résultats. Si la fonction de récurrence est mal définie ou
approximative, les résultats obtenus peuvent ne pas être optimaux.

Difficulté à identifier les problèmes adaptés : La programmation dynamique n'est pas


applicable à tous les types de problèmes. Il peut être difficile de déterminer si un problème
particulier peut être résolu efficacement à l'aide de la programmation dynamique ou s'il
nécessite une autre approche algorithmique.
Malgré ces inconvénients, la programmation dynamique reste une technique puissante pour
résoudre de nombreux problèmes d'optimisation, et avec une bonne compréhension du
problème, ces limitations peuvent être surmontées.

CONCLUSION

En conclusion, la programmation dynamique est une technique algorithmique puissante


utilisée pour résoudre des problèmes d'optimisation en les décomposant en sous-problèmes
plus petits. Elle offre plusieurs avantages, tels que l'optimisation des performances, la facilité
de mise en œuvre, la garantie de trouver la solution optimale, la flexibilité et l'utilisation
efficace des ressources.

Vous aimerez peut-être aussi