Telechargé par berdj ch

beosdp

publicité
Chapitre 1
Programmation dynamique
1.1. Introduction
La programmation dynamique est une méthode d’optimisation procédant par énumération implicite des solutions. Bien que déjà pratiquée auparavant, elle est élevée
au rang de méthode générale de résolution avec les travaux de Bellman [BEL 54,
BEL 57], qui formalise l’approche et la baptise. Cette approche permet de résoudre
efficacement des problèmes de décision séquentiels. Plus généralement, elle consiste
à aborder des problèmes d’optimisation avec une stratégie consistant en deux points
essentiels :
– décomposer le problème en une séquence de problèmes,
– établir une relation de récurrence entre les solutions optimales des problèmes.
L’intitulé “programmation dynamique” se justifie davantage par des considérations de
mode (le domaine s’est développé parallèlement à la programmation linéaire) que par
des arguments purement scientifiques. Dans [DRE 02] est reproduit l’extrait suivant
de l’autobiographie de Bellman [BEL 84] :
My first task was to find a name for multistage decision processes. In the first
place I was interested in planning, in decision making, in thinking. But planning
is not a good word for various reasons. I decided therefore to use the word
‘programming’. I wanted to get across the idea that this was dynamic, this was
multistage, this was time-varying–I thought, let’s kill two birds with one stone.
Let’s take a word that has an absolutely precise meaning, namely dynamic, in
the classical physical sense.
Chapitre rédigé par Bruno E SCOFFIER et Olivier S PANJAARD.
1
2
Optimisation Combinatoire
Autrement dit, le mot programmation doit ici s’entendre comme un plan d’action,
tandis que le mot dynamique indique le découpage en phases du problème. Précisons d’emblée que le paradigme de la programmation dynamique est mal défini, et
que plusieurs formalismes coexistent dans l’abondante littérature qui lui est consacrée [BEL 57, MIT 64, KAR 67, MIT 74, LAU 79, MOR 82]. Nous avons adopté ici
un formalisme intermédiaire qui a ses avantages et ses inconvénients, et peut donc
certainement être discuté. Dans le contexte de ce livre, nous nous sommes surtout
préoccupés de ses vertus structurantes. Après avoir introduit intuitivement l’idée de
la programmation dynamique sur un exemple simple et ludique (section 1.2), nous
présentons un cadre formel assez général (section 1.3) reposant sur les concepts d’espace d’états, de structure de transition (entre les états) et de structure de préférences
(entre les politiques). Nous montrons alors comment divers problèmes combinatoires
peuvent entrer dans ce cadre (section 1.4), et présentons deux procédures de résolution
(avant et arrière) dont nous établissons l’admissibilité (section 1.5). Dans la section
1.6, nous résolvons par programmation dynamique les problèmes introduits dans la
section 1.4. Enfin, dans une dernière partie (section 1.7), nous présentons quelques
extensions.
1.2. Un premier exemple
E XEMPLE.– LE FRANCHISSEMENT DU PONT. On considère quatre individus a, b, c, d
qui rentrent de randonnée à la nuit tombée. Ils rencontrent un pont suspendu enjambant une rivière. Un panneau indique qu’au maximum deux personnes simultanément
peuvent emprunter le pont pour des raisons de sécurité. Les quatre compagnons décident de franchir le pont deux par deux. Cependant, le groupe ne disposant que d’une
seule lampe de poche, une personne se trouvant après le pont doit retourner au point
de départ pour rapporter la lampe après chaque franchissement. Précisons enfin que
l’individu a met 1 minute pour traverser, b met 2 minutes, c met 5 minutes et d met
10 minutes. Si deux membres du groupe traversent le pont ensemble, ils marchent à la
vitesse du membre le plus lent (par exemple, a et c mettent 5 minutes pour traverser
ensemble). Dans quel ordre le groupe doit-il traverser pour minimiser le temps total
de franchissement ?
Ce problème se résout bien par une démarche de programmation dynamique. Tout
d’abord, on se convaincra sans peine qu’il est nécessaire d’effectuer cinq traversées
(allers ou retours) pour que tout le monde ait franchi le pont. Remarquons ensuite
qu’à l’issue d’une traversée, on peut résumer la situation (ce qu’on appelle l’état) par
la liste des personnes qui se situent avant le pont. Il s’agit donc ici de trouver un ordre
de passage optimal (ce qu’on appelle une politique) pour passer de l’état (a, b, c, d) à
l’état ().
A l’issue de la première traversée, deux personnes restent avant le pont : soit (a, b)
au bout de 10 minutes (temps de passage de c et d), soit (a, c) au bout de 10 minutes,
Programmation dynamique
3
soit (a, d) au bout de 5 minutes, soit (b, c) au bout de 10 minutes, soit (b, d) au bout
de 5 minutes, soit (c, d) au bout de 2 minutes. Après le retour d’un personne, quatre
états seulement peuvent se présenter :
- (a, b, c) sont avant le pont,
- (a, b, d) sont avant le pont,
- (a, c, d) sont avant le pont,
- (b, c, d) sont avant le pont.
L’état (a, b, d) survient dans trois cas :
cas 1. (b, d) sont restés en arrière (5 minutes) et a est revenu (1 minute),
cas 2. (a, d) sont restés en arrière (5 minutes) et b est revenu (2 minutes),
cas 3. (a, b) sont restés en arrière (10 minutes) et d est revenu (10 minutes).
Dans le premier cas, il a donc fallu 5+1=6 minutes pour arriver à l’état (a, b, d). Dans
le second cas il a fallu 5+2=7 minutes et dans le dernier cas il a fallu 10+10=20 minutes. Or, quoi qu’il advienne ensuite, les décisions prises pour arriver à l’état (a, b, d)
n’auront pas d’influence sur le temps qu’il faudra pour passer de l’état (a, b, d) à l’état
(), où tous les individus ont franchi le pont. Par conséquent, les cas 2 et 3 peuvent être
ignorés dans la suite de la recherche.
De même, on montre facilement qu’il faut au mieux 11 minutes pour arriver à l’état
(a, b, c), 3 minutes pour arriver à l’état (a, c, d) et 4 minutes pour arriver à l’état
(b, c, d). Au bilan, voici les informations pertinentes à retenir à l’issue des deux premières traversée (deux personnes franchissent le pont à l’aller et une personne revient
au retour) :
- il faut au mieux 11 minutes pour atteindre l’état (a, b, c),
- il faut au mieux 6 minutes pour atteindre l’état (a, b, d),
- il faut au mieux 3 minutes pour atteindre l’état (a, c, d),
- il faut au mieux 4 minutes pour atteindre l’état (b, c, d).
A l’issue de la troisième traversée, il reste (a), (b), (c) ou (d) avant le pont. L’état (a)
survient dans trois cas :
cas 1. on était dans l’état (a, b, c) (11 minutes) et (b, c) ont traversé (5 minutes),
cas 2. on était dans l’état (a, b, d) (6 minutes) et (b, d) ont traversé (10 minutes),
cas 3. on était dans l’état (a, c, d) (3 minutes) et (c, d) ont traversé (10 minutes),
Il faut donc au mieux 10+3=13 minutes pour atteindre l’état (a) à l’issue de la troisième traversée. En répétant le même raisonnement, on trouve :
- il faut au mieux 13 minutes pour atteindre l’état (a),
- il faut au mieux 14 minutes pour atteindre l’état (b),
- il faut au mieux 13 minutes pour atteindre l’état (c),
- il faut au mieux 8 minutes pour atteindre l’état (d).
Une personne revient à nouveau, et il reste alors (a, b), (a, c), (a, d), (b, c), (b, d) ou
(c, d) avant le pont. L’état (a, b) survient dans deux cas :
cas 1. (a) est resté en arrière (13 minutes) et b est revenu (2 minutes),
cas 2. (b) est resté en arrière (14 minutes) et a est revenu (1 minute).
4
Optimisation Combinatoire
Il faut donc au mieux 13 + 2 = 14 + 1 = 15 minutes pour atteindre l’état (a, b) à
l’issue de la quatrième traversée. De même, on montre que :
- il faut au mieux 15 minutes pour atteindre l’état (a, b),
- il faut au mieux 14 minutes pour atteindre l’état (a, c),
- il faut au mieux 9 minutes pour atteindre l’état (a, d),
- il faut au mieux 15 minutes pour atteindre l’état (b, c),
- il faut au mieux 10 minutes pour atteindre l’état (b, d),
- il faut au mieux 13 minutes pour atteindre l’état (c, d),
Les deux personnes restantes traversent le pont pour la dernière fois et le franchissement est terminé. Par exemple, si au bout de 4 traversées, on est dans l’état (a, b), il
aura fallu 15 + 2 = 17 minutes en tout pour atteindre l’état (). On vérifie facilement
qu’on ne peut pas faire mieux. On montre ainsi qu’il faut au mieux 17 minutes pour le
franchissement du pont.
Cette démarche de résolution est résumée dans le tableau 1.1. Chaque colonne correspond à un aller ou un retour, et il y figure tous les états possibles à l’issue de cette
traversée. De plus, le meilleur temps pour atteindre un état donné figure en gras. Par
exemple, la ligne a : 10 + 1 = 11 en haut de la colonne 2 signifie que a est revenu lors
de la deuxième traversée et qu’à l’issue de cette traversée 11 minutes se sont écoulées.
On ne peut pas faire mieux pour atteindre l’état (a, b, c). On peut reconstituer une politique optimale en remontant le temps à partir de la durée optimale de 17 minutes :
- a, b passent le pont lors de la cinquième traversée et donc on était dans l’état (a, b) à
l’issue de la quatrième traversée,
- a revient lors de la quatrième traversée et donc on était dans l’état (b) à l’issue de la
troisième traversée,
- c, d passent le pont lors de la troisième traversée et donc on était dans l’état (b, c, d)
à l’issue de la deuxième traversée,
- b revient lors de la deuxième traversée et donc on était dans l’état (c, d) à l’issue de
la première traversée,
- a, b passent le pont lors de la première traversée.
La démarche de résolution par programmation dynamique demande 42 additions et
27 comparaisons pour trouver une politique optimale. Or, il y a 6 × 2 × 3 × 3 = 108
politiques possibles et une démarche par énumération exhaustive demanderait donc
4 × 108 = 432 additions et 107 comparaisons. Ainsi, on constate un gain substantiel
d’efficacité en résolvant le problème par programmation dynamique. Dans la section
suivante, nous décrivons un formalisme général permettant d’appliquer cette méthode,
et nous donnons des conditions garantissant son exactitude. De nombreux problèmes
combinatoires peuvent être résolus par cette méthode, en les décomposant en une séquence de problèmes de même nature.
Programmation dynamique
1 (aller)
(a, b)
c, d : 10
(a, c)
b, d : 10
(a, d)
b, c : 5
(b, c)
a, d : 10
(b, d)
a, c : 5
(c, d)
a, b : 2
4 (retour)
(a, b)
a : 14+1=15
b : 13+2=15
(a, c)
a : 13+1=14
c : 13+5=18
(a, d)
a : 8+1=9
d : 13+10=23
(b, c)
b : 13+2=15
c : 14+5=19
(b, d)
b : 8+2=10
d : 14+10=24
(c, d)
c : 8+5=13
d : 13+10=23
2 (retour)
(a, b, c) a : 10+1=11
b : 10+2=12
c : 10+5=15
(a, b, d) a : 5+1=6
b : 5+2=7
d : 10+10=20
(a, c, d) a : 2+1=3
c : 5+5=10
d : 10+10=20
(b, c, d) b : 2+2=4
c : 5+5=10
d : 10+10=20
5 (aller)
()
a, b : 15+2=17
5
3 (aller)
(a)
b, c : 11+5=16
b, d : 6+10=16
c, d : 3+10=13
(b)
a, c : 11+5=16
a, d : 6+10=16
c, d : 4+10=14
(c)
a, b : 11+2=13
a, d : 3+10=13
b, d : 4+10=14
(d)
a, b : 6+2=8
a, c : 3+5=8
b, c : 4+5=9
a, c : 14+5=19
a, d : 9+10=19
b, c : 15+5=20
b, d : 10+10=20
c, d : 13+10=23
Tableau 1.1. Résolution du problème de franchissement du pont.
1.3. Formalisation
1.3.1. Espace d’états, ensemble des décisions, fonction de transition
Soit un entier n ∈ N. Nous supposons que le problème que l’on veut résoudre peut
être découpé en n + 1 périodes 0,...,n. Nous considérons pour chaque période i, un
ensemble Si représentant l’ensemble des états à la fin de la période i. Nous supposons
de plus que :
– Si ∩ Sj = ∅ (si i 6= j), ce qui n’est pas une hypothèse restrictive (si tel n’est pas
le cas, on peut toujours redéfinir les états en ajoutant l’indice de la période correspondante).
– Il y a un unique état initial s0 et un unique état final sn . Là encore, cette hypothèse n’est pas restrictive puisque si tel n’est pas le cas, on peut toujours rajouter un
6
Optimisation Combinatoire
état initial et/ou final artificiel (en augmentant le nombre de périodes).
Enfin, nous noterons S =
Sn
i=0
Si l’ensemble des états.
Par exemple, dans le problème de franchissement du pont, rappelons qu’une période correspond à une traversée, et qu’un état correspond à la liste des personnes se
situant avant le pont (l’état initial étant (a, b, c, d) et l’état final ()).
Le but du problème est de “prendre les bonnes décisions”, c’est-à-dire de prendre à
chaque période une décision de telle sorte qu’à la fin du processus ces décisions soient
optimales au sens d’un certain critère. Soit un ensemble X représentant l’ensemble des
décisions possibles. Toutes les décisions ne peuvent pas être prises dans tous les états :
plus précisément, à chaque état correspond un ensemble (inclus dans X) représentant
les décisions possibles dans cet état. Considérons ainsi un ensemble A ⊂ S × X :
(s, x) ∈ A signifie que la décision x peut être prise dans l’état s.
Enfin, une décision prise à la période i fait passer d’un état à un autre. Nous considérons une fonction de transition t : A → S où t(s, x) indique l’état dans lequel on se
trouve après avoir pris la décision x dans l’état s. Pour une raison de cohérence, nous
devons de plus rajouter l’hypothèse naturelle suivante :
s ∈ Si
(s, x) ∈ A
=⇒ t(s, x) ∈ Si+1
Cette hypothèse signifie simplement qu’une décision fait passer d’un état de la fin de
la période i à un état de la fin de la période i + 1.
Dans l’exemple de la section 1.2, si l’on se trouve dans l’état (a, b, c) à l’issue de
la deuxième traversée, il y a trois décisions possibles : soit b et c traversent et l’on se
trouve dans l’état (a), soit a et c traversent et l’on se trouve dans l’état (b), soit b et c
traversent et l’on se trouve dans l’état (c).
Remarquons qu’une représentation commode de l’ensemble des états et des transitions peut se faire à l’aide du graphe d’états défini comme suit :
– l’ensemble des sommets est S,
– l’ensemble des successeurs d’un sommet s est Γ+ (s) = {t(s, x) : (s, x) ∈ A}.
Le graphe d’états pour le problème de franchissement du pont est représenté sur la
figure 1.1.
Programmation dynamique
(a, b)
(a, b, c)
(a)
(a, c)
(a, d)
7
(a, b)
(a, c)
(a, b, d)
(b)
(a, d)
(a, b, c, d)
()
(b, c)
(a, c, d)
(c)
(b, d)
(c, d)
(b, c)
(b, d)
(b, c, d)
(d)
(c, d)
Figure 1.1. Graphe d’états pour le problème de franchissement du pont
1.3.2. Politiques réalisables, relation de comparaison et objectif
Dans cette section, nous introduisons la notion de politique réalisable, et celle de
valeur d’une politique qui nous permet de définir un critère de choix.
D ÉFINITION.– On appelle politique toute séquence de décisions.
Soit si ∈ Si et sj ∈ Sj (où j > i). Une politique réalisable de si à sj est une séquence
(xi+1 , xi+2 , · · · , xj ) ∈ X j−i de (j − i) décisions telles que partant de l’état si , ces
décisions nous conduisent à l’état sj . Autrement dit, cette séquence est telle que, pour
k ∈ {i, i + 1, · · · , j − 1} :
(sk , xk+1 ) ∈ A, et sk+1 = t(sk , xk+1 )
Un politique sera dite réalisable de la fin de la période i à la fin de la période j ssi il
existe si ∈ Si et sj ∈ Sj telle que cette politique soit réalisable de si à sj .
Nous noterons ∆(si , sj ) l’ensemble des politiques réalisables de l’état si à l’état
sj , ∆i,j les politiques réalisables de la période i à la période j, et ∆ l’ensemble de
toutes les politiques réalisables. Nous supposerons que ∆(s0 , sn ) 6= ∅, c’est-à-dire
8
Optimisation Combinatoire
qu’il existe toujours une politique réalisable de s0 à sn .
Puisque la méthode de résolution se base sur une comparaison des solutions apparaissant dans notre cadre comme les politiques réalisables de s0 à sn , nous supposons
donnée une valuation des politiques réalisables, c’est-à-dire une fonction v : ∆ → Z
où Z est un espace de valuations muni d’un ordre ≤ que nous supposerons complet
(voir section 1.7.1 pour le cas d’un ordre partiel). Rappelons qu’un ordre complet ≤
sur l’ensemble Z est une relation :
- transitive, i.e. pour tout (z1 , z2 , z3 ) ∈ Z 3 , si z1 ≤ z2 et z2 ≤ z3 , alors z1 ≤ z3 ;
- antisymétrique, i.e. pour tout (z1 , z2 ) ∈ Z 2 , si z1 ≤ z2 et z2 ≤ z1 , alors z1 = z2 ;
- complète, i.e. pour tout (z1 , z2 ) ∈ Z 2 , z1 ≤ z2 ou z2 ≤ z1 .
Nous disposons donc maintenant d’une relation permettant de comparer les politiques
réalisables.
Le but du problème peut maintenant se formuler aisément. Il s’agit de déterminer
une politique optimale δ ∗ ∈ ∆(s0 , sn ), c’est-à-dire une politique telle que :
∀δ ∈ ∆(s0 , sn ), v(δ ∗ ) ≤ v(δ)
Sur le graphe d’états de la figure 1.1, un chemin constitué d’arcs en gras constitue
une politique optimale entre ses deux extrémités.
R EMARQUE.– Symétriquement, dans le cas où les valuations représentent des profits,
et où l’on s’inscrit donc dans une optique de maximisation, il s’agit bien évidemment
de déterminer une politique δ ∗ ∈ ∆(s0 , sn ) telle que :
∀δ ∈ ∆(s0 , sn ), v(δ ∗ ) ≥ v(δ)
Sans perte de généralité, nous supposons néanmoins dans la suite que l’on recherche
une politique de valuation minimale.
L’exactitude de la méthode de résolution (que nous verrons à la section 1.5) repose
sur une propriété assez naturelle de cette relation de comparaison entre politiques
réalisables, propriété qu’on appelle monotonie.
D ÉFINITION.– La fonction de valuation v est dite :
– monotone à droite ssi pour tout si ∈ Si , tout sj ∈ Sj , tout (δ, δ ′ ) ∈ ∆(si , sj )2
et pour tout x ∈ X tel que (sj , x) ∈ A :
v(δ) ≤ v(δ ′ ) =⇒ v(δ, x) ≤ v(δ ′ , x)
– monotone à gauche ssi pour tout si ∈ Si , tout sj ∈ Sj , tout (δ, δ ′ ) ∈ ∆(si , sj )2
et pour tout x ∈ X tel qu’il existe si−1 avec (si−1 , x) ∈ A et t(si−1 , x) = si :
v(δ) ≤ v(δ ′ ) =⇒ v(x, δ) ≤ v(x, δ ′ )
Programmation dynamique
9
– monotone ssi elle est monotone à droite et à gauche.
L’hypothèse de monotonie traduit donc l’idée selon laquelle l’ordre des politiques
n’est pas modifié si l’on prolonge ces politiques de façon identique.
1.4. Quelques autres exemples
Nous avons vu comment l’exemple introductif rentrait bien dans ce cadre formel. Néanmoins, la programmation dynamique est une méthode s’appliquant à un
ensemble assez vaste de problèmes (e.g., [BEL 54, DRE 77]). Nous allons donner ici
quelques exemples classiques permettant de donner une première idée de la diversité
des applications possibles.
Dans cette partie, nous donnons simplement l’énoncé de divers problèmes et leurs modélisations dans le cadre précédemment exposé. Dans la section 1.6, nous proposerons
une résolution de ces exemples par la programmation dynamique.
1.4.1. Gestion de stocks
Ce premier exemple est l’un des plus classiques se résolvant par programmation
dynamique. Ceci tient en partie au fait que son expression dans le formalisme de la
programmation dynamique est immédiate et très naturelle.
Considérons donc une entreprise produisant (et vendant) une certaine marchandise M .
Cette production nécessite une pièce particulière P que l’entreprise achète chez un
fournisseur. L’entreprise possède un entrepôt où elle peut stocker jusqu’à 5 pièces P .
Elle achète chaque début de mois une certaine quantité de pièces P pour lui permettre
de satisfaire les demandes du mois. Les prix d’achat des pièces P fluctuent de mois
en mois mais sont supposés connus à l’avance. De plus, l’entreprise dispose de la
demande de produit M pour chacune des périodes que l’on considère. Ces données
(prix d’achat de P et demandes de M à satisfaire) sont présentés dans le tableau 1.2.
Prix d’achat unitaire pi
Demande di
mois 1 mois 2 mois 3 mois 4 mois 5
3
2
2
4
3
1
4
2
3
1
Tableau 1.2. Demandes et prix d’achat
Sachant qu’une pièce P est nécessaire à la production d’un objet M , le but du
problème est de déterminer une stratégie d’achat optimale pour l’entreprise : plus
précisément, il s’agit de décider la quantité de P à acheter au début de chaque mois de
10
Optimisation Combinatoire
manière à satisfaire la demande et en minimisant le coût total. On supposera de plus
que le stock initial est nul et que l’on veut un stock final nul.
Exprimons ce problème dans le formalisme introduit à la section 1.3.
Périodes : le découpage en périodes va de soi. Le ième mois correspond à la période
i, et l’on rajoute la période initiale 0.
Espace d’états : les états de la période i correspondent aux stocks en fin de période.
Il y a ainsi un état s0 ∈ S0 correspondant à un stock nul, 6 états dans chacune des
périodes 1 à 4 correspondant à un stock entre 0 et 5, et un état à la période 5 correspondant à un stock final nul.
Ensemble de décisions : les décisions à prendre sont les quantités de pièces P à acheter en début de période. Si l’on possède un stock ki−1 en fin de période i − 1, on peut
alors acheter au plus li = 5−ki−1 pièces pour ne pas dépasser la capacité de stockage.
De plus, il faut au moins di pièces de manière à satisfaire la demande. Cela nous indique donc les décisions possibles dans chaque état, c’est-à-dire l’ensemble A : étant
donné un stock ki−1 à la période i−1, (ki−1 , li ) ∈ A ⇔ ki−1 +li ∈ {di , di+1 , · · · , 5}.
Fonction de transition : elle correspond au calcul du stock ki à la fin de la période i en
fonction de celui ki−1 à la fin de la période i − 1 et de la quantité li achetée au début
de la période i, c’est-à-dire ki = ki−1 + li − di .
Valuation des politiques : la valuation est elle aussi très naturelle. Le but est de minimiser la somme des coûts d’achat de matière première. Considérons alors une politique
réalisable où l’on achète li pièces P à la période i, li+1 à la période i + 1, . . . , lj à
la période j. Nous définissons P
la valeur de cette politique comme le coût engendré
j
par ces achats : v(li , · · · , lj ) = m=i pm lm . Cette valuation (à valeurs réelles) est de
manière évidente monotone.
R EMARQUE.– Nous verrons dans la section 1.7.2 que l’on peut également envisager
le cas où la demande est aléatoire et où l’on cherche à minimiser l’espérance du coût.
1.4.2. Plus court chemin bottleneck dans un graphe
Ce problème très classique en théorie des graphes se modélise (et peut donc se
résoudre) comme un problème de programmation dynamique. Considérons le graphe
de la figure 1.2.
Notre objectif est de trouver un chemin optimal entre les sommets v0 et v5 , en prenant comme valeur d’un chemin la plus grande des valuations des arêtes qui le constituent (problème de type bottleneck). Ce type de problèmes se rencontre par exemple
dans le choix d’un itinéraire pour un convoi transportant des produits à risque. Les
arcs du graphe correspondent à un niveau de risque qualitatif. Il s’agit alors de trouver
l’itinéraire minimisant le risque maximal le long du parcours. Nous noterons Γ+ (vi )
l’ensemble des successeurs de vi , c’est-à-dire les sommets vj pour lesquels il existe un
Programmation dynamique
11
v1
3
1
v3
4
4
1
4
v0
1
4
2
5
v5
2
v2
3
v4
Figure 1.2. Instance de plus court chemin bottleneck.
arc (vi , vj ), et nous noterons d(vi , vj ) la longueur de l’arc (vi , vj ) (avec, par convention, d(vi , vi ) = −∞).
On peut facilement montrer, sans faire d’hypothèse supplémentaire sur les longueurs des arcs, qu’il existe un plus court chemin bottleneck empruntant au plus 5
arcs (de manière plus générale n − 1 où n est le nombre de sommets du graphe,
puisque toute boucle ne peut diminuer strictement la valeur d’un chemin). C’est cette
propriété qui va nous indiquer une modélisation possible dans le cadre de la programmation dynamique : nous allons calculer pour chaque k entre 1 et 5 la valeur d’un
plus court chemin comportant au plus k arcs allant du sommet v0 à chacun des autres
sommets. La valeur optimale d’un chemin comportant au plus 5 arcs entre v0 et v5 est
celle recherchée. Plus précisément, cela conduit à la modélisation suivante :
Périodes : elles vont de 0 à 5 et correspondent au nombre maximum d’arcs dans les
chemins considérés.
Espace d’états : un état (vj , i) ∈ Si correspond aux chemins allant de v0 à vj empruntant au plus i arcs. Pour la période 0 il n’y a qu’un seul état (v0 , 0) correspondant
au sommet v0 (seul état atteignable avec 0 arc). Il y a également un seul état (v5 , 5)
à la période 5 correspondant au sommet final. Pour les autres périodes i, il y a 6 états
(vj , i), j = 0, . . . , 5.
Ensemble de décisions : une décision consistant ici à rester sur place ou à se déplacer vers un successeur, l’ensemble des décisions possibles dans l’état (vj , i) est
donc Γ+ (vj ) ∪ {vj }, pour i = 0, . . . , 4 (où vk désigne la décision de se déplacer
vers vk ). Pour la période 5, seule la décision v5 est susceptible d’être admissible car
S5 = (v5 , 5).
12
Optimisation Combinatoire
Fonction de transition : elle découle de la définition de nos décisions : t((vj , i), vk ) =
(vk , i + 1).
Valuation des politiques : lorsque l’on est dans l’état (vj , i), la valuation doit correspondre au chemin optimal empruntant au plus i arcs entre v0 et vj . On peut donc
définir la valeur de la politique (vki , vki+1 , . . . , vkj ) comme la valeur du chemin emprunté :
v((vki , vki+1 , . . . , vkj )) = max{d(vkl , vkl+1 ) : l = i, . . . , j − 1}
La fonction de valuation est ici encore monotone. Pour la monotonie à droite par
exemple, il suffit de remarquer que étant donnés un chemin δ arrivant à l’état (vk , j)
et une décision vl réalisable à l’état (vk , j), v(δ, vl ) = max(v(δ), d(vk , vl )). L’ajout
de la décision vl ne modifie donc pas l’ordre des préférences.
R EMARQUE.– nous avons considéré ici que la valeur d’un chemin était la valuation
maximale de ces arêtes. On peut tout à fait adapter la modélisation à d’autres problèmes de cheminement. Il suffit pour cela de changer la valuation des politiques. Si,
par exemple, on considère que la valeur d’un chemin est la somme
valuations des
Pdes
j−1
arcs le constituant, on peut alors définir v((vki , vki+1 ..., vkj )) = l=i d(vkl , vkl+1 ) ;
la valuation est également monotone.
1.4.3. Problème du sac à dos
Considérons un ensemble d’objets {1, . . . , n}. A chaque objet est associé un profit
pi ainsi qu’une masse mi . Nous disposons de plus d’un sac à dos dont la masse totale
ne doit pas dépasser b. Le but du problème est de déterminer quels objets prendre
dans le sac à dos de manière à maximiser le profit (tout en respectant la contrainte
de masse maximale). Il s’agit autrement dit de résoudre le programme linéaire en
variables bivalentes suivant :

Pn
 max zP= i=1 pi xi
n
i=1 mi xi ≤ b
 s.c.
xi ∈ {0, 1}, i = 1, . . . , n
Pour modéliser ce problème dans le cadre de la programmation dynamique, nous allons résoudre la famille de problèmes suivante : pour chaque i ∈ {1, . . . , n} et pour
chaque j ∈ {0, . . . , b}, comment choisir des objets parmi les i premiers de manière
à ce que leur masse totale soit au plus j et le profit associé maximal. La solution du
problème initial sera donc la politique obtenue pour le problème où i = n et j = b.
Considérons l’instance suivante : nous avons 5 objets de masses respectives 6, 5,
3, 2 et 1, les profits associés étant respectivement 20, 19, 9, 5 et 2, et un sac à dos dont
Programmation dynamique
13
la masse ne doit pas dépasser 9.
Périodes : elles vont de 0 à 5 et correspondant au sous-ensemble des objets considérés.
Espace d’états : un état (i, j) ∈ Si (avec i ∈ {1, . . . , 5}) correspond aux sousensembles de {1, . . . , i} de masse inférieure ou égale à j. Pour les périodes i entre
1 et 4, il y a 10 états (i, j), j ∈ {0, . . . , 9}. Pour la période 0, il n’y a qu’un seul état
(0, 0) ; pour la période 5, nous considérons l’état (5, 9).
Ensemble de décisions : une décision à la période i ∈ {1, . . . , 4} consiste ici à insérer
ou non l’objet i dans le sac à dos. Il y a donc 2 décisions possibles dans chaque état,
décisions que nous noterons 0 (ne pas prendre l’objet) et 1 (prendre l’objet). A la dernière période toutefois, étant donné que l’on veut aboutir à l’état (5, 9), il n’y a que
deux états où l’on peut prendre une décision : l’état (4, 9) où l’on prend la décision 0
de ne pas mettre l’objet, et l’état (4, 8) où l’on prend la décision 1 de mettre l’objet
dans le sac.
Fonction de transition : elle exprime l’influence de la décision sur la masse du sac.
Ainsi, si l’on est dans l’état (i, j), et si l’on prend l’objet i + 1 (décision 1), cette décision envoie dans l’état (i + 1, j + mi+1 ) ; en revanche, la décision 0, qui ne modifie
pas le poids du sac, envoie dans l’état (i + 1, j).
Valuation des politiques : elle indique simplement le profit associé aux éléments mis
dans le sac à dos :
X
pk
v(xi , . . . , xj ) =
{k:xk =1}
La fonction de valuation est de toute évidence monotone.
1.5. Résolution
Après avoir vu le cadre formel et quelques exemples de problèmes s’inscrivant
dans celui-ci, nous pouvons maintenant aborder la résolution effective, c’est-à-dire la
méthode de la programmation dynamique. Comme nous l’avons vu dans l’introduction et les exemples suivants, l’idée de la méthode est de résoudre non plus un mais
toute une famille de problèmes en établissant des relations de récurrence entre les
solutions optimales de ces problèmes. Cela va permettre de n’énumérer qu’un sousensemble (relativement restreint) de solutions et de gagner ainsi sensiblement en efficacité par rapport à la méthode brutale consistant à énumérer toutes les solutions.
Plus précisément, les problèmes que nous considérons sont découpés en n + 1 périodes, pour lesquelles nous disposons d’un ensemble d’états possibles. Le point central de cette méthode va être de calculer, de manière récursive, la meilleure politique
(ou du moins l’une des meilleures) pour arriver à chacun des états de chaque période
i. L’hypothèse de monotonie nous permettra de calculer aisément ces politiques et de
parvenir ainsi à la résolution du problème. C’est la méthode dite de procédure avant,
14
Optimisation Combinatoire
que nous exposons et démontrons dans la section 1.5.1.
Nous allons ensuite exposer la deuxième méthode de la programmation dynamique,
dite procédure arrière, qui consiste à partir cette fois non plus de l’état initial mais de
l’état final. Nous illustrerons cette méthode sur l’exemple de la section 1.2.
Dans un dernier temps, nous préciserons les liens entre l’hypothèse de monotonie, sur
laquelle nous basons la méthode de résolution, et le principe d’optimalité énoncé par
Bellman, que l’on considère souvent comme sous-tendant la méthode de la programmation dynamique.
1.5.1. Procédure avant
Considérons un problème dont la fonction de valuation est monotone à droite. La
procédure en avant peut alors s’exprimer comme suit :
1 Définir S0′ = {s0 } et δ ∗ (s0 ) = () (la politique vide) ;
2 Pour i allant de 1 à n :
′
2a
Déterminer Si′ = {t(si−1 , x) : si−1 ∈ Si−1
et (si−1 , x) ∈ A}
2b
Pour tout si ∈ Si′ , déterminer :
δ ∗ (si ) ∈ arg min{v(δ ∗ (si−1 ), x) : (si−1 , x) ∈ A et t(si−1 , x) = si }
3 Renvoyer δ ∗ (sn )
Si′ désigne l’ensemble des états que l’on peut atteindre en partant de l’état initial
s0 (c’est donc l’ensemble des états si ∈ Si tels que ∆(s0 , si ) 6= ∅). Pour chacun de
ces états, nous calculons δ ∗ (si ) qui représente une politique optimale pour passer de
l’état initial à si .
T HÉORÈME.– Si la fonction de valuation est monotone à droite, alors δ ∗ (sn ) est une
politique optimale pour passer de l’état initial à l’état final.
P REUVE.– Nous allons montrer par récurrence sur i que pour tout état si ∈ Si′ , δ ∗ (si )
est une politique optimale pour passer de s0 à si , c’est-à-dire que :
∀δ ∈ ∆(s0 , si ), v(δ ∗ (si )) ≤ v(δ)
C’est évident pour i = 0. Supposons que cela est vrai pour tous les états apparte′
nant à Si−1
. Soit δ = (x1 , x2 , . . . , xi ) ∈ ∆(s0 , si ).
Appelons si−1 l’état obtenu en appliquant la politique (x1 , x2 , . . . , xi−1 ) à partir de
Programmation dynamique
15
s0 . Alors par hypothèse de récurrence, v(δ ∗ (si−1 )) ≤ v((x1 , . . . , xi−1 )). Ainsi, par
monotonie à droite :
v(δ ∗ (si−1 ), xi ) ≤ v(δ)
(1)
De plus, par définition de δ ∗ (si ) :
v(δ ∗ (si )) ≤ v(δ ∗ (si−1 ), xi ) (2)
On déduit des inégalités (2) et (1) que v(δ ∗ (si )) ≤ v(δ).
Nous pouvons alors immédiatement conclure que δ ∗ (sn ) est une politique optimale
pour passer de l’état initial à l’état final.
1.5.2. Procédure arrière
Reprenons l’exemple de franchissement du pont. Il est possible d’appliquer “à
rebours” la démarche précédemment mise en œuvre. En effet, considérons l’état final
() où tout le monde a traversé le pont. A la fin de la période précédente, on peut
facilement induire qu’il y a 6 états possibles : (a, b), (a, c), (a, d), (b, c), (b, d) et
(c, d). En venant de l’état (a, b), il a fallu 2 minutes pour atteindre l’état (). De même,
en venant des états (a, c), (a, d), (b, c), (b, d) ou (c, d), il a fallu respectivement 5, 10,
5, 10 ou 10 minutes pour atteindre l’état ().
De manière analogue, quatre états sont possibles à la fin de la période précédente : (a),
(b), (c) et (d). Prenons l’exemple de l’état (a). Partant de cet état, on peut rejoindre
l’état (a, b) en 2 minutes, l’état (a, c) en 5 minutes ou l’état (a, d) en 10 minutes. Il
faut donc, pour aller de (a) à (), au mieux min{2 + 2, 5 + 5, 10 + 10} minutes. Ainsi,
une politique optimale pour aller de (a) à () consiste à faire revenir b lors de la période
4.
En calculant ainsi, pour chaque état, une politique optimale pour aller de cet état à
l’état final, nous aboutissons à une politique optimale de l’état initial à l’état final.
Plus généralement, nous présentons maintenant la méthode de résolution appelée
procédure arrière. Elle consiste à faire un raisonnement analogue que pour la procédure avant mais en partant de l’état final. Nous aurons besoin maintenant de la monotonie à gauche de la fonction de valuation.
1 Définir Sn′′ = {sn } et δ ∗ (sn ) = () (la politique vide) ;
2 Pour i allant de n − 1 à 0 :
′′
}
2a
Déterminer Si′′ = {si : ∃x ∈ X, (si , x) ∈ A et t(si , x) ∈ Si+1
2b
Pour tout si ∈ Si′′ , déterminer :
δ ∗ (si ) ∈ arg min{v(x, δ ∗ (si+1 )) : (si , x) ∈ A et t(si , x) = si+1 }
3 Renvoyer δ ∗ (s0 )
16
Optimisation Combinatoire
Cette fois-ci, Si′′ désigne l’ensemble des états de la période i à partir desquels
on peut atteindre l’état final sn . Pour chacun de ces états, nous calculons δ ∗ (si ) qui
représente une politique optimale pour parvenir à l’état final en partant de l’état si .
Nous avons le théorème suivant :
T HÉORÈME.– Si la fonction de valuation est monotone à gauche, alors δ ∗ (s0 ) est une
politique optimale pour passer de l’état initial à l’état final.
P REUVE.– Elle est analogue à la précédente et nous allons procéder par récurrence
descendante sur i pour montrer que, pour tout état si ∈ Si′′ , δ ∗ (si ) est une politique
optimale pour passer de si à sn .
C’est évident pour i = n. Supposons que cela est vrai pour tous les états appar′′
tenant à Si+1
. Soit δ = (xi+1 , xi+2 , . . . , xn ) ∈ ∆(si , sn ), et si+1 = t(si , xi+1 ).
Alors par hypothèse de récurrence, v(δ ∗ (si+1 )) ≤ v((xi+2 , . . . , xn )), et par monotonie à gauche v(xi+1 , δ ∗ (si+1 )) ≤ v(δ). La définition de δ ∗ (si ) permet d’affirmer que
v(δ ∗ (si )) ≤ v(xi+1 , δ ∗ (si+1 )), d’où l’on obtient : v(δ ∗ (si )) ≤ v(δ).
R EMARQUE.– La méthode de procédure arrière ne conduit pas forcément à parcourir
le même sous-ensemble de sommets du graphe d’états que celle de procédure avant.
En effet, les états atteignables depuis l’état initial ne sont pas forcément les mêmes
que ceux à partir desquels on peut atteindre l’état final (le lecteur pourra reprendre
l’exemple de gestion de stocks pour s’en convaincre).
1.5.3. Principe d’optimalité et monotonie
On évoque souvent, pour justifier l’utilisation de la programmation dynamique, le
fait que le problème vérifie le principe d’optimalité de Bellman. Voici comment il est
énoncé dans [BEL 57] (ce que nous appelons première forme du principe d’optimalité) :
An optimal policy has the property that whatever the initial state and the initial
decisions are, the remaining decisions must constitute an optimal policy with
regard to the state resulting from the first decision.
Ce principe stipule donc que, dans un processus où l’on doit prendre n décisions,
la restriction d’une politique optimale aux (n − 1) dernières décisions (et donc par
récurrence aux k dernières, pour k ∈ {1, . . . , n − 1}) doit être optimale.
Ce principe semble donc très proche de notre hypothèse de monotonie à gauche,
base de la preuve de la procédure arrière. On pourrait d’ailleurs clairement reprendre
la preuve de la méthode en prenant comme hypothèse le principe d’optimalité, qui
constitue donc une condition suffisante pour que la procédure arrière s’applique.
On énonce souvent le principe d’optimalité de la manière suivante : “toute souspolitique d’une politique optimale est optimale” (ce que nous appelons deuxième
Programmation dynamique
17
forme du principe d’optimalité). Il apparaît sous une forme (légèrement) plus restrictive que la première, et se rapproche alors de la monotonie ; on peut dans ce cas
appliquer les procédures avant et arrière.
Néanmoins, on peut s’apercevoir que l’hypothèse de monotonie permet de considérer des problèmes pour lesquels le principe d’optimalité de Bellman (dans les deux
formes précédentes) n’est pas vérifié (e.g., [MIN 83]).
Reprenons l’exemple (voir section 1.4.2) du problème de plus court chemin bottleneck
dans un graphe, où la valeur d’un chemin est la plus grande des valuations des arêtes
qui le constituent. Comme nous l’avons vu, la fonction de valuation des politiques
est monotone. Considérons maintenant le graphe de la figure 1.3, dans lequel nous
cherchons un chemin optimal entre v1 et v5 .
v3
3
2
v1
5
v2
v5
4
1
v4
Figure 1.3. Violation du principe d’optimalité.
On s’aperçoit aisément que le chemin (v1 , v2 , v4 , v5 ), de valeur 5, est optimal. En
revanche, le sous-chemin (v2 , v4 , v5 ), de valeur 4, n’est pas optimal pour aller de v2 à
v5 . L’autre chemin (c’est-à-dire (v2 , v3 , v5 )) est en effet de valeur 3.
R EMARQUE.– En toute rigueur, le principe d’optimalité n’entraîne pas la monotonie.
Pour s’en rendre compte, il suffit de remarquer qu’il ne porte que sur les politiques
optimales, alors que la monotonie porte elle sur toutes les politiques.
Imaginons maintenant que l’on modifie légèrement l’hypothèse de monotonie en
introduisant la notion de monotonie stricte :
D ÉFINITION.– La fonction de valuation v est dite :
– strictement monotone à droite ssi pour tout si ∈ Si , tout sj ∈ Sj , tout (δ, δ ′ ) ∈
∆(si , sj )2 et pour tout x ∈ X tel que (sj , x) ∈ A :
v(δ) < v(δ ′ ) =⇒ v(δ, x) < v(δ ′ , x)
v(δ) = v(δ ′ ) =⇒ v(δ, x) = v(δ ′ , x)
18
Optimisation Combinatoire
– strictement monotone à gauche ssi pour tout si ∈ Si , tout sj ∈ Sj , tout (δ, δ ′ ) ∈
∆(si , sj )2 et pour tout x ∈ X tel qu’il existe si−1 avec (si−1 , x) ∈ A et t(si−1 , x) =
si :
v(δ) < v(δ ′ ) =⇒ v(x, δ) < v(x, δ ′ )
v(δ) = v(δ ′ ) =⇒ v(x, δ) = v(x, δ ′ )
– strictement monotone ssi elle est strictement monotone à droite et à gauche.
Si l’on suppose que la fonction de valuation est strictement monotone (resp. strictement monotone à gauche), le principe d’optimalité dans sa deuxième forme (resp.
dans sa première forme) est alors automatiquement vérifié. En effet, supposons par
exemple que v est strictement monotone à gauche, et considérons une politique optimale δ ∗ = (x1 , x2 , . . . , xn ). Soit δ une politique de s1 = t(s0 , x1 ) à sn . L’hypothèse
de stricte monotonie interdit immédiatement la possibilité v(δ) < v(x2 , . . . , xn ), donc
(x2 , . . . , xn ) est optimale de s1 à sn .
Le caractère strict de la monotonie, s’il entraîne le principe d’optimalité de Bellman,
ne présente réellement d’intérêt que si l’on recherche toutes les politiques optimales,
et non une seule. En effet, en modifiant légèrement les procédures avant et arrière
de façon à retenir toutes les politiques partielles optimales, l’hypothèse de monotonie
stricte garantit d’obtenir toutes les politiques optimales. Par contre, la monotonie large
ne le garantit pas, comme on peut s’en convaincre sur l’exemple de la figure 1.3.
1.6. Résolution des exemples
1.6.1. Gestion de stocks
Dans ce problème, le but est de déterminer combien de pièces P il faut acheter
au début de chaque mois de manière à minimiser le coût total (tout en satisfaisant
la demande). L’approche par programmation dynamique consiste ici à résoudre la
famille suivante de problèmes : pour chaque période i et pour chaque stock à la fin de
cette période, déterminer une politique optimale pour parvenir à ce niveau de stock.
Nous résolvons l’exemple de la section 1.4.1 sur la figure 1.4. Dans ce tableau, l’indice
d’une colonne correspond à la période considérée et l’indice d’une ligne correspond
au niveau de stock atteint à la fin de cette période. Dans la case associée figurent la
valeur d’une politique optimale jusqu’à cet état et le vecteur des décisions définissant
une telle politique optimale.
1.6.2. Plus court chemin bottleneck
Dans ce problème, le but est de déterminer un plus court chemin bottleneck pour
aller d’un sommet v0 à un sommet vn . L’approche par programmation dynamique
consiste ici à résoudre la famille suivante de problèmes : pour chaque i ≤ n et pour
chaque sommet du graphe, déterminer un chemin optimal comportant au plus i arcs de
Programmation dynamique
Prix d’achat unitaire pi
Demande di
19
mois 1 mois 2 mois 3 mois 4 mois 5
3
2
2
4
3
1
4
2
3
1
PP
PPpériode 0
PP
stock
P
P
0
0
()
1
2
3
4
1
2
3
4
5
3
(1)
6
(2)
9
(3)
12
(4)
15
(5)
11
(1, 4)
13
(1, 5)
15
(1, 4, 2)
17
(1, 4, 3)
19
(1, 4, 4)
21
(1, 4, 5)
21
24
(1, 4, 5, 0) (1, 4, 5, 0, 1)
25
(1, 4, 5, 1)
29
(1, 4, 5, 2)
5
Figure 1.4. Résolution du problème de stock.
v0 à ce sommet. Nous résolvons l’exemple de la section 1.4.2 sur la figure 1.5. Dans le
tableau, l’indice d’une colonne correspond au nombre maximum d’arcs des chemins
considérés et l’indice d’une ligne correspond au sommet du graphe atteint. Comme
précédemment, dans la case associée figurent la valeur d’une politique optimale jusqu’à cet état et le vecteur des décisions définissant une telle politique optimale.
1.6.3. Sac à dos
La résolution de ce problème par programmation dynamique consiste à déterminer,
pour chaque i ∈ {1, . . . , 5} et pour chaque j ∈ {0, . . . , 9}, une solution optimale du
problème suivant : déterminer un sous-ensemble d’objets parmi {1, . . . , i} de masse
inférieure ou égale à j et de profit maximal.
Le tableau 1.6 présente la résolution de l’exemple de la section 1.4.3. La case à
l’intersection de la colonne i ∈ {1, . . . , 5} et de la ligne j ∈ {0, . . . , 9} indique la
valeur d’une solution optimale du problème correspondant, ainsi que le vecteur de
décisions définissant une telle solution.
20
Optimisation Combinatoire
v1
3
1
v3
4
4
1
4
v0
1
4
2
5
v5
2
3
v2
v4
PP
PPpériode 0
sommet PPP
P
v0
−∞
()
v1
v2
v3
1
2
3
4
−∞
(v0 )
1
(v1 )
5
(v2 )
4
(v3 )
−∞
(v0 , v0 )
1
(v1 , v1 )
4
(v1 , v2 )
3
(v1 , v3 )
5
(v2 , v4 )
4
(v3 , v5 )
−∞
(v0 , v0 , v0 )
1
(v1 , v1 , v1 )
3
(v1 , v3 , v2 )
3
(v1 , v3 , v3 )
4
(v1 , v2 , v4 )
4
(v3 , v5 , v5 )
−∞
(v0 , v0 , v0 , v0 )
1
(v1 , v1 , v1 , v1 )
3
(v1 , v3 , v2 , v2 )
3
(v1 , v3 , v3 , v3 )
3
(v1 , v3 , v2 , v4 )
4
3
(v3 , v5 , v5 , v5 ) (v1 , v3 , v2 , v4 , v5 )
v4
v5
5
Figure 1.5. Résolution du plus court chemin bottleneck.
1.7. Quelques extensions
Après avoir vu quelques exemples classiques de résolution de problèmes qui s’exprimaient directement dans le cadre utilisé ici, nous allons dans cette partie proposer
quelques extensions permettant de résoudre d’autres problèmes par la méthode de la
programmation dynamique. Dans la section 1.7.1, nous généralisons la problématique
au cas (de l’optimisation multicritère notamment) où l’ensemble de valeurs Z est muni
d’un ordre supposé seulement partiel. Ensuite, dans la section 1.7.2, nous nous intéressons à la programmation dynamique dans l’incertain. Enfin, dans la section 1.7.3,
Programmation dynamique
masses
profits
21
objet 1 objet 2 objet 3 objet 4 objet 5
6
5
3
2
1
20
19
9
5
2
PP
PPpériode 0
masse PPP
P
0
0
()
1
2
3
4
5
6
7
8
9
1
2
3
4
5
0
(0)
0
(0)
0
(0)
0
(0)
0
(0)
0
(0)
20
(1)
20
(1)
20
(1)
20
(1)
0
(0, 0)
0
(0, 0)
0
(0, 0)
0
(0, 0)
0
(0, 0)
19
(0, 1)
20
(1, 0)
20
(1, 0)
20
(1, 0)
20
(1, 0)
0
(0, 0, 0)
0
(0, 0, 0)
0
(0, 0, 0)
9
(0, 0, 1)
9
(0, 0, 1)
19
(0, 1, 0)
20
(1, 0, 0)
20
(1, 0, 0)
28
(0, 1, 1)
29
(1, 0, 1)
0
(0, 0, 0, 0)
0
(0, 0, 0, 0)
5
(0, 0, 0, 1)
9
(0, 0, 1, 0)
9
(0, 0, 1, 0)
19
(0, 1, 0, 0)
20
(1, 0, 0, 0)
24
(0, 1, 0, 1)
28
(0, 1, 1, 0)
29
30
(1, 0, 1, 0) (0, 1, 1, 0, 1)
Figure 1.6. Résolution du sac à dos.
nous présentons la programmation dynamique généralisée qui a été introduite pour
traiter des problèmes où la fonction de valuation n’est pas monotone.
1.7.1. Ordre partiel et optimisation multicritère
1.7.1.1. Nouvelle formulation du problème
Nous supposons ici que la fonction v de valuation des politiques est à valeurs
dans un ensemble Z muni d’un ordre partiel 4. Cela signifie que deux politiques
ne sont plus forcément comparables. On introduit alors le concept de politique nondominée : une politique δ0 est dite non-dominée ssi il n’existe pas de politique δ telle
que v(δ) ≺ v(δ0 ).
22
Optimisation Combinatoire
Le but du problème est alors modifié : il ne s’agit plus de trouver une politique
δ ∗ ∈ ∆(s0 , sn ) meilleure que toutes les autres (car bien souvent une telle politique
n’existera pas), mais de trouver l’ensemble des politiques non-dominées1.
Soit ∆0 un ensemble de politiques réalisables. Nous notons N D(∆0 ) un sousensemble de ∆0 minimal pour l’inclusion tel que :
∀δ ∈ ∆0 , ∃δ ∗ ∈ N D(∆0 ) : v(δ ∗ ) 4 v(δ)
Résoudre le problème consiste alors à trouver un ensemble N D(∆(s0 , sn )).
1.7.1.2. Résolution
Les méthodes de résolution avant et arrière sont toujours applicables sous les hypothèses de monotonie à droite ou à gauche de la fonction de valuation. Il faut cependant
les adapter à la nouvelle problématique en déterminant, pour chaque état si de chaque
période i, l’ensemble ∆∗ (si ) des politiques non-dominées de s0 à si (ou de si à sn ).
La procédure avant s’exprime comme suit :
1 Définir S0′ = {s0 } et ∆∗ (s0 ) = {()} (l’ensemble contenant un élément : la
politique vide) ;
2 Pour i allant de 1 à n :
′
et (si−1 , x) ∈ A}
2a
Déterminer Si′ = {t(si−1 , x) : si−1 ∈ Si−1
′
2b
Pour tout si ∈ Si , déterminer un ensemble :
∆∗ (si ) = N D({(δ, x) : δ ∈ ∆∗ (si−1 ) et t(si−1 , x) = si })
3 Renvoyer ∆∗ (sn )
Cette méthode de procédure avant est valable sous l’hypothèse de monotonie à
droite :
T HÉORÈME.– Si la fonction de valuation est monotone à droite, alors ∆∗ (sn ) =
N D(∆(s0 , sn )).
La preuve, similaire à celle du cadre traditionnel, est omise.
1.7.1.3. Exemples
Dans les problèmes multicritères [TRZ 94], on dispose de q fonctions de valuation
v1 , . . . , vq de ∆ dans N (les critères), que l’on suppose monotones.
1. En réalité, si deux politiques non dominées ont même valuation, on n’en retiendra qu’une.
Programmation dynamique
23
A chaque politique réalisable correspond donc un point dans l’espace des critères.
L’ordre partiel le plus utilisé entre vecteurs-coûts est la Pareto-dominance 4P :
∀x, y ∈ Nq , x 4P y ⇐⇒ ∀i ∈ {1, . . . , q}, xi ≤ yi
On considère que l’on a modélisé un problème multicritère sous la forme du graphe
d’états de la figure 1.7. Lors de l’exécution de la procédure avant indiquée dans la section précédente, les ensembles ∆∗ (vi ) retenus sont (en notant vj la décision menant à
l’état vj ) :
- ∆∗ (v1 ) = {(v1 )}
- ∆∗ (v2 ) = {(v2 )}
- ∆∗ (v3 ) = {(v1 , v3 )}
- ∆∗ (v4 ) = {(v1 , v4 ), (v2 , v4 )}
- ∆∗ (v5 ) = {(v2 , v5 )}
- ∆∗ (v6 ) = {(v2 , v4 , v6 ), (v2 , v5 , v6 )}
Pour ∆∗ (v4 ) par exemple, les deux politiques possibles (v1 , v4 ) et (v2 , v4 ), de valeurs respectives (5, 3) et (3, 4), doivent être retenues car elles sont toutes deux nondominées.
v3
(2,2)
v1
(2,2)
(3,1)
(2,2)
v0
v4
(1,1)
(1,2)
(2,2)
(2,1)
v2
(2,1)
v5
Figure 1.7. Graphe d’états d’un problème multicritère.
v6
24
Optimisation Combinatoire
1.7.2. Programmation dynamique dans l’incertain
Dans la plupart des problèmes réels, on est amené à prendre en compte l’incertain.
Le processus fait intervenir non plus seulement les choix du décideur mais également une part d’incertitude liée à des paramètres extérieurs : on doit alors modifier le
cadre déterministe étudié jusqu’à présent. Dans un problème de gestion de stocks par
exemple, il est rare que la demande soit déterministe. Des données statistiques permettent néanmoins généralement de modéliser l’incertain sous forme d’une variable
aléatoire correspondant à la demande. On évalue alors la séquence de choix au regard
d’un critère de décision donné (par exemple l’espérance de la valeur de la solution).
1.7.2.1. Processus décision-hasard
Dans ce nouveau cadre, une période se divise en deux phases successives : une
décision, puis l’intervention du hasard qui détermine l’état dans lequel on va se trouver
à la fin de cette période. Nous considérons que, étant donnés un état et une décision,
le hasard est la donnée d’un ensemble d’états susceptibles d’être atteints et d’une
probabilité pour chacun d’eux qu’ils soient effectivement atteints. Ainsi, cela revient
à considérer une fonction de transition non plus déterministe mais aléatoire.
Une politique ne consiste plus ici en une séquence de décisions, car une telle séquence n’aurait pas de sens en présence du hasard. Il s’agit maintenant de donner
pour chaque état s ∈ S la décision x(s) que l’on prendrait (si les décisions précédentes et le hasard nous y conduisaient). Il est commode de représenter le processus
décision-hasard par un graphe d’états particulier, appelé arbre décision-hasard, où
l’on distingue deux types de sommets :
- des sommets si ∈ Si correspondant aux différents états,
- des sommets hi ∈ Hi correspondant à l’intervention du hasard.
Dans ce graphe, un arc (si , hi ) correspond à une décision, et l’ensemble des arcs
{(hi , si+1 ) : si+1 ∈ Γ+ (hi )} correspond aux différentes transitions aléatoires possibles. De plus, une probabilité de transition P (hi , si+1 ) est associée à chaque arc
(hi , si+1 ).
Dans un tel contexte, l’état final possible n’est bien souvent pas unique : on dispose
d’un ensemble d’états finaux Sn qu’on est susceptible d’atteindre. En outre, on attribue
une valeur scalaire v(sn ) à chaque état final sn ∈ Sn . La valeur d’une politique δ
correspond alors à l’espérance :
E(δ) =
X
Pδ (sn )v(sn )
sn ∈Sn
où Pδ (sn ) désigne la probabilité que l’on aboutisse à l’état sn en menant la politique
δ.
Programmation dynamique
25
Selon que les valeurs associées aux états finaux représentent des coûts ou des profits, on recherche une politique minimisant ou maximisant l’espérance.
1.7.2.2. Résolution
La valeur d’une politique optimale est obtenue en remontant à partir des états finaux vers l’état initial selon les relations de récurrence suivantes :
v(si )
v(hi )
= P min{v(hi ) : hi ∈ Γ+ (si )}
=
si+1 ∈Γ+ (hi ) P (hi , si+1 )v(si+1 )
On associe une étiquette à chaque sommet du graphe de décision correspondant à la
valeur d’une politique optimale de ce sommet à un état final. Une décision optimale
x∗ (si ) en un état si correspond à un arc (si , hi ) pour lequel l’étiquette associée au
sommet hi est minimale. L’ensemble de ces décisions optimales constituent une politique optimale.
1.7.2.3. Exemple
Considérons un contrat d’assurance auquel on peut décider de souscrire pour une
année 1 et/ou une année 2. Bien évidemment, on ne sait pas si on sera amené ou
non à le faire valoir à la suite d’un sinistre. De plus, la probabilité d’avoir un sinistre
durant l’année 2 est conditionnée au fait qu’on ait déjà subi ou non un sinistre durant
l’année 1. L’arbre décision-hasard correspondant à ce problème est représenté sur la
figure 1.8. Le sommet d1 concerne le choix de souscrire (branche 1) ou non (branche
0) au contrat lors de la première année. Les sommets h1 ou h2 concernent l’occurrence
(branche 1) ou non (branche 0) d’un événement nécessitant de faire jouer ce contrat
(P (0) = 2/5 et P (1) = 3/5). Les sommets d2 , d3 , d4 et d5 concernent le choix de
souscrire ou non au contrat lors de l’année 2. Enfin, les sommets h3 , h4 , h5 , h6 , h7 ,
h8 , h9 et h10 concernent l’occurrence d’un événement nécessitant de faire jouer le
contrat lors de la deuxième année. Si on a déjà connu un sinistre lors de l’année 1, la
probabilité d’occurrence d’un tel événement est P (0) = 3/4 (et donc P (1) = 1/4).
Par contre, si on n’a pas connu de sinistre lors de l’année 1, les probabilités demeurent
P (0) = 2/5 et P (1) = 3/5. En chaque feuille de l’arbre décision-hasard figure le coût
total engendré. La souscription à un contrat coûte 1, alors que faire face à un sinistre
non couvert coûte 2 (contre 0 si l’on est assuré). Le lecteur vérifiera sans peine que
de telles paramètres conduisent à associer la valeur min{6/5, 1} = 1 au sommet d2 ,
5/2 au sommet d3 , 2 au sommet d4 et 3/2 au sommet d5 . Par conséquent, l’étiquette
du sommet h1 vaut 1 × 2/5 + 5/2 × 3/5 = 19/10, et l’étiquette du sommet h2 vaut
17/10. La politique optimale consiste donc à souscrire au contrat la première année, et
à ne souscrire au contrat la deuxième année que si l’on n’a pas subi de sinistre lors de
la première année.
26
Optimisation Combinatoire
0
0
h3
1
0
d2
0
1
h4
1
0
h1
0
0
h5
1
1
0
d3
1
h6
1
0
d1
0
h7
1
0
d4
0
1
1
h8
1
0
h2
0
h9
1
1
0
d5
1
h1
1
b0
b2
b1
b1
b2
b4
b3
b3
b1
b3
b2
b2
b1
b3
b2
b2
Figure 1.8. Arbre décision-hasard pour le problème des contrats d’assurance.
1.7.3. Programmation dynamique généralisée
On s’intéresse ici à une problématique similaire à celle évoquée dans un article
de [SNI 81], concernant la procédure de [KAO 78] pour un problème de voyageur
de commerce avec des coûts stochastiques. Nous étudions dans cette optique un problème de plus court chemin stochastique où une probabilité de retard est associée à
chaque arc. Considérons le graphe de la figure 1.9. On part du sommet s à 12H00 et
on suppose qu’on prend des bus en chaque sommet du graphe, afin de se rendre au
sommet t où l’on a un train à prendre qui part à 16H00. En chaque sommet du graphe
et à chaque heure pile part un bus pour se rendre au sommet suivant en un temps de
parcours normalement inférieur à une heure. Néanmoins, les aléas du trafic peuvent
allonger le temps de parcours au-delà de l’heure, et sont modélisés par une probabilité
Programmation dynamique
27
1
0.1
0.9
s
3
0.6
0.9
t
0.6
2
Figure 1.9. Une instance de plus court chemin stochastique.
d’occurrence de cet événement. On recherche le chemin le plus adéquat pour arriver à
destination avant 16H00. Remarquons que cet horaire est respecté si et seulement si un
bus au plus est en retard. Soit R(P ) la variable aléatoire représentant le nombre de bus
en retard sur le chemin P . On cherche donc à maximiser la probabilité P (R(P ) ≤ 1).
Au sommet t, on a P (R(s, 1, 3, t) ≤ 1) < P (R(s, 2, 3, t) ≤ 1). En effet, en additionnant la probabilité que tous les bus soient à l’heure, avec les probabilités qu’un seul
bus soit en retard, on obtient :

P (R(s, 1, 3, t) ≤ 1) = 0.009 + 0.9 × 0.09 + 0.1 × 0.01 + 0.9 × 0.09



= 0.172
P
(R(s,
2,
3,
t)
≤
1)
=
0.016 + 0.6 × 0.04 + 0.6 × 0.04 + 0.9 × 0.16



= 0.208
et donc la solution optimale est le chemin (s, 2, 3, t). Malheureusement, si l’on prend
comme valeur du chemin P la probabilité P (R(P ) ≤ 1), l’application de la méthode
de programmation dynamique conduit à une erreur car le critère n’est pas monotone.
En effet, au sommet 3 on a :
P (R(s, 1, 3) ≤ 1) = 1 − 0.09 = 0.91
P (R(s, 2, 3) ≤ 1) = 1 − 0.36 = 0.64
En conséquence, le chemin (s, 2, 3) serait coupé lors de l’exécution de la méthode.
La programmation dynamique généralisée a été développée par [CAR 89, CAR 90]
pour faire face à ce type de situation. Elle est basée sur un principe faible d’optimalité
qui s’énonce comme suit :
Une politique optimale est composée de sous-politiques susceptibles de faire
partie d’une politique optimale.
Plus précisément, il s’agit d’adapter le principe d’optimalité au cas où la fonction de valuation des politiques n’est pas monotone, en élimininant les politiques partielles dont on sait qu’il n’est pas possible de les compléter en une politique optimale.
28
Optimisation Combinatoire
Pour cela, nous utilisons pour chaque état s le préordre partiel 4s tel que pour tout
(δ1 , δ2 ) ∈ ∆(s0 , s)2 :
δ1 4s δ2 ⇔ ∃δ ′ ∈ ∆(s, sn ) : ∀δ ∈ ∆(s, sn ), v(δ1 , δ ′ ) ≤ v(δ2 , δ)
La méthode de la programmation dynamique généralisée consiste alors à ne retenir,
pour chaque état s, que les politiques δ ∈ ∆(s0 , s) pour lesquelles il n’existe pas de
politique δ ′ réalisable de s0 à s telle que δ ′ ≺s δ. En procédant ainsi, nous aboutissons
pour la dernière période à un ensemble de politiques réalisables de s0 à sn contenant
toutes les politiques optimales.
Dans la pratique, il peut être difficile de construire dans son intégralité le préordre
4s ; il est néanmoins souvent possible de déterminer une condition suffisante pour
que δ ≺s δ ′ . Cela permet d’effectuer des coupes et de gagner ainsi sensiblement en
efficacité par rapport à une méthode exhaustive.
Dans l’exemple du plus court chemin stochastique, une telle approche consisterait
à remarquer qu’un chemin partiel P1 ne peut conduire à un chemin optimal dès lors
qu’il est strictement dominé par un autre chemin P2 au même sommet, au sens de la
dominance stochastique 4S définie comme suit :
P2 4S P1 ⇐⇒ ∀k ∈ {0, 1, 2, 3}, P (R(P2 ) ≤ k) ≥ P (R(P1 ) ≤ k)
Dès lors, un chemin n’est coupé par l’algorithme que s’il remplit cette condition.
Sur le graphe de la figure 1.9, le chemin (s, 2, 3) n’est pas coupé au sommet 3 car
P (R(s, 2, 3) ≤ 0) > P (R(s, 1, 3) ≤ 0).
En évaluant des politiques partielles vis-à-vis de leur impact sur le problème global, les errements potentiels liés à la vision locale de la programmation dynamique
traditionnelle sont évités. Ainsi, l’exactitude de la procédure de résolution est assurée.
1.8. Conclusion
Dans ce chapitre, nous avons présenté un cadre formel pour la programmation
dynamique, méthode d’énumération implicite des solutions couramment utilisée en
optimisation combinatoire. Cette approche présente l’intérêt de pouvoir s’appliquer
à une large variété de problèmes, dont l’aspect séquentiel n’est pas forcément immédiat. Deux procédures de résolution sont mises en avant dans la littérature, une
procédure avant et une procédure arrière, pour lesquelles nous avons donné des conditions suffisantes de validité (monotonie à droite, monotonie à gauche, monotonie).
Nous avons ensuite illustré ces procédures sur des exemples typiques en programmation dynamique (gestion de stocks, plus court chemin, sac à dos). Enfin, quelques
extensions classiques de notre cadre d’étude (fonction de valuation multicritère ou
non-monotone, décision dans l’incertain) ont été étudiées dans une dernière partie.
Programmation dynamique
29
1.9. Bibliographie
[BEL 54] B ELLMAN R., « Some applications of the Theory of dynamic programming - a review », Journal of the Operational Research Society of America, vol. 2, n°3, p. 275-288,
1954.
[BEL 57] B ELLMAN R., Dynamic programming, Princeton University Press, 1957.
[BEL 84] B ELLMAN R., Eye of the Hurricane, World Scientific Publishing Company, Singapour, 1984.
[CAR 89] C ARRAWAY R., M ORIN T., , M OSKOWITZ H., « Generalized dynamic programming for stochastic combinatorial optimization », Operations Research, vol. 37, n°5, p. 819829, 1989.
[CAR 90] C ARRAWAY R., M ORIN T., M OSKOWITZ H., « Generalized dynamic programming
for multicriteria optimization », European Journal of Operational Research, vol. 44, p. 95104, 1990.
[DRE 77] D REYFUS S., L AW A., The art and theory of dynamic programming, Academic
press, 1977.
[DRE 02] D REYFUS S., « Richard Bellman on the birth of dynamic programming », Operations Research, vol. 50, n°1, p. 48-51, 2002.
[KAO 78] K AO E., « A preference order dynamic program for a stochastic traveling salesman
problem », Operations Research, vol. 26, n°6, p. 1033-1045, 1978.
[KAR 67] K ARP R., H ELD M., « Finite-state processes and dynamic programming », SIAM
Journal on Applied Mathematics, vol. 15, n°3, p. 693-718, 1967.
[LAU 79] L AURIÈRE J., Éléments de programmation dynamique, Gauthier-Villars, 1979.
[MIN 83] M INOUX M., Programmation Mathématique, théorie et algorithmes, vol. 2 de Collection Technique et Scientifique des Télécommunications, Bordas, 1983.
[MIT 64] M ITTEN L., « Composition principles for synthesis of optimal multistage processes », Operations Research, vol. 12, n°4, p. 610-619, 1964.
[MIT 74] M ITTEN L., « Preference order dynamic programming », Management Science,
vol. 21, n°1, p. 43-46, 1974.
[MOR 82] M ORIN T., « Monotonicity and the principle of optimality », Journal of Mathematical Analysis and Applications, vol. 86, p. 665-674, 1982.
[SNI 81] S NIEDOVICH M., « Analysis of a preference order traveling salesman problem »,
Operations Research, vol. 29, n°6, p. 1234-1237, 1981.
[TRZ 94] T RZASKALIK T., « Multiple criteria discrete dynamic programming », Mathematics
Today, vol. XII-A, p. 173-199, 1994.
Chapitre 2
Index
optimisation multicritère, 21
politique
optimale, 8
réalisable, 7
principe d’optimalité, 16
procédure
arrière, 15
avant, 14
processus décision-hasard, 24
sac à dos, 12
plus court chemin
bottleneck, 10
stochastique, 26
programmation dynamique, 1
généralisée, 26
espace d’états, 5
gestion de stocks, 9
monotonie, 8
à droite, 8
à gauche, 8
31
Téléchargement