Vous êtes sur la page 1sur 117

Universit Lille I

Licence mention informatique S5


Algo
Franois Lemaire
6 septembre 2012
Introduction
Ce cours est une introduction la recherche oprationnelle et lalgorithmique de loptimi-
sation. Lexpression recherche oprationnelle date de la seconde guerre mondiale. Elle a t
invente au Royaume Uni et a signi initialement : optimisation des oprations militaires. La pre-
mire quipe de recherche oprationnelle a t cre en 1938 et place sous la direction du quartier
gnral de la Royal Air Force. Elle sest illustre pendant la guerre sur de nombreux problmes :
recoupement des donnes obtenues par les diffrentes stations de radar, gestion des quipages lors
de la maintenance des avions et surtout, optimisation de la stratgie dattaque des sousmarins alle-
mands en surface. Parmi ses membres, on peut citer le physicien Patrick Blackett. Aprs la guerre,
les mthodes doptimisation ont t considrablement appliques dans le domaine conomique
(maximisation dun prot, minimisation dun cot).
Faire de la recherche oprationnelle consiste en pratique modliser mathmatiquement un
problme donn puis rsoudre le problme modlis. La premire tape demande du savoirfaire
et de lexprience (certains parlent d art ). Pour la seconde, on dispose dalgorithmes rigoureux.
La discipline sest dveloppe avec linformatique : modliser mathmatiquement des problmes
complexes ne servirait rien si on ne disposait pas dordinateurs pour mener les calculs.
Ce cours aborde les deux aspects de la recherche oprationnelle : on sinitie la modlisation
mathmatique de problmes quon rsout par logiciel (AMPL) et on tudie plusieurs algorithmes
importants mis en uvre par ces logiciels (mthode des moindres carrs, simplexe, algorithmes de
thorie des graphes).
La partie pratique de ce cours (modlisation dune situation, utilisation dun logiciel) est imm-
diatement utilisable par tout tudiant entrant dans le monde de lentreprise avec une Licence. La
partie thorique (algorithmique, techniques de preuves, calculs de complexit) sadresse aux tu-
diants qui poursuivront des tudes en Master dinformatique. Dans les feuilles dexercices, on
insiste davantage que dans ce support sur un savoirfaire : tre capable de reconnatre un problme
doptimisation dans un problme qui nest pas a priori formul comme tel. Ce savoirfaire est
important du point de vue thorique et du point de vue pratique.
La premire section de ce document est consacre des rappels dalgbre linaire. Notion de
matrice et algorithme du pivot de Gauss : paramtrage de lensemble des solutions dans le cas o
il y a plus dinconnues que dquations. On conclut cette section par ltude de la mthode des
moindres carrs qui consiste optimiser un critre non linaire et qui sutilise lorsquil y a plus
dquations que dinconnues.
La deuxime section est consacre la programmation linaire. On y apprend modliser des
problmes sous la forme de programmes linaires en nombres rels ou en nombres entiers : voca-
1
bulaire, difcult de la rsolution en nombres entiers par rapport la rsolution en nombres rels,
modlisations particulires (report de stocks, minimisation dune somme ou dun maximum de
valeurs absolues), comment un modle peut devenir gros. On insiste sur ltude de la sensibilit
de lobjectif ralis visvis dune perturbation des paramtres. Cette information est particuli-
rement importante pour laide la dcision : elle dtermine les contraintes dont il faut saffranchir
en priorit pour amliorer la situation. La mise en uvre seffectue avec le logiciel AMPL.
La troisime section est ddie ltude de lalgorithme du simplexe qui constitue la prin-
cipale mthode de rsolution de programmes linaires en nombres rels. On commence par la
rsolution graphique qui permet de soutenir lintuition. On continue par lalgorithme du tableau
simplicial, qui permet de rsoudre des problmes de plus de deux variables, inaccessibles la r-
solution graphique. On aborde ensuite une mthode de rsolution des problmes de dmarrage qui
montre comment rsoudre les programmes linaires en nombres rels gnraux et qui fournit un
bel exemple de rduction de problme. On conclut par ltude de la dualit dans les programmes
linaires et dune de ses principales applications : lanalyse de la sensibilit de lobjectif ralis
visvis dune perturbation des paramtres.
La quatrime section est consacre la thorie des graphes. Dnitions (graphes orients ou
non, connexit) et reprsentations informatiques dun graphe (listes de successeurs, matrices din-
cidence ou dadjacence). On y tudie quelques algorithmes gnriques (parcours en profondeur ou
en largeur dabord, tri topologique des sommets des graphes sans cycle) et quelques algorithmes
doptimisation : recherche dun chemin de valeur minimale (Bellman, Dijkstra), calcul dun ot
de valeur maximale (FordFulkerson), dun arbre couvrant de valeur minimale (Kruskal) et dun
ordonnancement de tches optimal (mthode MPM). En mme temps que le principe des algo-
rithmes, on tudie les preuves de correction ainsi que les meilleures structures de donnes connues
permettant de les implanter (piles, les, les avec priorit, ensembles disjoints). Ces structures
tant prcises, on obtient une borne de complexit en temps, dans le pire des cas, des mthodes.
On montre aussi comment certains de ces problmes peuvent se coder au moyen de programmes
linaires, ce qui est trs utile ds quon a affaire une variante exotique dun des problmes tu-
dis (ot maximal cot minimal, ot maximal avec dperdition du ux le long du rseau par
exemple). Des complments sur le langage du logiciel AMPL sont donns en dernire section.
Ce cours est videmment trs incomplet. Parmi les grandes absentes, mentionnons toute la
branche mathmatiques appliques de loptimisation.
Ce cours a t rdig et mis jour par Franois Boulier jusquen 2008, en collaboration avec
Carine Jauberthie et Nicolas Jozefowiez. Ce cours est maintenant rutilis et mis jour par Franois
Lemaire. La version originale a t ralise partir des notes de cours de Bernhard Beckermann
(une importante source dinspiration pour la thorie du simplexe et ses applications), Florent Cor-
dellier, Grard Jacob, Nathalie Revol et des livres [5] (pour AMPL), [7] (riche dune douzaine de
trs intressants problmes de modlisation), [4] [3] (pour la thorie des graphes) et [1] (pour la
mthode des moindres carrs). Sans oublier [2] pour certaines informations historiques.
La plupart des photographies incluses dans le support de cours proviennent du site [6] de luni-
versit de SaintAndrews.
Quelle est son originalit de ce cours visvis des ouvrages cits en rfrence ? il sefforce de
prsenter ensemble la thorie des algorithmes et leur mise en pratique via un logiciel : AMPL.
2
Table des matires
1 Rappels dalgbre linaire 6
1.1 Les matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1.1 Oprations entre matrices . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.2 Matrices particulires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2 Le pivot de Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.1 criture matricielle dun systme linaire . . . . . . . . . . . . . . . . . . 9
1.2.2 Le pivot de Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3 La mthode des moindres carrs . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3.1 La mthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2 La programmation linaire 16
2.1 Un exemple dacirie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.1 Modlisation mathmatique . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.2 Premire rsolution en AMPL . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.3 Premire modlisation en AMPL . . . . . . . . . . . . . . . . . . . . . . . 18
2.1.4 Ajout dun produit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1.5 Un bricolage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1.6 Une digression : rsolution en nombres entiers . . . . . . . . . . . . . . . 20
2.1.7 Planication sur plusieurs semaines . . . . . . . . . . . . . . . . . . . . . 21
2.2 Sensibilit par rapport de petites perturbations . . . . . . . . . . . . . . . . . . . 23
2.2.1 Valeur marginale dune contrainte . . . . . . . . . . . . . . . . . . . . . . 23
2.2.2 Cot rduit dune variable . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3 Comment un programme linaire peut devenir gros . . . . . . . . . . . . . . . . . 24
2.4 Nommer des quantits intermdiaires . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5 Linarit des contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.1 Paramtres calculs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.2 Expressions conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6 Autres problmes classiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.6.1 Minimiser une somme de valeurs absolues . . . . . . . . . . . . . . . . . 27
2.6.2 Minimiser un maximum en valeur absolue . . . . . . . . . . . . . . . . . . 28
2.7 Variables entires et binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7.1 Le solveur utiliser : cplex . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3
2.7.2 Modlisation dun ou . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.7.3 Modlisation dun et . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3 Le simplexe 31
3.1 Vocabulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2 Quelques programmes linaires particuliers . . . . . . . . . . . . . . . . . . . . . 33
3.3 Lalgorithme du tableau simplicial . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.1 Dans un cas favorable . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.2 Problmes de dmarrage . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.4 La dualit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.4.1 Construction du dual dun programme linaire . . . . . . . . . . . . . . . 48
3.4.2 Interprtation du programme dual . . . . . . . . . . . . . . . . . . . . . . 50
3.4.3 Rsoudre le primal quivaut rsoudre le dual . . . . . . . . . . . . . . . 51
3.4.4 Sensibilit de lobjectif une perturbation des seconds membres . . . . . . 54
3.4.5 Critres doptimalit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4 Thorie des graphes 59
4.1 Vocabulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2 Reprsentations dun graphe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.3 Complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.4 Exemples de problmes rencontrs . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.5 Algorithmes de parcours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.5.1 Parcours en largeur dabord . . . . . . . . . . . . . . . . . . . . . . . 67
4.5.2 Parcours en profondeur dabord . . . . . . . . . . . . . . . . . . . . . 69
4.5.3 Calcul du nombre de composantes connexes dun graphe . . . . . . . . . . 73
4.6 Recherche dun chemin de valeur minimale . . . . . . . . . . . . . . . . . . . . . 73
4.6.1 Proprits des chemins de valeur minimale . . . . . . . . . . . . . . . . . 73
4.6.2 Cas des graphes sans circuits : lalgorithme de Bellman . . . . . . . . . . . 74
4.6.3 Cas des graphes valus positivement : lalgorithme de Dijkstra . . . . . . . 75
4.6.4 Modlisation au moyen de programmes linaires . . . . . . . . . . . . . . 80
4.7 Ordonnancement de tches : la mthode MPM . . . . . . . . . . . . . . . . . . . . 81
4.8 Flots de valeur maximale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.8.1 Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.8.2 Complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.8.3 Modlisation au moyen de programmes linaires . . . . . . . . . . . . . . 92
4.9 Arbres couvrants de valeur minimale . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.9.1 Implantation de lalgorithme de Kruskal . . . . . . . . . . . . . . . . . . . 96
5 Complments sur le langage AMPL 100
5.1 Les commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.2 Les paramtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.2.1 Paramtres indics par un mme ensemble . . . . . . . . . . . . . . . . . 100
5.2.2 Paramtres indics par deux ensembles . . . . . . . . . . . . . . . . . . . 101
4
5.2.3 Laisser des valeurs indnies . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.2.4 Paramtres indics par trois ensembles . . . . . . . . . . . . . . . . . . . . 102
5.3 Lafchage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.4 Les ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.4.1 Les ensembles non ordonns . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.4.2 Les intervalles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.4.3 Les oprations ensemblistes . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.4.4 Dsigner un lment ou une partie dun ensemble . . . . . . . . . . . . . . 103
5.4.5 Dsigner un lment dun ensemble de symboles . . . . . . . . . . . . . . 104
5.4.6 Loprateur : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.4.7 Ensembles ordonns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.4.8 Ensembles circulaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
5.4.9 Sousensembles dun ensemble ordonn . . . . . . . . . . . . . . . . . . . 106
5.4.10 La fonction ord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4.11 Produits cartsiens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4.12 Ensembles densembles . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.5 Les oprateurs arithmtiques et logiques . . . . . . . . . . . . . . . . . . . . . . . 108
5.6 Quelques commandes de linterprte AMPL . . . . . . . . . . . . . . . . . . . . . 109
5
Chapitre 1
Rappels dalgbre linaire
1.1 Les matrices
Dnition 1 On appelle matrice A R
mn
(de type mn) tout tableau m lignes et n colonnes
ayant comme lments des nombres rels.
Un vecteur de R
m
est vu comme une matrice de type m 1. Pourquoi des matrices ? Elles per-
mettent de reprsenter utilement des systmes dquations linaires.
_
3 x
1
+ x
2
x
3
= 1
2 x
1
+ x
3
= 5
peut se reprsenter par
_
3 1 1
2 0 1
_
_
_
x
1
x
2
x
3
_
_
=
_
1
5
_
.
Pour dsigner les lments dune matrice, on utilise des listes dindices. On note
A = (A
j

)
jJ colonnes
L lignes
La matrice de lexemple est de type 2 3. On la note
A = A
(1, 2, 3)
(1, 2)
.
On dsigne la jme colonne de A par
A
j
=
_
_
_
A
j
1
.
.
.
A
j
m
_
_
_
.
On dsigne sa ime ligne par
A

=
_
A
1

A
n

_
.
6
Cette notation permet de dsigner facilement des sousmatrices de A. Sur lexemple,
A
(1, 3)
(1, 2)
=
_
3 1
2 1
_
dsigne la matrice obtenue en supprimant la deuxime colonne de A. On note
t
A la transpose
de A. Les indices de lignes (resp. de colonnes) de A correspondent aux indices de colonnes (resp.
de lignes) de
t
A. Sur lexemple
t
A =
_
_
3 2
1 0
1 1
_
_
.
Dnition 2 Un ensemble de colonnes {A
1
, . . . , A
r
} dune matrice A est dit linairement ind-
pendant si

1
A
1
+ +
r
A
r
= 0
1
= =
r
= 0.
Dnition 3 On appelle base dune matrice A un ensemble linairement indpendant maximal de
colonnes de A (par extension, on appelle base la liste des indices de ces colonnes).
Proposition 1 Toutes les bases dune matrice A ont mme nombre dlments.
Dnition 4 Ce nombre est appel le rang de A.
1.1.1 Oprations entre matrices
Soient A R
mn
, B R
pq
et R. Les oprations lmentaires sont les suivantes.
1. La multiplication par un scalaire
C = A = ( A
j

)
jJ
L
.
2. La somme de A et de B ne peut se faire que si m = p et n = q
C = A+ B = (A
j

+ B
j

)
jJ
L
.
3. Le produit de A et de B ne peut se faire que si n = p. En supposant A = A
J
L
et B = B
K
J
C = AB =
_

jJ
A
j

B
k
j
_
kK
L
.
Le produit est associatif mais pas commutatif.
A =
_
1 0
1 1
_
B =
_
0 2
1 0
_
AB =
_
0 2
1 2
_
= BA =
_
2 2
1 0
_
.
7
1.1.2 Matrices particulires
1. La matrice 0 (lment neutre pour laddition).
2. La matrice unit de taille m. On la note U
m
. Cest une matrice carre de type m m avec
des 1 sur la diagonale principale et des 0 partout ailleurs.
Dnition 5 Une matrice carre A de type mm est dite inversible sil existe une matrice, note
A
1
, telle que AA
1
= U
m
.
Proposition 2 Linverse dune matrice inversible A de type m m est un inverse aussi bien
gauche qu droite :
AA
1
= A
1
A = U
m
.
Note : il est vident que si A a un inverse gauche B et un inverse droite C alors B = C
puisque C = (BA)C, B = B(AC) et B(AC) = (BA)C. La proposition est plus complique
dmontrer.
1.2 Le pivot de Gauss
FIGURE 1.1 Carl Friedrich Gauss (17771855) en 1803. Il invente la mthode des moindres carrs
pour dterminer lorbite de Crs en 1801. Il lapplique nouveau vers 1810 pour lastrode
Pallas et publie cette occasion la mthode qui lui a permis de rsoudre le systme des quations
normales ; mthode quon appelle aujourdhui le pivot de Gauss [2].
8
1.2.1 criture matricielle dun systme linaire
On sintresse au problme suivant : tant donn un systme linaire, dcrire lensemble de ses
solutions. Voici un exemple de systme linaire :
_
_
_
2 x
1
x
2
+ 4 x
3
2 x
4
= 0,
2 x
1
+ 2 x
2
3 x
3
+ 4 x
4
= 0,
4 x
1
x
2
+ 8 x
3
+ x
4
= 1
Rsoudre le systme revient rsoudre le systme
Ax = b
o la matrice A R
mn
des coefcients du systme et le vecteur b R
m
des membres gauches
des quations sont donns et o x =
t
(x
1
. . . x
n
) dsigne le vecteur des inconnues.
_
_
2 1 4 2
2 2 3 4
4 1 8 1
_
_
_
_
_
_
x
1
x
2
x
3
x
4
_
_
_
_
=
_
_
0
0
1
_
_
.
Trois cas peuvent se produire : le systme na aucune solution, le systme a exactement une
solution, le systme a une innit de solutions. La rsolution peut se mener automatiquement par
lalgorithme du pivot de Gauss ou sa variante, le pivot de GaussJordan .
1.2.2 Le pivot de Gauss
Dnition 6 Deux systmes qui ont mme ensemble de solutions sont dits quivalents.
On transforme un systme en un systme quivalent, plus simple, sur lequel on lit toutes les
informations dsires. Les oprations suivantes ne changent pas les solutions dun systme (parce
quelles sont rversibles). Il faut les faire la fois sur les membres gauche et droit des quations.
1. Multiplier une ligne par un scalaire non nul.
2. Ajouter une ligne un multiple dune autre ligne.
3. changer deux lignes.
Le pivot de Gauss applique les oprations prcdentes sur le systme dans le but dobtenir
un systme quivalent o chaque quation (on les lit du bas vers le haut) introduit au moins une
nouvelle inconnue. Reprenons lexemple qui prcde. Aprs pivot de Gauss :
_
_
_
2 x
1
x
2
+ 4 x
3
2 x
4
= 0,
x
2
+ x
3
+ 2 x
4
= 0,
x
3
+ 3 x
4
= 1
9
Lquation du bas introduit x
3
et x
4
. Lquation du milieu introduit x
2
. Lquation du haut intro-
duit x
1
. Plutt que de manipuler le systme dquations, on manipule la matrice (A, b) forme de
la matrice A des coefcients du systme, borde par le vecteur des seconds membres.
(A, b) =
_
_
2 1 4 2 0
2 2 3 4 0
4 1 8 1 1
_
_
La matrice (A

, b

) obtenue aprs pivot de Gauss :


(A

, b

) =
_
_
2 1 4 2 0
0 1 1 2 0
0 0 1 3 1
_
_
Le fait que chaque quation introduit au moins une inconnue se traduit par le fait que la diago-
nale principale est forme dlments non nuls (ce sont les pivots ) et que les lments sous les
pivots sont nuls. Remarque : on pourrait trs bien avoir une diagonale avec des dcrochements .
La variante de GaussJordan est un pivot de Gauss pouss au maximum o on impose que les
pivots soient gaux 1 et que tous les lments dune colonne contenant un pivot (sauf le pivot
bien sr) soient nuls. Voici le systme et la matrice (A

, b

) obtenus aprs pivot de GaussJordan :


_
_
_
x
1
+ 15/12 x
4
= 5/2
x
2
+ 5 x
4
= 1
x
3
3 x
4
= 1
(A

, b

) =
_
_
1 0 0 15/12 5/2
0 1 0 5 1
0 0 1 3 1
_
_
On peut maintenant dcrire lensemble des solutions du systme en servant de x
4
comme para-
mtre.
_

_
_
_
_
_
5/2 15/12 x
4
1 5 x
4
1 + 3 x
4
x
4
_
_
_
_
, x
4
R
_

_
Algorithme
On procde colonne par colonne. On commence la colonne 1. On cherche un lment non
nul (un pivot). On choisit A
1
1
= 2. On ajoute un multiple de la premire ligne chacune des lignes
qui suivent de faon faire apparatre des zros sous le pivot. On obtient
_
_
2 1 4 2 0
0 1 1 2 0
0 1 0 5 1
_
_
On passe la colonne 2. On cherche un lment non nul sur cette colonne qui ne soit pas sur la
mme ligne que le pivot prcdent (on veut en fait que sur la ligne du nouveau pivot il y ait un zro
10
au niveau de la premire colonne). On choisit le 1 sur la deuxime ligne. On ajoute un multiple de
la deuxime ligne la troisime de faon faire apparatre des zros sous le pivot.
_
_
2 1 4 2 0
0 1 1 2 0
0 0 1 3 1
_
_
Cest ni pour le pivot de Gauss. Pour obtenir un systme sous forme de GaussJordan, on peut
continuer comme suit. On ajoute un multiple de la troisime ligne aux deux qui prcdent pour
faire apparatre des zros sur la troisime colonne
_
_
2 1 0 10 4
0 1 0 5 1
0 0 1 3 1
_
_
On ajoute un multiple de la deuxime ligne la premire pour faire apparatre un zro sur la
deuxime colonne
_
_
2 0 0 15 5
0 1 0 5 1
0 0 1 3 1
_
_
On multiplie enn chaque ligne par un scalaire appropri pour que les pivots vaillent 1.
_
_
1 0 0 15/2 5/2
0 1 0 5 1
0 0 1 3 1
_
_
Dans le cas gnral, il peut arriver quon ne puisse pas trouver de pivot sur la colonne considre.
Dans ce cas, on passe la colonne suivante. Le rsultat du pivot de Gauss nest pas unique.
chaque tape, le choix du pivot inue sur les calculs et leur rsultat. Il y a pourtant des proprits
du systme qui ne dpendent pas du choix du pivot.
Proprits des systmes linaires
Soit (A, b) un systme et (A

, b

) un systme quivalent sous forme de Gauss ou de Gauss


Jordan. Le systme est sans solutions si et seulement sil y a un pivot dans la colonne b

. Le
systme a une unique solution si et seulement si toutes les colonnes sauf b

contiennent un pivot.
Le systme a une innit de solutions si et seulement si b

et au moins une colonne de A

ne
contiennent pas de pivot. Cest le cas de lexemple qui prcde (colonne x
4
). Dans ce cas, on
peut dcrire lensemble des solutions du systme en se servant des inconnues correspondant aux
colonnes sans pivots comme paramtres.
Proposition 3 Lalgorithme du pivot de Gauss ne change ni les bases ni le rang dune matrice.
Preuve Il suft de montrer que le pivot de Gauss ne change pas les bases dune matrice A =
(A
1
A
r
). Les arguments sont les suivants : dire que
1
A
1
+ +
r
A
r
= 0 cest dire que le
11
vecteur
t
(
1

r
) est solution du systme Ax = 0 ; le pivot de Gauss ne change pas les solutions
dun systme.
Corollaire : on peut lire le rang et une base dune matrice Asur la matrice A

obtenue aprs pivot


de Gauss : le rang est gal au nombre de pivots ; lensemble des indices des colonnes contenant un
pivot forme une base. Sur lexemple, on a trouv une base I = (1, 2, 3). Le rang du systme est
donc 3.
Proposition 4 Le rang dune matrice de type mn est infrieur ou gal au min(m, n).
Preuve Le rang de A est infrieur ou gal n (dnition). La proposition 3 implique que le rang
est infrieur ou gal m puisquil y a au plus un pivot par ligne de la matrice A

.
lments supplmentaires
Chacune des trois rgles de transformation mises en uvre par le pivot de Gauss revient
multiplier gauche la matrice (A, b) par une matrice inversible (la matrice est inversible parce que
la transformation quelle code est rversible) de type m m. Sur un systme de trois quations
par exemple, ajouter la premire ligne la deuxime revient multiplier gauche la matrice du
systme par la matrice
L
1
=
_
_
1 0 0
1 1 0
0 0 1
_
_
Soustraire deux fois la premire ligne la troisime revient multiplier gauche par la matrice
L
2
=
_
_
1 0 0
0 1 0
2 0 1
_
_
Soustraire la deuxime ligne la troisime revient multiplier gauche par la matrice
L
3
=
_
_
1 0 0
0 1 0
0 1 1
_
_
Par consquent
(A

, b

) = L
3
L
2
L
1
(A, b).
La matrice L = L
3
L
2
L
1
a pour inverse L
1
= L
1
1
L
1
2
L
1
3
.
Question 1. Quelles sont les matrices correspondant aux deux autres types de transformation ?
Cette constatation permet de dmontrer facilement que le pivot de Gauss ne change pas len-
semble des solutions dun systme. En effet (en notant 0 le vecteur colonne form de m zros),
Ax = 0 A

x = LAx = L0 = 0 ; A

x = 0 Ax = L
1
Ax = L
1
0 = 0.
12
1.3 La mthode des moindres carrs
Il sagit dune mthode doptimisation trs utilise : on minimise une somme de carrs. Elle
est due Legendre (1805) et Gauss (1801). Gauss la utilise ds 1801 pour calculer lorbite de
la plante Crs partir dobservations trs courtes [2]. Il existe aussi des mthodes pour mini-
miser le maximum des valeurs absolues (Euler) ou la somme des valeurs absolues (Laplace) des
carts. Cest la mthode des moindres carrs qui conduit aux calculs les plus agrables. On y op-
timise un critre non linaire. On verra dans les chapitres suivants que les deux autres problmes
doptimisation relvent de la programmation linaire.
1.3.1 La mthode
On considre un systme S de m quations linaires n inconnues x
1
, . . . , x
n
avec m > n
(il y a plus dquations que dinconnues, les inconnues sont les x
i
, les quantits a
ij
et b
i
sont
supposes connues).
S
_

_
x
1
a
11
+ + x
n
a
1n
= b
1
x
1
a
21
+ + x
n
a
2n
= b
2
.
.
.
x
1
a
m1
+ + x
n
a
mn
= b
m
Dans le cas gnral le systme S na aucune solution mais on peut chercher une solution appro-
che ( x
1
, . . . , x
n
) telle que la somme de carrs
e
2
1
+ + e
2
m
soit minimale o
e
i
=
def
x
1
a
i1
+ + x
n
a
in
b
i
, 1 i m
dsigne lcart entre la valeur b
i
donne et la valeur x
1
a
i1
+ + x
n
a
in
fournie par la solution
approche. On peut montrer que cette solution minimale existe et est unique. Matriciellement, S
scrit Ax = b cestdire
_
_
_
_
_
a
11
a
1n
a
21
a
2n
.
.
.
.
.
.
a
m1
a
mn
_
_
_
_
_
_
_
_
_
_
x
1
x
2
.
.
.
x
n
_
_
_
_
_
=
_
_
_
_
_
b
1
b
2
.
.
.
b
m
_
_
_
_
_
.
On multiplie gauche les deux membres de lgalit par la transpose
t
A de la matrice A cest
dire
_
_
_
a
11
a
21
a
m1
.
.
.
.
.
.
a
1n
a
2n
a
mn
_
_
_
On obtient un nouveau systme
t
AAx =
t
Ab de n quations n inconnues, appel systme
des quations normales . La matrice
t
AA des coefcients est symtrique. On peut montrer que la
13
solution de ce nouveau systme (qui peut sobtenir par pivot de Gauss par exemple) est la solution
approche ( x
1
, . . . , x
n
) dsire.
1.3.2 Exemple
On considre les sept points suivants dans le plan (x, y)
i 1 2 3 4 5 6 7
x
i
3 2 1 2 3 4 5
y
i
2 0.5 1 1 0 2 4
On suppose quils ont t mesurs par un certain procd et quen thorie, ils devraient tous appar-
tenir au graphe dune mme parabole, dont on cherche identier les coefcients , , :
y = f(x) = x
2
+ x + .
On cherche donc un triplet ( ,

, ) qui minimise la somme des carrs
e
2
1
+ + e
2
7
o les quantits
e
i
=
def
x
2
i
+

x
i
+ y
i
, 1 i 7
dsignent les carts entre les ordonnes y
i
mesures et les ordonnes f(x
i
) des points de la courbe
dabscisse x
i
. Attention : ce sont les valeurs x
i
et y
i
qui sont connues et les valeurs , et qui ne
le sont pas. Le systme surdtermin est le systme Ax = b suivant. Les colonnes de la matrice A
sont dans lordre, le vecteur des x
2
i
, le vecteur des x
i
et un vecteur de 1. Le vecteur b est le vecteur
des y
i
.
A =
_
_
_
_
_
_
_
_
_
_
9 3 1
4 2 1
1 1 1
4 2 1
9 3 1
16 4 1
25 5 1
_
_
_
_
_
_
_
_
_
_
, x =
_
_

_
_
, b =
_
_
_
_
_
_
_
_
_
_
2
0.5
1
1
0
2
4
_
_
_
_
_
_
_
_
_
_
.
En multipliant les deux membres de lquation Ax = b par la matrice transpose de A, on obtient
le systme carr
t
AAx =
t
Ab suivant.
t
AA =
_
_
1076 190 68
190 68 10
68 10 7
_
_
,
t
Ab =
_
_
147
18
6.5
_
_
.
En rsolvant ce systme, on obtient les coefcients de la parabole :
_
_

_
_
=
_
_
0.26988
1.2584
.30431
_
_
.
14
-2
-1
0
1
2
3
4
-3 -2 -1 0 1 2 3 4 5
f(x)

15
Chapitre 2
La programmation linaire
Dans lexpression programmation linaire le mot programmation signie planication
de tches, dactivits . Cet usage date des annes 1940. Ce nest que plus rcemment que le mot
a pris un tout autre sens, au moins chez les informaticiens. Ladjectif linaire signie que les
contraintes et les objectifs atteindre sont modliss par des expressions linaires en les variables
du problme. Ce chapitre est une introduction la modlisation de problmes par des programmes
linaires ainsi quune introduction au logiciel AMPL, dont une version gratuite est accessible sur
le site [5].
2.1 Un exemple dacirie
2.1.1 Modlisation mathmatique
Une acirie produit des bandes et des rouleaux mtalliques. Elle fonctionne 40 heures par
semaine. Les vitesses de production sont de 200 bandes par heure et de 140 rouleaux par heure.
Les bandes sont vendues 25 euros lunit ; les rouleaux 30 euros lunit. Le march est limit : il
est impossible de vendre plus de 6000 bandes et 4000 rouleaux par semaine. Comment maximiser
le prot ? Pour modliser, on dgage
1. les variables (ce quon cherche calculer),
2. les paramtres (les donnes numriques prsentes dans lnonc ou qui se calculent facile-
ment partir de ces dernires),
3. les contraintes,
4. lobjectif (il ny en a quun).
Les variables et les paramtres ont des dimensions quil est important de prciser. Il faut aussi
dterminer quel ensemble appartiennent les variables (en gnral R ou N). chaque contrainte,
il est souhaitable dassocier un commentaire (parfois un simple motclef). Sur lexemple, les va-
riables sont
1. x
1
le nombre de bandes produire
2. x
2
le nombre de rouleaux produire
16
On choisit de chercher des valeurs x
1
, x
2
R (mais cest discutable). Lobjectif consiste maxi-
miser 25 x
1
+ 30 x
2
euros. Les paramtres 25 et 30 ont la dimension deuros par unit de produit.
Les valeurs numriques qui gurent dans les contraintes sont aussi des paramtres. Mathmatique-
ment, le programme linaire scrit :
25 x
1
+ 30 x
2
= z[max]
x
1
6000 (limitation de march : bandes)
x
2
4000 (limitation de march : rouleaux)
(1/200) x
1
+ (1/140) x
2
40 (limitation de la production)
x
1
, x
2
0
Ce programme linaire en deux variables peut se rsoudre graphiquement.
x
1
x
2
2000
4000
6000
2000 4000 6000 8000
x
2
4000
x
1
6000
(1/200)x
1
+ (1/140)x
2
40
25x
1
+ 30x
2
= 0 25x
1
+ 30x
2
= 100000 25x
1
+ 30x
2
= 192000
Rsolution graphique du modle lmentaire dacirie
2.1.2 Premire rsolution en AMPL
Le logiciel AMPL a t conu et ralis par Fourer, Gay et Kernighan (lun des inventeurs
du langage C). Il est constitu dun logiciel dinterface qui dlgue les calculs des solveurs
externes (minos, cplex, . . .). Dans ce cours, on sappuie sur une version bride gratuite. Linterface
est en mode texte. On effectue ici les calculs interactivement via linterprteur. Le solveur utilis
sappelle minos . La solution trouve est assez vidente : chaque heure passe produire des
17
bandes rapporte 200 25 = 5000 euros ; chaque heure passe produire des rouleaux rapporte
140 30 = 4200 euros. La solution optimale consiste donc produire des bandes au maximum.
ampl: var x1 >= 0;
ampl: var x2 >= 0;
ampl: maximize z : 25
*
x1 + 30
*
x2;
ampl: subject to bandes : x1 <= 6000;
ampl: subject to rouleaux : x2 <= 4000;
ampl: subject to production : (1/200)
*
x1 + (1/140)
*
x2 <= 40;
ampl: solve;
MINOS 5.5: optimal solution found.
2 iterations, objective 192000
ampl: display z, x1, x2;
z = 192000
x1 = 6000
x2 = 1400
2.1.3 Premire modlisation en AMPL
On essaie dabstraire au maximum le modle. En particulier, on spare le modle des donnes
numriques. Pour cela, on dgage de lnonc du problme des ensembles . Ce sont ce par quoi
les paramtres, les variables et les contraintes seront indices. Pour un informaticien, les ensembles
sont un peu lanalogue des types numrs des langages de programmation classiques. Ici il y
en a un : lensemble des produits fabriqus par lacirie.
set PROD;
param heures_ouvrees >= 0;
param vitesse_production {PROD} >= 0;
param prix_vente {PROD} >= 0;
param vente_max {PROD} >= 0;
var qte_produite {p in PROD} >= 0, <= vente_max [p];
maximize profit :
sum {p in PROD} qte_produite [p]
*
prix_vente [p];
subject to production_limitee :
sum {p in PROD}
(qte_produite [p] / vitesse_production [p]) <= heures_ouvrees;
data;
set PROD := bandes rouleaux;
param heures_ouvrees := 40;
param: vitesse_production prix_vente vente_max :=
bandes 200 25 6000
rouleaux 140 30 4000;
Rsolution avec AMPL. Accols aux variables, les sufxes lb et ub (pour lower bound
et upper bound) en dsignent les bornes infrieures et suprieures.
ampl: model acierie1;
ampl: solve;
18
MINOS 5.5: optimal solution found.
2 iterations, objective 192000
ampl: display qte_produite.lb, qte_produite, qte_produite.ub;
: qte_produite.lb qte_produite qte_produite.ub :=
bandes 0 6000 6000
rouleaux 0 1400 4000
2.1.4 Ajout dun produit
Cette faon de modliser est non seulement plus lisible mais plus facile faire voluer. Suppo-
sons quon souhaite ajouter un produit supplmentaire lensemble des produits fabriqus. Il suft
de modier les donnes. Le modle abstrait ne change pas.
data;
set PROD := bandes rouleaux poutres;
param heures_ouvrees := 40;
param: vitesse_production prix_vente vente_max :=
bandes 200 25 6000
rouleaux 140 30 4000
poutres 160 29 3500;
On rsout.
ampl: model acierie2;
ampl: solve;
MINOS 5.5: optimal solution found.
2 iterations, objective 196400
ampl: display qte_produite.lb, qte_produite, qte_produite.ub;
: qte_produite.lb qte_produite qte_produite.ub :=
bandes 0 6000 6000
poutres 0 1600 3500
rouleaux 0 0 4000
2.1.5 Un bricolage
Le prot a augment mais on saperoit que la solution optimale consiste ne plus produire de
rouleaux du tout. Ce nest pas trs raliste. Il serait trs difcile de modliser mathmatiquement
le fait quune acirie ne peut pas abandonner purement et simplement un march. On vite alors
la solution irraliste par un bricolage : on impose une vente minimale pour chaque produit. Le
programme linaire ainsi obtenu mlange des ingalits dans les deux sens.
set PROD;
param heures_ouvrees >= 0;
param vitesse_production {PROD} >= 0;
param prix_vente {PROD} >= 0;
param vente_max {PROD} >= 0;
param vente_min {PROD} >= 0;
19
var qte_produite {p in PROD} >= vente_min [p], <= vente_max [p];
maximize profit :
sum {p in PROD} qte_produite [p]
*
prix_vente [p];
subject to production_limitee :
sum {p in PROD}
(qte_produite [p] / vitesse_production [p]) <= heures_ouvrees;
data;
set PROD := bandes rouleaux poutres;
param heures_ouvrees := 40;
param: vitesse_production prix_vente vente_max vente_min :=
bandes 200 25 6000 1000
rouleaux 140 30 4000 500
poutres 160 29 3500 750;
On rsout
ampl: model acierie3;
ampl: solve;
MINOS 5.5: optimal solution found.
2 iterations, objective 194828.5714
ampl: display qte_produite.lb, qte_produite, qte_produite.ub;
: qte_produite.lb qte_produite qte_produite.ub :=
bandes 1000 6000 6000
poutres 750 1028.57 3500
rouleaux 500 500 4000
2.1.6 Une digression : rsolution en nombres entiers
On voit que le nombre de poutres produites nest pas un entier. Essayons de rsoudre le pro-
blme en imposant que les variables soient entires. Il suft pour cela dadjoindre le qualicatif
integer aux variables et dutiliser le solveur cplex. Le solveur minos ne permet pas la rsolution
de programmes linaires en nombres entiers qui fait appel dautres algorithmes que la rsolution
de problmes en nombres rels. On remarque au passage que la solution optimale de ce nouveau
problme ne sobtient pas en tronquant purement et simplement la solution optimale prcdente.
...
var qte_produite {p in PROD} integer >= vente_min [p], <= vente_max [p];
...
On rsout.
ampl: model acierie3_bis;
ampl: option solver cplex;
ampl: solve;
CPLEX 8.0.0: optimal integer solution within mipgap or absmipgap;
objective 194818
1 MIP simplex iterations
0 branch-and-bound nodes
20
ampl: display qte_produite.lb, qte_produite, qte_produite.ub;
: qte_produite.lb qte_produite qte_produite.ub :=
bandes 1000 5999 6000
poutres 750 1027 3500
rouleaux 500 502 4000
2.1.7 Planication sur plusieurs semaines
Revenons aux programmes en nombres rels. On souhaite planier lactivit de lacirie sur
N = 3 semaines. Le prix de vente et le nombre dheures ouvres varient avec les semaines.
Lacirie peut dcider de stocker une partie de sa production dune semaine sur lautre mais elle
ne dispose que dune capacit limite de stockage : 1000 units de produits au maximum. Le stock
initial est vide. On impose que le stock nal le soit aussi. On introduit alors un ensemble SEMS
de semaines : un intervalle (cestdire un ensemble dentiers conscutifs). Les prix de vente et
les quantits produites sont maintenant indics la fois par les produits et par les semaines. La
contrainte sur la capacit de production est maintenant indice par les semaines : il y a en fait
autant de contraintes que de semaines. On prouve le besoin daffecter des variables diffrentes
les quantits produites, les quantits vendues et les quantits disponibles en stock en dbut de
semaine. Une contrainte dgalit apparat, qui exprime les relations qui lient toutes ces variables :
ce qui est produit au cours de la semaine s plus ce qui est disponible en stock au dbut de la
semaine s est gal ce qui est vendu au cours de la semaine s plus ce qui est disponible en
dbut de semaine suivante. En fait, cette contrainte est indice par les semaines et les produits :
il ne sagit pas dune mais de 3 N contraintes. Remarquer quil faut tre trs prcis sur le sens
de la variable qte_stock. La relation dquilibre nest pas la mme suivant quelle reprsente les
quantits disponibles en dbut de semaine ou les quantits mises en stock en n de semaine. Des
contraintes dgalits sont utilises pour exprimer le fait que les stocks initiaux et naux sont vides.
Ces contraintes vont se comporter en fait comme des affectations.
set PROD;
param vitesse_production {PROD} >= 0;
param vente_min {PROD} >= 0;
param vente_max {PROD} >= 0;
param N integer >= 0;
set SEMS := 1 .. N;
param heures_ouvrees {SEMS} >= 0;
param prix_vente {SEMS, PROD} >= 0;
param stock_max >= 0;
var qte_produite {SEMS, PROD} >= 0;
var qte_vendue {s in SEMS, p in PROD} >= vente_min [p], <= vente_max [p];
var qte_stock {1 .. N+1, PROD} >= 0;
maximize profit :
sum {s in SEMS, p in PROD} qte_vendue [s, p]
*
prix_vente [s, p];
subject to production_limitee {s in SEMS} :
sum {p in PROD}
(qte_produite [s, p] / vitesse_production [p]) <= heures_ouvrees [s];
21
subject to stock_initial {p in PROD} :
qte_stock [1, p] = 0;
subject to stock_final {p in PROD} :
qte_stock [N+1, p] = 0;
subject to equilibre {s in SEMS, p in PROD} :
qte_stock [s, p] + qte_produite [s, p] =
qte_stock [s+1, p] + qte_vendue [s, p];
data;
set PROD := bandes rouleaux poutres;
param: vitesse_production vente_max vente_min :=
bandes 200 6000 1000
rouleaux 140 4000 500
poutres 160 3500 750;
param heures_ouvrees :=
1 40
2 20
3 35;
param N := 3;
param stock_max := 1000;
param prix_vente:
bandes rouleaux poutres :=
1 25 30 29
2 27 30 28
3 29 30 20;
On rsout. Remarquer la faon dont le logiciel afche les contenus de variables diffrentes
indices de la mme faon. La solution optimale trouve nest plus vidente du tout.
ampl: model acierie4;
ampl: solve;
ampl: display qte_produite, qte_stock, qte_vendue;
: qte_produite qte_stock qte_vendue :=
1 bandes 4044.64 0 2044.64
1 poutres 1500 0 750
1 rouleaux 1456.25 0 500
2 bandes 4000 2000 6000
2 poutres 0 750 750
2 rouleaux 0 956.25 500
3 bandes 6000 0 6000
3 poutres 750 0 750
3 rouleaux 43.75 456.25 500
4 bandes . 0 .
4 poutres . 0 .
4 rouleaux . 0 .
22
2.2 Sensibilit par rapport de petites perturbations
Revenons au premier modle dacirie. Aprs rsolution, on peut aussi sintresser une
contrainte. Prenons lexemple de production_limitee. La valeur du corps de la contrainte (cest
dire la somme en partie gauche de lingalit) en la solution optimale sobtient en accolant le
sufxe body lidenticateur de la contrainte. Les sufxes lb et ub dsignent les
bornes infrieures et suprieures du corps de la contrainte. Les champs body et ub ont
mme valeur : on voit que la contrainte est active. Remarquer que le logiciel AMPL donne
comme borne infrieure au lieu de zro. Cela tient au fait que le modle ne comporte pas de borne
infrieure explicite pour la contrainte.
ampl: model acierie1;
ampl: solve;
MINOS 5.5: optimal solution found.
2 iterations, objective 192000
ampl: display production_limitee.body, production_limitee.ub;
production_limitee.body = 40
production_limitee.ub = 40
ampl: display production_limitee.lb;
production_limitee.lb = -Infinity
2.2.1 Valeur marginale dune contrainte
Si on oublie daccoler le sufxe body lidenticateur de la contrainte, on obtient une toute
autre valeur :
ampl: display production_limitee;
production_limitee = 4200
Sans ce sufxe, la valeur fournie par AMPL est ce quon appelle la valeur marginale (ou
shadow price) de la contrainte. Son sens est le suivant : si on augmente la valeur de la borne
dune petite quantit alors lobjectif ralis en la solution optimale augmente de 4200 . Sur
lexemple = 1 est sufsamment petit. On voit que si lacirie fonctionne une heure de plus par
semaine, lobjectif ralis passe de 192000 192000 + 4200 = 196200 euros.
ampl: let heures_ouvrees := 41;
ampl: solve;
MINOS 5.5: optimal solution found.
1 iterations, objective 196200
ampl: display production_limitee.body, production_limitee.ub;
production_limitee.body = 41
production_limitee.ub = 41
Attention : une contrainte a gnralement deux bornes (une infrieure et une suprieure). La
valeur marginale de la contrainte sapplique la borne la plus proche de la valeur de la contrainte.
La valeur marginale dune contrainte na de sens que pour les programmes linaires en variables
relles. On approfondira cette notion ultrieurement.
23
2.2.2 Cot rduit dune variable
Le cot rduit dune variable est une notion analogue celle de la valeur marginale dune
contrainte. Cette notion sapplique dans le cas des contraintes anonymes imposes certaines
variables lors de leur dclaration. Exemple de la variable qte_produite, borne par le paramtre
vente_max. Le cot rduit sobtient en accolant le sufxe rc (ou reduced cost) lidenticateur
de la variable.
ampl: reset;
ampl: model acierie1;
ampl: solve;
MINOS 5.5: optimal solution found.
2 iterations, objective 192000
ampl: display qte_produite.rc;
qte_produite.rc [
*
] :=
bandes 4
rouleaux 7.10543e-15
Son sens est le suivant : si on augmente dune petite quantit la vente maximale de
bandes, le prot ralis en la solution optimale augmente de 4 . Si par contre on augmente la
vente maximale de rouleaux, le prot nest pas modi. Cest normal : cette dernire contrainte est
inactive.
ampl: let vente_max ["bandes"] := 6001;
ampl: solve;
MINOS 5.5: optimal solution found.
1 iterations, objective 192004
Attention : une variable a gnralement deux bornes (une infrieure et une suprieure). Le cot
rduit de la variable sapplique la borne la plus proche de la valeur de la variable. Le cot rduit
dune variable na lui aussi de sens que pour les programmes linaires en variables relles.
2.3 Comment un programme linaire peut devenir gros
Les programmes linaires cidessus sont petits. On rencontre souvent des programmes linaires
comportant des milliers de variables et de contraintes. Comment un programme linaire peutil
devenir aussi gros ? On pourrait imaginer quon les obtient comme les programmes linaires ci
dessus mais en ajoutant un grand nombre de donnes et en tenant compte dun grand nombre
de dtails. En fait non. Comme on la vu dans lun des modles dacirie, la modlisation dun
problme nest pas une construction trs rigoureuse (penser la production minimale impose
pour viter une solution irraliste). Compliquer considrablement de tels modles na donc pas
vraiment de sens. Et mme dans des domaines o une modlisation rigoureuse peut tre faite, une
multiplication de dtails rend le modle difcile comprendre : un modle est une sorte de carte
routire ; un modle trs prcis est aussi utile quune carte au 1/1. En fait, les gros programmes
linaires sont souvent le rsultat de la combinaison de petits programmes. Le dernier modle de la
24
section prcdente fournit un exemple. Dans ce modle, en notant N le nombre de semaines et P
le nombre de produits, on obtient 3 N P variables et N P +2 P +N contraintes. Avec 10 produits
et 10 semaines, ce qui est peu, on a dj 300 variables. Le modle peut encore se compliquer.
On peut imaginer que les produits sont fabriqus dans plusieurs aciries, quil y a un problme
de gestion de production dans chaque acirie. Cela nest pas bien gnant parce quon peut alors
rsoudre sparment les problmes de chaque acirie. Mais sil faut aussi grer des moyens de
transports communs toutes les aciries pour amener les produits leur destination, on se retrouve
ncessairement confront un seul, gros, programme linaire.
2.4 Nommer des quantits intermdiaires
Il est souvent utile de nommer certaines des quantits qui apparaissent dans les programmes
linaires en les stockant dans des variables auxiliaires. Il est alors plus facile de vrier le modle
lexcution : on peut consulter les valeurs de ces variables et vrier quelles sont senses. Cela
peut aussi parfois raccourcir lcriture du programme. Dans le dernier modle de gestion dacirie,
il peut tre intressant de dclarer des variables supplmentaires pour stocker les prots de chaque
semaine.
...
var profit_hebdomadaire {SEMS} >= 0;
maximize profit : sum {s in SEMS} profit_hebdomadaire [s];
subject to calcul_profit_hebdomadaire {s in SEMS} :
profit_hebdomadaire [s] =
sum {p in PROD} qte_vendue [s, p]
*
prix_vente [s, p];
...
2.5 Linarit des contraintes
Le logiciel AMPL et les solveurs associs ne permettent de rsoudre que des programmes
dont les contraintes et lobjectif sont linaires ( de petites exceptions prs). Dans une expression
linaire on a le droit des sommes de constantes, de variables et de constantes multiplies par des
variables. On a le droit de multiplier ou de diviser des constantes entre elles mais le produit ou le
rapport de deux variables est interdit. Dans une expression linaire on a le droit des instructions if,
max, abs etc . . . mais lexpression boolenne du if ou les oprandes de max, abs etc . . . ne doivent
contenir que des expressions constantes. Pour viter dengendrer des non linarits, il est conseill
dutiliser des paramtres calculs la place de variables chaque fois que cest possible.
2.5.1 Paramtres calculs
Supposons quon veuille calculer le taux hebdomadaire doccupation du march cestdire,
pour chaque semaine s, la quantit totale de produits vendus divise par la quantit totale de pro-
duits vendables. On peut crire :
25
...
var taux_occupation_marche {SEMS} >= 0;
...
subject to calcul_taux_occupation_marche {s in SEMS} :
taux_occupation_marche [s] =
(sum {p in PROD} qte_vendue [s, p]) / (sum {p in PROD} vente_max [p]);
Lexpression ntant pas tellement lisible, on est tent dappliquer la technique recommande pr-
cdemment et daffecter une variable auxiliaire la quantit totale de produits vendables. Ce nest
malheureusement pas possible parce que le programme linaire ainsi obtenu nest plus linaire :
...
var vente_totale_max >= 0;
var taux_occupation_marche {SEMS} >= 0;
...
subject to calcul_vente_totale_max :
vente_totale_max = sum {p in PROD} vente_max [p];
# Contrainte NON LINEAIRE !!!
subject to calcul_taux_occupation_marche {s in SEMS} :
taux_occupation_marche [s] =
(sum {p in PROD} qte_vendue [s, p]) / vente_totale_max;
Une solution consiste faire de la quantit totale de produits vendables un paramtre et non plus
une variable. On vite ainsi la non linarit :
...
param vente_totale_max := sum {p in PROD} vente_max [p];
var taux_occupation_marche {SEMS} >= 0;
...
subject to calcul_taux_occupation_marche {s in SEMS} :
taux_occupation_marche [s] =
(sum {p in PROD} qte_vendue [s, p]) / vente_totale_max;
2.5.2 Expressions conditionnelles
Dans le dernier modle dacirie, on avait indic la variable qte_stock de 1 N + 1 et pas de 1
N comme les autres variables en raison de la formulation de la contrainte dquilibre.
...
var qte_stock {1 .. N+1, PROD} >= 0;
...
subject to stock_initial {p in PROD} :
qte_stock [1, p] = 0;
subject to stock_final {p in PROD} :
qte_stock [N+1, p] = 0;
subject to equilibre {s in SEMS, p in PROD} :
qte_stock [s, p] + qte_produite [s, p] =
qte_stock [s+1, p] + qte_vendue [s, p];
26
Une solution plus conome en nombre de variables (mais pas forcment plus lisible) consiste
traiter part la dernire semaine. On peut pour cela utiliser des expressions conditionnelles. Le
programme reste linaire parce que dans lexpression boolenne du if ne gurent que des
constantes.
...
var qte_stock {SEMS, PROD} >= 0;
...
subject to stock_initial {p in PROD} :
qte_stock [1, p] = 0;
subject to equilibre {s in SEMS, p in PROD} :
qte_stock [s, p] + qte_produite [s, p] =
if s = N then
qte_vendue [s, p]
else
qte_stock [s+1, p] + qte_vendue [s, p]);
...
On rsout.
ampl: model acierie8;
ampl: solve;
MINOS 5.5: optimal solution found.
7 iterations, objective 489866.0714
ampl: display qte_produite, qte_stock, qte_vendue;
: qte_produite qte_stock qte_vendue :=
1 bandes 4044.64 0 2044.64
1 poutres 1500 0 750
1 rouleaux 1456.25 0 500
2 bandes 4000 2000 6000
2 poutres 0 750 750
2 rouleaux 0 956.25 500
3 bandes 6000 0 6000
3 poutres 750 0 750
3 rouleaux 43.75 456.25 500
On pourrait aussi viter la contrainte sur le stock initial en utilisant une deuxime expression
conditionnelle dans la contrainte dquilibre mais ce nest pas souhaitable : cela rend le programme
linaire encore moins lisible sans conomiser davantage de variables.
2.6 Autres problmes classiques
2.6.1 Minimiser une somme de valeurs absolues
On suppose que les variables x
k
contiennent des nombres positifs ou ngatifs. On souhaite
minimiser la somme des valeurs absolues des x
k
. La solution qui vient immdiatement lesprit
fournit un programme non linaire. Il ne peut pas tre rsolu par les solveurs minos ou cplex.
27
set INDICES;
var x {INDICES};
# objectif NON LINEAIRE !!!
minimize somme_vabs :
sum {k in INDICES} abs (x [k]);
Il existe une solution astucieuse. Tout rel x
k
peut tre vu comme la diffrence z
k
t
k
de deux
rels positifs ou nuls. Minimiser la valeur absolue de x
k
quivaut minimiser la somme z
k
+ t
k
.
set INDICES;
var x {INDICES};
var z {INDICES} >= 0;
var t {INDICES} >= 0;
subject to changement_de_variable {k in INDICES} :
x [k] = z [k] - t [k];
minimize somme_vabs :
sum {k in INDICES} z [k] + t [k];
2.6.2 Minimiser un maximum en valeur absolue
Il suft de procder ainsi ;
set INDICES;
var x {INDICES};
var borne >= 0;
subject to borne_inf {k in INDICES} : - borne <= x [k];
subject to borne_sup {k in INDICES} : x [k] <= borne;
minimise max_vabs : borne;
2.7 Variables entires et binaires
Par dfaut, les variables AMPL sont de type rel (ou plutt ottant). On peut imposer le type
entier ou binaire au moyen des qualicatifs integer et binary. Noter que pour AMPL, une variable
binaire nest rien dautre quune variable integer comprise entre zro ou un. La rsolution dun pro-
gramme linaire en nombres entiers est beaucoup plus difcile que la rsolution dun programme
de mme taille en nombres rels. Par consquent, autant que possible, il vaut mieux viter ce type
de variable.
2.7.1 Le solveur utiliser : cplex
Le solveur par dfaut, minos, ne rsout pas les programmes linaires en nombres entiers. Il faut
demander AMPL dutiliser le solveur cplex. Ce quon peut faire avec la commande :
ampl: option solver cplex;
28
2.7.2 Modlisation dun ou
Supposons quon dispose de deux variables binaires b et c et quon souhaite affecter une
variable a (non ncessairement binaire, ce qui peut tre utile) la valeur a = b ou c. Comme aucun
des solveurs minos et cplex ne permet de manipuler de contraintes logiques, il faut ruser. On peut
par exemple imposer :
0 a 1, a b, a c, b + c a.
Si a est de type binaire, la premire contrainte est inutile.
# fichier ou
var a >= 0, <= 1;
var b binary;
var c binary;
subject to ou_1 : a >= b;
subject to ou_2 : a >= c;
subject to ou_3 : b + c >= a;
Voici des exemples dexcution. On observe que si on oublie de demander lutilisation de cplex,
on obtient un avertissement de minos et une solution aberrante.
ampl: model ou;
ampl: let b := 1;
ampl: let c := 1;
ampl: solve;
MINOS 5.5: ignoring integrality of 2 variables
MINOS 5.5: optimal solution found.
0 iterations, objective 0
Objective = find a feasible point.
ampl: display a;
a = 0
ampl: option solver cplex;
ampl: solve;
CPLEX 8.0.0: optimal integer solution; objective 0
0 MIP simplex iterations
0 branch-and-bound nodes
Objective = find a feasible point.
ampl: display a;
a = 1
ampl: let b := 0;
ampl: let c := 0;
ampl: solve;
CPLEX 8.0.0: optimal integer solution; objective 0
0 MIP simplex iterations
0 branch-and-bound nodes
Objective = find a feasible point.
ampl: display a;
a = 0
29
On peut parfois se passer de certaines contraintes. Si par exemple lobjectif est de maximiser a
(ou a multipli par une constante positive) alors les deux contraintes
a b, a c
qui contraignent la valeur infrieure de a sont superues. Inversement, si lobjectif est de minimi-
ser a, cest de la contrainte suivante quon peut se passer.
b + c a
2.7.3 Modlisation dun et
Supposons quon dispose de deux variables binaires b et c et quon souhaite affecter une
variable a (non ncessairement binaire) la valeur a = b et c. Il suft de poser
0 a 1, a b, a c, a b + c 1.
Comme dans le cas du ou la nature de lobjectif permet de se passer parfois de certaines
contraintes.
30
Chapitre 3
Le simplexe
Il permet de rsoudre des programmes linaires en nombres rels uniquement. Bien que sa
complexit dans le pire des cas soit assez mauvaise, il se comporte trs bien sur les programmes
linaires issus de vrais problmes et souvent bien mieux que des algorithmes concurrents de
meilleure complexit dans le pire des cas ! Il a t invent par George Dantzig en 1947.
FIGURE 3.1 George Bernard Dantzig (19142005).
On va prsenter lalgorithme de Dantzig sur lexemple suivant.
Un boulanger veut produire des rouleaux de pte brise (prix de vente : 4 euros le rouleau) et
des rouleaux de pte feuillete (prix de vente : 5 euros le rouleau). La production dun rouleau de
pte brise ncessite 2 kilos de farine et 1 kilo de beurre. Celle dun rouleau de pte feuillete 1
kilo de farine, 2 kilos de beurre et 1 kilo de sel (sale, la pte). Comment maximiser les bnces
sachant quil dispose dun stock de 8000 kilos de farine, 7000 kilos de beurre et 3000 kilos de sel ?
31
On a affaire un programme linaire en deux variables :
1. x
1
le nombre de milliers de rouleaux de pte brise produire
2. x
2
le nombre de milliers de rouleaux de pte feuillete produire
Mathmatiquement, le programme linaire scrit :
4000 x
1
+ 5000 x
2
= z[max]
2 x
1
+ x
2
8 (farine)
x
1
+ 2 x
2
7 (beurre)
x
2
3 (sel)
x
1
, x
2
0 (x
1
, x
2
R)
3.1 Vocabulaire
On cherche soit maximiser soit minimiser une fonction linaire z = f
1
x
1
+ + f
n
x
n
o
x est un vecteur de R
n
qui appartient un domaine D dcrit par des contraintes linaires (galits,
ingalits larges). Exemple
_

_
A
1
i
x
1
+ A
2
i
x
2
+ + A
n
i
x
n
= a
i
(1 i p)
B
1
j
x
1
+ B
2
j
x
2
+ + B
n
j
x
n
b
j
(1 j q)
C
1
k
x
1
+ C
2
k
x
2
+ + C
n
k
x
n
c
k
(1 k r)
x
1
, . . . , x
s
0
x
s+1
, . . . , x
t
0
x
t+1
, . . . , x
n
non astreintes de signe
Le domaine D est le domaine des solutions ralisables. Un x D est une solution ralisable. Le
vecteur colonne f est lobjectif conomique, ses composantes f
i
sont les cots (mme sil sagit de
bnces). Remarquer que z =
t
f x. Soit x D une solution ralisable. Une contrainte dingalit
B
1
j
x
1
+ + B
n
j
x
n
b
j
est dite active si B
1
j
x
1
+ + B
n
j
x
n
= b
j
. Elle est dite inactive sinon.
criture matricielle :
_

_
t
f x = z[max] ou [min]
Ax = a
Bx b
C x c
x
1
, . . . , x
s
0
x
s+1
, . . . , x
t
0
Sur lexemple du boulanger on a :
B =
_
_
2 1
1 2
0 1
_
_
, b =
_
_
8
7
3
_
_
, x =
_
x
1
x
2
_
, f =
_
4000
5000
_
.
Les programmes linaires en deux variables peuvent se rsoudre graphiquement.
32
x
2
= 3
x
2
x
1
x
1
+ 2 x
2
= 7
2x
1
+ x
2
= 8
1 2 3 5 6 7
1
2
3
4
z = 4000 x
1
+ 5000 x
2
= 0
z[max] = 22000
1. Chaque contrainte dingalit est matrialise par une droite dlimitant deux demiplans.
On hachure le demiplan correspondant aux solutions non ralisables. Le domaine D des
solutions ralisables est un polygone (un polydre dans le cas gnral).
2. Soit k R un nombre rel. Lensemble des solutions ralisables pour lesquelles lobjectif
conomique vaut k est lintersection du polygone D avec la droite
t
f x = k.
Dnition 7 On appelle solution optimale toute solution ralisable pour laquelle lobjectif cono-
mique est optimal (maximal dans le cas dune maximisation ou minimal dans le cas dune minimi-
sation).
Proposition 5 Si elle existe, la solution optimale recherche est atteinte en (au moins) un sommet
du polygone D.
Elle pourrait ne pas exister : cas dun polygone ouvert ou dun polygone vide. Il se peut aussi
quil y ait une innit de solutions optimales : cas dune contrainte parallle aux droites de lob-
jectif.
3.2 Quelques programmes linaires particuliers
Dnition 8 Un programme linaire est dit sous forme canonique sil scrit
_
_
_
t
f x = z[max]
Bx b
x 0
ou
_
_
_
t
f x = z[min]
C x c
x 0
33
Lexemple du boulanger est sous forme canonique.
Dans un programme linaire sous forme canonique, toutes les ingalits sont dans le mme
sens, on ne trouve pas de contraintes dgalit et toutes les variables sont positives ou nulles.
Dnition 9 Un programme linaire est dit sous forme standard sil scrit
_
_
_
t
f x = z[max]
Ax = a
x 0
Dans un programme linaire sous forme standard, toutes les contraintes sont des galits (en
gnral avec beaucoup plus dinconnues que dquations).
Les versions algbriques de lalgorithme du simplexe commencent par transformer le pro-
gramme linaire traiter en un programme linaire quivalent sous forme standard.
Proposition 6 Tout programme linaire peut tre mis sous forme standard (resp. sous forme ca-
nonique).
Tout problme de minimisation est quivalent un problme de maximisation : maximiser
4000 x
1
+5000 x
2
quivaut minimiser 4000 x
1
5000 x
2
. Toute ingalit est quivalente une
ingalit en multipliant ses termes par 1. Par exemple, 2 x
1
+x
2
8 quivaut 2 x
1
x
2

8. Toute galit est quivalente deux ingalits : a = 0 quivaut au systme : a 0, a 0.
Toute ingalit peut tre transforme en une galit au moyen dune variable dcart . Prenons
la contrainte sur la farine dans lexemple du boulanger : 2 x
1
+x
2
8 quivaut 2 x
1
+x
2
+x
3
= 8
avec x
3
0. La variable dcart x
3
a une signication conomique : elle reprsente la quantit de
farine restant en stock. Toute ingalit peut tre transforme en une galit au moyen dune
variable dcart. Par exemple, 2 x
1
+ x
2
8 quivaut 2 x
1
+ x
2
x
3
= 8 avec x
3
0. Toute
variable non suppose positive ou nulle peut tre remplace par une ou deux variables supposes
positives ou nulles : une variable ngative ou nulle x
1
0 peut tre remplace par x
2
0 avec
x
2
= x
1
; une variable x
1
non astreinte de signe peut tre remplace par la diffrence x
2
x
3
de
deux variables x
2
, x
3
0.
Question 2. Mettre sous forme canonique et sous forme standard le programme linaire
_

_
2 x
1
3 x
2
= z [min]
2 x
1
x
3
5
x
1
+ x
2
= 8
x
1
, x
2
0
3.3 Lalgorithme du tableau simplicial
On commence par transformer le programme linaire traiter en un programme linaire qui-
valent sous forme standard. Il ne reste alors plus qu dterminer une solution optimale dun pro-
gramme linaire sous forme standard.
34
Lalgorithme du simplexe consiste se dplacer dun sommet du polydre en un autre sommet
du polydre tout en augmentant lobjectif conomique. Ce raisonnement est valable parce que le
polydre des solutions ralisables est convexe : il ny a pas de risque de se trouver coinc dans un
minimum local. La convexit dcoule du fait que les contraintes sont donnes par des expressions
linaires.
3.3.1 Dans un cas favorable
On part de lexemple du boulanger qui prsente lavantage dtre sous forme canonique avec
un vecteur de seconds membres positif ou nul. On le met sous forme standard en utilisant trois
variables dcart x
3
, x
4
et x
5
.
4000 x
1
+ 5000 x
2
= z [max]
2 x
1
+ x
2
+ x
3
= 8
x
1
+ 2 x
2
+ x
4
= 7
x
2
+ x
5
= 3
x
1
, . . . , x
5
0
ou dit autrement,
t
f x = z[max]
Ax = a
x 0
Initialisation
On commence par extraire de la matrice une base I qui soit ralisable et telle que le pro-
gramme linaire soit sous forme canonique par rapport elle . Comme on va le voir, la liste
I = (3, 4, 5) des indices des variables dcart fournit une telle base.
A =
_
_
2 1 1 0 0
1 2 0 1 0
0 1 0 0 1
_
_
.
Dnition 10 Soit I une base. Les variables dont les indices appartiennent I sont appeles
variables de base. Les autres sont appeles variables hors base.
Les variables de base sont ici les variables dcart x
3
, x
4
et x
5
.
Dnition 11 Un programme linaire sous forme standard est dit sous forme canonique par rap-
port une base I si la matrice A
I
est lidentit et les cots correspondant aux variables de base
sont nuls.
Le programme linaire de lexemple est sous forme canonique par rapport la base I.
Dnition 12 On suppose une base xe. On appelle solution de base la solution x du systme
Ax = a obtenue en posant les variables hors base gales zro.
35
La solution de base I est ici
x =
_
_
_
_
_
_
x
1
x
2
x
3
x
4
x
5
_
_
_
_
_
_
=
_
_
_
_
_
_
0
0
8
7
3
_
_
_
_
_
_
.
Dnition 13 Une base est dite ralisable si la solution de base qui lui correspond est ralisable.
La solution de base est par dnition une solution du systme Ax = a. Il ne reste plus qu
vrier la contrainte de positivit des variables, qui nest pas exprime par les quations. La base I
choisie dans lexemple est donc ralisable.
Proposition 7 Les valeurs des variables de base dans la solution de base se lisent dans le vec-
teur a.
Cest une consquence du fait que la matrice A
I
est lidentit.
On associe un sommet du polydre D chaque solution de base : on lobtient en supprimant,
dans la solution de base, les coordonnes correspondant aux variables introduites par la mise sous
forme standard. Dans notre cas, on supprime les coordonnes dindice 3, 4 et 5, qui correspondent
aux variables dcart. Sur lexemple, le sommet associ la solution de base I est lorigine x
1
=
x
2
= 0.
On dnit z
0
comme la constante pour laquelle la droite de lobjectif
t
f x = z
0
passe par le
sommet associ la solution de base x. Dit autrement,
Dnition 14 On dnit z
0
comme lobjectif conomique valu sur la solution de base : z
0
=
def
t
f x.
On forme un premier tableau simplicial partir du programme linaire et de la base I
choisie en bordant la matrice A droite avec le vecteur a, gauche avec le vecteur des variables
de base et endessous avec lobjectif. On place chaque variable de base sur la ligne o gure sa
valeur dans la solution de base. On initialise la case en bas droite z
0
. Comme la base initiale
est forme des variables dcart qui ne contribuent pas lobjectif on a z
0
= 0.
x
1
x
2
x
3
x
4
x
5
x
3
2 1 1 0 0 8
x
4
1 2 0 1 0 7
x
5
0 1 0 0 1 3
4000 5000 0 0 0 0
36
Invariants de boucle
Lalgorithme du tableau simplicial scrit schmatiquement ainsi :
former le premier tableau simplicial
tant que ce nest pas ni faire
former le tableau simplicial suivant (et changer de base)
fait
Dnition 15 Un invariant de boucle tant que est une proprit vraie chaque fois que la
condition du tant que est value.
Un invariant de boucle tant que doit donc tre vrai au dbut de la premire itration. Il doit
aussi tre vrai lorsque la boucle sarrte, cestdire lorsque la condition svalue en faux .
Combin la ngation de la condition, linvariant permet alors de dduire les proprits des va-
riables calcules par la boucle.
Proposition 8 (invariants de boucle)
Les proprits suivantes sont des invariants de litration principale de lalgorithme du tableau
simplicial :
1. Le programme linaire est sous forme canonique par rapport la base.
2. La base est ralisable (les lments de la dernire colonne sont positifs ou nuls).
3. Les variables de base sont listes sur la premire colonne.
4. La case en bas droite vaut z
0
.
Litration principale
Il sagit dun pivot de GaussJordan muni dune stratgie spciale pour choisir le pivot. Dans
ce paragraphe, on se contente dnoncer lalgorithme. On remarque que lalgorithme ne peut pas
conclure au fait que le programme linaire est sans solution ralisable. Ce casl est trait dans la
section intitule problmes de dmarrage .
Pour choisir la colonne s du pivot, on cherche sur la dernire ligne (objectif) le coefcient (le
cot) le plus grand.
Si ce cot est ngatif ou nul on sarrte : une solution optimale est trouve.
Sil est positif, la colonne du pivot est trouve.
Sur lexemple, la colonne du pivot est la colonne s = 2 (correspondant x
2
).
On cherche ensuite sil existe au moins un lment strictement positif sur la colonne du pivot
(on ne cherche pas sur la ligne de lobjectif).
Sil ny en a pas alors on sarrte : le problme nest pas born (il ny a pas de solution opti-
male).
Parmi toutes les lignes contenant un lment strictement positif, on choisit pour ligne du pivot
une ligne r telle que le rapport a
r
/A
s
r
est minimal.
37
Sur lexemple, on est amen comparer les rapports 8/1, 7/2 et 3/1. Le rapport minimal
est 3/1. La ligne du pivot est donc la ligne r = 3.
On applique une tape du pivot de GaussJordan : on multiplie la ligne r par linverse du pivot
(de telle sorte que le pivot devienne 1) et on ajoute un multiple de cette ligne toutes les autres
lignes (ligne dobjectif et dernire colonne incluses) de faon faire apparatre des zros sur la
colonne du pivot.
Enn on change de base en faisant sortir de la base la variable x
5
qui se trouve sur la ligne du
pivot dans le tableau simplicial et en la remplaant par la variable x
2
correspondant la colonne
du pivot. Sur lexemple, on obtient
x
1
x
2
x
3
x
4
x
5
x
3
2 0 1 0 1 5
x
4
1 0 0 1 2 1
x
2
0 1 0 0 1 3
4000 0 0 0 5000 15000
Et on recommence.
Proposition 9 Les invariants sont nouveau vris.
On vrie que le nouveau programme linaire est sous forme canonique par rapport I

. Au
passage, on remarque que lancienne base I est toujours une base (le pivot de Gauss ne change pas
les bases) mais que le nouveau programme linaire nest pas sous forme canonique par rapport
elle.
La solution de base I

obtenue en posant les variables hors base x


1
et x
5
gales zro est
x

=
_
_
_
_
_
_
x
1
x
2
x
3
x
4
x
5
_
_
_
_
_
_
=
_
_
_
_
_
_
0
3
5
1
0
_
_
_
_
_
_
.
Comme toutes ses coordonnes sont positives ou nulles, la base I

est ralisable. On voit aussi que


les valeurs des variables de base I

se lisent sur la colonne a

et que le rel en bas droite vaut bien


z

0
=
t
f x

= 4000 x
1
5000 x
2
= 15000.
Proposition 10 Le sommet associ la nouvelle base est adjacent au sommet associ lancienne.
Le sommet associ la nouvelle base est le sommet (x
1
, x
2
) = (0, 3). La droite parallle la
droite de lobjectif qui passe par ce sommet a pour quation 4000 x
1
+ 5000 x
2
= 15000.
Proposition 11 La valeur de z
0
a augment.
38
Quelques remarques
Le fait de choisir une colonne sur laquelle le cot est non nul fait que la variable qui entre en
base est bien une variable hors base (cf. le premier invariant).
Le choix de la colonne du pivot est heuristique. On peut en fait choisir nimporte quelle colonne
sur laquelle le cot est positif. Sur lexemple, on aurait pu faire entrer en base la variable x
1
. On
sinterdit de choisir une colonne sur laquelle le cot est ngatif pour ne pas faire diminuer lobjectif
ralis.
Le choix de la ligne nest pas heuristique. On voit sur lexemple que si on choisit une autre
ligne que celle donne par lalgorithme on obtient des nombres ngatifs sur la colonne des seconds
membres cestdire une base non ralisable.
Fin de lexemple
La colonne du pivot est la colonne s = 1 correspondant x
1
. La ligne du pivot est la ligne r =
2. La variable x
4
sort de la base. La variable x
1
y entre. Le programme linaire est sous forme
canonique par rapport la base I

= (3, 1, 2). La solution de base I

correspond au sommet
(x
1
, x
2
) = (1, 3).
x
1
x
2
x
3
x
4
x
5
x
3
0 0 1 2 3 3
x
1
1 0 0 1 2 1
x
2
0 1 0 0 1 3
0 0 0 4000 3000 19000
La colonne du pivot est la colonne s = 5 correspondant x
5
. La ligne du pivot est la ligne r = 1. La
variable x
3
sort de la base. La variable x
5
entre. Le programme linaire est sous forme canonique
par rapport la base I

= (5, 1, 2). La solution de base I

correspond la solution (x
1
, x
2
) =
(3, 2).
x
1
x
2
x
3
x
4
x
5
x
5
0 0 1/3 2/3 1 1
x
1
1 0 2/3 1/3 0 3
x
2
0 1 1/3 2/3 0 2
0 0 1000 2000 0 22000
Tous les cots sont ngatifs ou nuls (critre darrt de lalgorithme). La solution de base I

est
donc optimale. Lobjectif atteint pour cette solution est z

0
= 22000.
On vrie que les trois propositions nonces cidessus sont vries chaque itration.
Programme sous forme canonique associ un tableau simplicial
On a compris sur un exemple qu tout programme linaire sous forme canonique avec seconds
membres positifs ou nuls on pouvait associer un tableau simplicial satisfaisant les invariants. La
rciproque est vraie aussi.
Proposition 12 tout tableau simplicial satisfaisant les invariants il est possible dassocier un
programme linaire sous forme canonique avec seconds membres positifs ou nuls.
39
Il suft pour cela de traduire le tableau simplicial comme un programme linaire sous forme
standard puis dinterprter les variables de base comme des variables dcart. Considrons titre
dexemple le deuxime tableau simplicial obtenu partir de lexemple du boulanger :
x
1
x
2
x
3
x
4
x
5
x
3
2 0 1 0 1 5
x
4
1 0 0 1 2 1
x
2
0 1 0 0 1 3
4000 0 0 0 5000 15000
Ce tableau correspond au programme linaire sous forme standard
_

_
4000 x
1
5000 x
5
+ 15000 = z [max]
2 x
1
+ x
3
x
5
= 5
x
1
+ x
4
2 x
5
= 1
x
2
+ x
5
= 3
x
1
, . . . , x
5
0
Il sagit en fait du programme linaire obtenu en interprtant lquation x
2
+ x
5
= 3 comme la
rgle de substitution x
2
3x
5
et en lutilisant pour rcrire toutes les autres quations ainsi que
lobjectif conomique du programme initial. Interprtons maintenant les variables de base comme
des variables dcart. On obtient le programme linaire suivant :
_

_
4000 x
1
5000 x
5
+ 15000 = z [max]
2 x
1
x
5
5
x
1
2 x
5
1
x
5
3
x
1
, x
5
0
On remarque que cest bien le premier invariant qui rend cette transformation possible : chaque va-
riable choisie comme variable dcart apparait avec un coefcient 1 dans exactement une quation
et napparat pas dans lobjectif conomique. Do lexpression programme linaire sous forme
canonique par rapport une base .
La transformation est rversible : si on construit un premier tableau simplicial partir de ce
programme, on retrouve le tableau simplicial cidessus (au nommage des variables dcart prs).
Rsoudre ce programme linaire quivaut donc rsoudre lexemple du boulanger.
Problmes borns
Revenons au tableau simplicial :
x
1
x
2
x
3
x
4
x
5
x
3
2 0 1 0 1 5
x
4
1 0 0 1 2 1
x
2
0 1 0 0 1 3
4000 0 0 0 5000 15000
40
La solution ralisable courante est la solution de base
x

=
_
_
_
_
_
_
0
3
5
1
0
_
_
_
_
_
_
.
Lobjectif est de maximiser 4000 x
1
5000 x
5
+ 15000. On voit que les variables de base x
2
, x
3
et x
4
ont une valeur non nulle mais ne contribuent pas lobjectif (on ne perdrait rien diminuer
leur valeur) alors que la variable x
1
a une valeur nulle mais est associe un cot positif dans
lobjectif. On a tout intrt augmenter sa valeur. Il suft pour cela de la faire entrer en base. Par
un raisonnement similaire, on voit quon ne peut pas modier la valeur de x
5
sans faire diminuer
lobjectif. On en dduit que lorsque tous les cots sont ngatifs ou nuls, il est impossible de faire
entrer une variable en base sans faire diminuer lobjectif : on a atteint un maximum local et donc
le maximum global recherch puisque le polydre des solutions ralisables est convexe.
Les raisonnements tenus cidessus justient le critre darrt de lalgorithme dans le cas de
problmes borns.
Thorme 1 (condition sufsante doptimalit)
Considrons un programme linaire sous forme canonique par rapport une base ralisable I.
Si les cots correspondant aux variables hors base sont ngatifs ou nuls alors la solution de base I
est la solution optimale et lobjectif loptimum est z
0
.
Problmes non borns
Modions un peu le deuxime tableau simplicial de telle sorte que lalgorithme sarrte en
indiquant que le programme linaire est non born. Il suft de rendre ngatifs tous les coefcients
prsents sur la colonne du pivot.
x
1
x
2
x
3
x
4
x
5
x
3
2 0 1 0 1 5
x
4
1 0 0 1 2 1
x
2
0 1 0 0 1 3
4000 0 0 0 5000 15000
Considrons le programme linaire sous forme canonique associ ce tableau simplicial.
_

_
4000 x
1
5000 x
5
+ 15000 = z [max]
2 x
1
x
5
5
x
1
2 x
5
1
x
5
3
x
1
, x
5
0
41
Parce que tous les coefcients situs sur la colonne du pivot sont ngatifs, on voit quon peut
attribuer x
1
une valeur arbitrairement grande sans violer les contraintes. Parce que le cot associ
x
1
est positif, on voit quaugmenter la valeur de x
1
augmente lobjectif ralis.
On a donc bien affaire un programme linaire non born.
Thorme 2 (problme non born)
Considrons un programme linaire sous forme canonique par rapport une base ralisable I.
Sil existe un indice de colonne s tel que le cot f
s
soit positif et tous les coefcients de la colonne s
soient ngatifs ou nuls alors le programme linaire nest pas born.
Question 3. Appliquer lalgorithme sur lexemple suivant. Vrier quil sagit dun programme
linaire non born. Associer au tableau simplicial nal un programme linaire sous forme cano-
nique et refaire le raisonnement cidessus.
_

_
x
1
+ x
2
= z [max]
x
1
2x
2
2
2x
1
+ x
2
4
3x
1
+ x
2
6
x
1
, x
2
0
Question 4. Comment interprter le cas o tous les coefcients situs sur une colonne (y compris
le cot) sont ngatifs ?
Sommets multiples
Dans certains cas, il se peut que llment de la colonne des seconds membres situ sur la ligne
du pivot, a
r
, soit nul. Dans ce cas, la valeur de la variable de base x
s
dans la solution de base est
nulle et lobjectif ralis naugmente pas. Interprtation graphique. On passe dun sommet un
sommet adjacent sans dplacer la droite de lobjectif. Comme le polydre est convexe, les deux
sommets sont superposs : on a affaire un sommet multiple .
Les sommets multiples sont rares dans les petits programmes linaires crits avec un mini-
mum de contraintes et de variables (tels ceux quon rencontre dans les feuilles de TD). Ils appa-
raissent plus naturellement dans des modles plus volumineux lorsquon rajoute, par exemple, des
contraintes et des variables mathmatiquement inutiles qui servent nommer des quantits
intermdiaires et simplient lcriture des modles.
Question 5. Appliquer lalgorithme sur lexemple cidessous. On saperoit de la prsence dun
sommet multiple ds la premire itration : on a le choix entre deux indices de ligne pour le premier
pivot (clarier cette afrmation).
_

_
x
1
x
2
= z [max]
x
1
2x
2
2
2x
1
x
2
4
x
1
+ x
2
5
x
1
, x
2
0
42
Le problme de larrt
Dans le cas o lobjectif ralis augmente strictement chaque itration lalgorithme sarrte
ncessairement : des valeurs diffrentes de lobjectif ralis correspondent des sommets diffrents
du polydre D or D na quun nombre ni de sommets. Lalgorithme nest donc susceptible de
boucler que dans le cas o lobjectif ralis garde la mme valeur, cestdire dans le cas de
sommets multiples.
La stratgie adopte ne garantit pas larrt de lalgorithme.
Il se peut que lalgorithme numre cycliquement une srie de bases ralisables sans que lob-
jectif ralis change. Voici un exemple :
_

_
(3/4) x
1
20 x
2
+ (1/2) x
3
6 x
4
= z [max]
(1/4) x
1
8 x
2
x
3
+ 9 x
4
0
(1/2) x
1
12 x
2
(1/2) x
3
+ 3 x
4
0
x
3
1.
Aprs mise sous forme standard et ajout de trois variables dcart x
5
, x
6
et x
7
, on obtient un
premier tableau simplicial et une premire base (x
5
, x
6
, x
7
). En appliquant la stratgie que nous
avons nonce, on peut obtenir ( peut parce quon a parfois plusieurs choix possibles pour la
ligne) successivement les bases (x
1
, x
6
, x
7
), (x
1
, x
2
, x
7
), (x
3
, x
2
, x
7
), (x
3
, x
4
, x
7
), (x
5
, x
4
, x
7
)
et (x
5
, x
6
, x
7
). Le tableau simplicial obtenu la dernire tape est gal au premier tableau simpli-
cial. Lobjectif ralis en la solution de base a toujours gard la valeur z
0
= 0.
Thorme 3 (stratgie garantie)
La stratgie suivante de slection du pivot garantit larrt de lalgorithme.
1. choisir la colonne possible de plus petit indice (s est le plus petit indice i tel que f
i
> 0).
2. choisir la ligne possible de plus petit indice (prendre pour r le plus petit indice i tel que
A
s
r
> 0 et tel que la base obtenue aprs pivot soit ralisable).
Cette stratgie garantie est rarement utilise parce que, sur beaucoup de problmes pratiques,
elle ncessite beaucoup plus ditrations que la stratgie usuelle pour atteindre la solution optimale.
Une bonne mthode consiste appliquer la stratgie non garantie tout en conservant un petit histo-
rique des valeurs de lobjectif ralis. Cet historique permet de vrier que les valeurs de lobjectif
ralis ne restent pas stationnaires trop longtemps. Si ce nest pas le cas, il suft dappliquer la
stratgie garantie jusquce que la valeur de lobjectif ralis change puis dappliquer nouveau
la stratgie usuelle.
Complexit de lalgorithme
Lexemple suivant montre que lalgorithme du tableau simplicial (muni dune stratgie qui ga-
rantit larrt) a une complexit en temps exponentielle en le nombre de variables (ou de contraintes)
43
dans le pire des cas.
2
n1
x
1
+ 2
n2
x
2
+ + 2 x
n1
+ x
n
= z[max]
x
1
5
4 x
1
+ x
2
25
8 x
1
+ 4 x
2
+ x
3
125
.
.
.
2
n
x
1
+ 2
n1
x
2
+ + 4 x
n1
+ x
n
5
n
x
1
, . . . , x
n
0.
Ce programme linaire a n variables, n contraintes. Le polydre des solutions ralisables a 2
n
sommets. Lalgorithme du tableau simplicial, partant de x
1
= = x
n
= 0 numre tous les
sommets avant datteindre la solution optimale (x
1
, . . . , x
n
) = (0, . . . , 0, 5
n
). Si la complexit
dans le pire des cas tait reprsentative de la complexit pour les vrais exemples alors le
simplexe serait inutilisable. Penser que certains problmes comportent des centaines de milliers de
variables. Heureusement, ce nest pas le cas !
3.3.2 Problmes de dmarrage
On dit quun problme P peut se rduire en un problme Q si toute instance de P peut se
reformuler en une instance de Q.
Supposons quun problme P puisse se rduire en un problme Q et quon connaisse un algo-
rithme de rsolution pour toutes les instances de Q. Alors on dispose dun algorithme de rsolution
pour toutes les instances de P : il suft, tant donn une instance de P, de la reformuler en une
instance de Q, de dterminer la solution du problme reformul avec lalgorithme connu puis de
rinterprter la solution obtenue comme une solution du problme initial.
Pour pouvoir traiter les programmes linaires gnraux, la difcult consiste former un pre-
mier tableau simplicial satisfaisant les invariants. En effet, former ce premier tableau quivaut
identier un sommet du polydre des solutions ralisables (via la solution de base) et donc, en
particulier, dmontrer que le programme linaire admet au moins une solution ralisable. Dans le
cas favorable (ingalits avec seconds membres positifs ou nuls), lorigine est une solution
vidente mais cest faux en gnral o il se peut que le programme linaire soit infaisable.
Dans cette section, on montre que le problme de la recherche dun premier tableau simplicial
peut se rduire en un problme doptimisation, la rsolution dun autre programme linaire, appel
programme articiel , qui relve, lui, du cas favorable
1
. Dit autrement, si on sait rsoudre les
programmes linaires dans le cas favorable, on sait rsoudre les programmes linaires dans tous les
cas. Une fois le programme articiel rsolu, on dtermine facilement si le problme initial admet
au moins une solution. Si cest le cas, il ne reste plus qu rsoudre le programme linaire initial
1. La mthode prsente ici est la mthode des deux phases . Dautres mthodes existent comme, par exemple,
celle du grand M .
44
en partant de la base trouve. Prenons pour programme linaire initial :
(PL)
_

_
x
1
x
2
= z [max]
3 x
1
4 x
2
12
2 x
1
+ x
2
4
x
1
, x
2
0
La mise sous forme standard introduit deux variables dcart.
(PL)
_

_
x
1
x
2
= z [max]
3 x
1
+ 4 x
2
x
3
= 12
2 x
1
+ x
2
+ x
4
= 4
x
1
, x
2
, x
3
, x
4
0
La base (3, 4) nest pas ralisable puisque la solution de base comporte une coordonne ngative
(on a x
3
= 12). Voici le programme articiel associ lexemple.
(PLA)
_

_
x
5
= w [min]
3 x
1
+ 4 x
2
x
3
+ x
5
= 12
2 x
1
+ x
2
+ x
4
= 4
x
1
, x
2
, x
3
, x
4
, x
5
0
On a introduit une variable articielle x
5
dans lquation qui pose problme. On a pris pour
objectif articiel : minimiser cette variable.
Explication. Le programme articiel relve du cas favorable : la base vidente (x
5
, x
4
) est
ralisable. Il y a bijection entre les solutions du programme linaire initial et les solutions du
programme articiel telles que x
5
= 0. Pour dterminer si le programme initial admet au moins
une solution, il suft donc de dterminer si le programme articiel a une solution telle que x
5
= 0.
Cest ce quon fait en prenant pour objectif : minimiser x
5
.
Pour pouvoir appliquer lalgorithme du tableau simplicial il reste une difcult technique
lever : la variable x
5
est en base alors que le cot f
5
est non nul (lun des invariants nest pas
satisfait). Il suft de reformuler lobjectif en utilisant lquation o gure la variable articielle :
3 x
1
+ 4 x
2
x
3
+ x
5
= 12 x
5
= 3 x
1
+ 4 x
2
x
3
12.
Le nouvel objectif maximiser est donc :
3 x
1
+ 4 x
2
x
3
12 = w [max].
Pour dterminer w
0
, on value lobjectif x
5
(ou encore 3 x
1
+ 4 x
2
x
3
12) sur la solution de
base. Attention la constante cette fois. On obtient w
0
= 12. On obtient ainsi un premier tableau
simplicial satisfaisant tous les invariants de lalgorithme du tableau simplicial
x
1
x
2
x
3
x
4
x
5
x
5
3 4 1 0 1 12
x
4
2 1 0 1 0 4
3 4 1 0 0 12
45
On applique au programme articiel lalgorithme donn dans le cas favorable. On trouve en une
itration le tableau simplicial suivant :
x
1
x
2
x
3
x
4
x
5
x
2
3/4 1 1/4 0 1/4 3
x
4
5/4 0 1/4 1 1/4 1
0 0 0 0 1 0
On a une base ralisable I

= (2, 4) avec une solution de base I

=
_
_
_
_
_
_
0
3
0
1
0
_
_
_
_
_
_
.
Loptimum du programme articiel est w
0
= 0. La variable articielle x
5
est hors base. On obtient
une premire base ralisable pour le programme linaire initial en supprimant purement et sim-
plement la variable articielle. On obtient ainsi un programme linaire quivalent au programme
linaire initial avec une premire base ralisable I = (2, 4) :
_

_
x
1
x
2
= z [max]
3/4 x
1
+ x
2
1/4 x
3
= 3
5/4 x
1
+ 1/4 x
3
+ x
4
= 1
x
1
, x
2
, x
3
, x
4
0
Synthtisons :
Proposition 13 Le programme linaire initial admet au moins une solution ralisable si et seule-
ment si lobjectif ralis loptimum du programme articiel est w
0
= 0.
Proposition 14 Supposons que lobjectif ralis loptimum du programme articiel soit w
0
= 0.
La solution optimale du programme articiel fournit une premire base ralisable au programme
linraire initial si et seulement si aucune variable articielle nest en base.
On remarque que le programme linaire obtenu ne satisfait pas tous les invariants de lalgo-
rithme du tableau simplicial puisque les cots correspondant aux variables de base ne sont pas tous
nuls. On applique la mme technique que prcdemment : on rcrit lobjectif en se servant de la
premire quation.
3/4 x
1
+ x
2
1/4 x
3
= 3 x
2
= 3 3/4 x
1
+ 1/4 x
3
.
Et donc x
1
x
2
= 1/4 x
1
1/4 x
3
3. Le nouvel objectif est (on peut supprimer la constante) :
1/4 x
1
1/4 x
3
= z[max].
46
Pour dterminer z
0
, on value lobjectif (attention la constante) sur la solution de base : z
0
= 3.
x
1
x
2
x
3
x
4
x
2
3/4 1 1/4 0 3
x
4
5/4 0 1/4 1 1
1/4 0 1/4 0 3
On peut appliquer lalgorithme tudi dans le cas favorable. Sur lexemple, il sarrte tout de suite
puisque tous les cots sont ngatifs ou nuls (mais cest un hasard d lexemple). La solution
optimale du programme linaire initial est donc
_
x
1
x
2
_
=
_
0
3
_
.
Lobjectif ralis loptimum est z
0
= 3.
Remarques
Dans le cas gnral, on peut tre amen introduire plusieurs variables articielles. Lobjectif
du programme linaire articiel consiste alors minimiser leur somme.
Il existe des cas dgnrs o, loptimum du programme articiel, lobjectif ralis est
nul (prouvant que le programme initial a au moins une solution) mais o la base ralisable contient
au moins une variable articielle (ayant alors forcment une valeur nulle).
Cest gnant parce qualors, en supprimant la variable articielle, on perd la base nale
du programme articiel qui doit nous servir de premire base pour traiter le programme initial mais
ce nest pas rdhibitoire : comme sa valeur est nulle dans la solution de base, on ne modie pas
lobjectif ralis loptimum du programme articiel en la rendant hors base. Il suft pour cela de
la remplacer dans la base par une variable non articielle en effectuant une tape supplmentaire
du pivot de GaussJordan.
Question 6. Rsoudre le programme linaire suivant. Le programme articiel associ comporte
deux variables articielles. Aprs rsolution, lune delles reste en base. La chasser de la base nale
en effectuant une tape supplmentaire du pivot de GaussJordan.
_

_
x
1
2 x
2
+ x
3
= z [min]
3 x
1
+ x
2
x
3
= 1
2 x
1
+ x
2
2 x
3
= 1
x
1
, x
2
, x
3
0
3.4 La dualit
Deux problmes doptimisation sont dits en dualit si lun est un problme de maximisation,
lautre un problme de minimisation et si rsoudre lun quivaut rsoudre lautre, dans le sens o
la solution optimale de lun se dduit de la solution optimale de lautre.
47
On rencontre deux cas de dualit dans ce polycopi. Le premier est dcrit dans la section
suivante. Le second apparat dans la section concernant le calcul du ot maximal pouvant transiter
par un rseau de transport.
Pouvoir associer un problme dual un problme doptimisation fournit en gnral des outils
pour vrier quune solution ralisable est bien une solution optimale. Cest le cas du thorme
des carts complmentaires nonc dans la section suivante et du thorme ot maximal et coupe
minimale dans les problmes de ots maximaux.
3.4.1 Construction du dual dun programme linaire
tout programme linaire, on peut faire correspondre un autre programme linaire, dual du
premier (celuici tant appel primal). Cette transformation associe chaque variable du primal
une contrainte du dual et donc une variable dcart (on peut supposer sans perte de gnralit que
le programme ne comporte pas de contraintes dgalit). Elle associe chaque contrainte du primal
une variable du dual. Enn, la transformation est involutive :
Proposition 15 Le dual dun dual est un programme linaire quivalent au primal.
On illustre la mthode de construction du dual sur deux exemples sous forme canonique. Cela
suft pour le cas gnral puisque tout programme linaire peut tre transform en un programme
quivalent sous forme canonique.
Exemple de production de papier
Deux usines produisent du papier de trois qualits diffrentes. Elles ont des commandes pour
chaque type de papier : la compagnie qui gre les usines a des contrats pour fournir 16 tonnes
de papier de qualit infrieure, 5 tonnes de papier de qualit moyenne et 20 tonnes de papier de
qualit suprieure. Il cote 1000 euros par jour pour faire fonctionner lusine A et 2000 euros par
jour pour lusine B. Lusine Aproduit 8 tonnes de papier de qualit infrieure, 1 tonne de papier de
qualit moyenne et 2 tonnes de papier de qualit suprieure par jour. Lusine B produit 2 tonnes de
papier de qualit infrieure, 1 tonne de papier de qualit moyenne et 7 tonnes de papier de qualit
suprieure par jour. On cherche combien de jours chaque usine doit fonctionner an de satisfaire
la demande de la faon la plus conomique.
Le programme linaire est un exemple de programme de satisfaction de demande. Les va-
riables x
1
et x
2
reprsentent les nombres de jours de fonctionnement des usines A et B.
_

_
1000 x
1
+ 2000 x
2
= z [min]
8 x
1
+ 2 x
2
16 (qualit infrieure)
x
1
+ x
2
5 (qualit moyenne)
2 x
1
+ 7 x
2
20 (qualit suprieure)
x
1
, x
2
0.
48
Pour former le programme linaire dual on commence par former la matrice des coefcients des
contraintes et de lobjectif avec seconds membres. On place la ligne de lobjectif en bas.
_
_
_
_
8 2 16
1 1 5
2 7 20
1000 2000
_
_
_
_
On prend la transpose de cette matrice
_
_
8 1 2 1000
2 1 7 2000
16 5 20
_
_
Le dual sobtient en interprtant la matrice transpose en un programme linaire. Par rapport au
primal, il faut changer le sens des ingalits et la nature de lobjectif :
_

_
16 y
1
+ 5 y
2
+ 20 y
3
= w [max]
8 y
1
+ y
2
+ 2 y
3
1000 (usine A)
2 y
1
+ y
2
+ 7 y
3
2000 (usine B)
y
1
, y
2
, y
3
0
la variable x
1
du primal correspond la contrainte usine A du dual et donc la variable
dcart y
4
. la variable x
2
du primal correspond la contrainte usine B du dual et donc la
variable dcart y
5
. Quelques observations :
1. les variables x
1
, x
2
du primal sont diffrentes des variables y
1
, y
2
, y
3
du dual ;
2. le primal a trois contraintes et deux variables alors que le dual a deux contraintes et trois
variables ;
3. les ingalits du primal sont des alors que celles du dual sont des ;
4. cest parce que les coefcients de lobjectif du primal sont positifs, que les seconds membres
du dual sont positifs ou nuls ;
5. lobjectif du primal est une minimisation alors que lobjectif du dual est une maximisation.
Exemple du boulanger
Prenons pour primal lexemple du boulanger
4000 x
1
+ 5000 x
2
= z [max]
2 x
1
+ x
2
8 (farine)
x
1
+ 2 x
2
7 (beurre)
x
2
3 (sel)
x
1
, x
2
0
49
Son dual sobtient comme prcdemment en formant la matrice des coefcients des contraintes et
de lobjectif avec seconds membres et en interprtant sa transpose comme un programme linaire
(en changeant le sens des ingalits et le problme de maximisation en une minimisation).
8 y
1
+ 7 y
2
+ 3 y
3
= w [min]
2 y
1
+ y
2
4000 (pte brise)
y
1
+ 2 y
2
+ y
3
5000 (pte feuillete)
y
1
, y
2
, y
3
0
la variable x
1
du primal correspond la contrainte pte brise du dual et donc la variable
dcart y
4
. la variable x
2
du primal correspond la contrainte pte feuillete du dual et donc
la variable dcart y
5
.
3.4.2 Interprtation du programme dual
Il est toujours possible de donner un sens au programme dual mais linterprtation obtenue, qui
dcrit la stratgie dun concurrent, est souvent assez articielle, en tous cas pour les programmes
modlisant le monde de lentreprise.
Lexemple de la production de papier
Considrons les contraintes du dual : les coefcients ont la dimension de tonnes de papier par
jour ; les seconds membres ont la dimension deuros par jour. Les variables ont donc obligatoire-
ment la dimension deuros par tonne de papier.
Voici une interprtation possible.
On a affaire un concurrent qui tente de faire fermer les deux usines. Le concurrent vend
lentreprise du papier des trois diffrentes qualits au prix le plus lev possible (bien sr) mais
tout en sassurant que les prix soient comptitifs visvis des deux usines.
Les variables y
1
, y
2
et y
3
reprsentent les prix pratiqus par le concurrent pour les trois qualits
de papiers. Ces variables ont bien la dimension deuros par tonne.
Lentreprise va devoir acheter 16 tonnes de papier de qualit infrieure, 5 tonnes de papier de
qualit moyenne et 20 tonnes de papier de qualit suprieure. Elle va donc dpenser 16 y
1
+5 y
2
+
20 y
3
euros. Lobjectif du concurrent consiste maximiser cette somme
16 y
1
+ 5 y
2
+ 20 y
3
= w[max]
Maintenant, les prix doivent tre infrieurs ce que coterait la production de cette mme quan-
tit de papier par lusine A : chaque jour de fonctionnement de cette usine cote 1000 euros
lentreprise mais lui permet dconomiser 8 y
1
+ y
2
+ 2 y
3
. Il faut donc que
8 y
1
+ y
2
+ 2 y
3
1000.
Le mme raisonnement, tenu pour lusine B conduit la contrainte :
2 y
1
+ y
2
+ 7 y
3
2000.
50
Voici les solutions optimales et les objectifs raliss loptimum. On constate que les objectifs
raliss loptimum sont gaux.
_
x
1
x
2
_
=
_
3
2
_
, z = 7000,
_
_
y
1
y
2
y
3
_
_
=
_
_
0
600
200
_
_
, w = 7000.
Lexemple du boulanger
Considrons les contraintes du dual : les coefcients ont la dimension de kilos par rouleau ;
les seconds membtes ont la dimension deuros par milliers de rouleaux. Les variables du dual ont
donc la dimension deuros par milliers de kilos cestdire deuros par tonne.
Voici une interprtation possible.
Le programme dual modlise le comportement dun concurrent du boulanger qui tente de le
dmotiver. Il lui propose de lui racheter ses matires premires en stock des prix y
1
pour la farine,
y
2
pour le beurre et y
3
pour le sel de telle sorte que ni la production de pte brise ni celle de pte
feuillete ne soit rentable pour le boulanger. Lobjectif du concurrent consiste naturellement
minimiser le cot de rachat du stock complet
8 y
1
+ 7 y
2
+ 3 y
3
= w[min]
Comme 2 tonnes de farine et 1 tonne de beurre permettent de produire 1 millier de rouleaux de
pte brise qui rapportent 4000 euros, les prix de rachat y
1
de la farine et y
2
du beurre doivent donc
satisfaire la contrainte
2 y
1
+ y
2
4000.
Comme 1 tonne de farine, 2 tonnes de beurre et 1 tonne de sel permettent de produire 1 millier de
rouleaux de pte feuillete qui rapporte 5000 euros, les prix de rachat y
1
de la farine et y
2
du beurre
doivent satisfaire aussi
y
1
+ 2 y
2
+ y
3
5000.
Voici les solutions optimales et les objectifs raliss loptimum. On constate nouveau que les
objectifs raliss loptimum sont gaux.
_
x
1
x
2
_
=
_
3
2
_
, z = 22000,
_
_
y
1
y
2
y
3
_
_
=
_
_
1000
2000
0
_
_
, w = 22000.
3.4.3 Rsoudre le primal quivaut rsoudre le dual
Si on admet que le dual dun programme linaire modlise lactivit dun concurrent, le premier
point du thorme cidessous (le fait que les objectifs raliss loptimum soient gaux) devient
assez intuitif.
Thorme 4 Quand deux programmes linaires sont en dualit seuls trois cas peuvent se produire.
51
1. Le primal et le dual ont chacun au moins une solution ralisable. Alors les deux programmes
sont borns et ralisent le mme objectif loptimum (principe de la dualit de Von Neu-
mann).
2. Lun des deux programmes linaires a au moins une solution ralisable mais lautre pas.
Alors celui des deux qui a au moins une solution est non born.
3. Aucun des deux programmes linaires na de solution ralisable.
Le premier cas est de loin le plus frquent en pratique. Remarquer que si les objectifs lop-
timum sont les mmes, les solutions optimales ne le sont pas. a naurait aucun sens dailleurs
puisque les variables ont des dimensions diffrentes.
La proposition suivante montre quon peut non seulement lire lobjectif ralis loptimum
mais aussi la solution optimale dun programme linaire dans le tableau simplicial nal de son
dual. On a formul la proposition partir de lalgorithme du tableau simplicial pour des raisons de
lisibilit mais il en existe des formulations plus gnrales, indpendantes de tout algorithme.
Proposition 16 chaque variable du primal x
i
correspond une variable dcart du dual y
j
. La
valeur de x
i
dans la solution optimale du primal est gale loppos f
j
du cot correspondant
y
j
dans le tableau simplicial nal du dual.
Lexemple de la production de papier
Le thorme et la proposition fournissent donc une mthode simple de rsolution de pro-
grammes de satisfaction de demande (une mthode qui vite lemploi des variables articielles).
Reprenons le premier exemple.
_

_
1000 x
1
+ 2000 x
2
= z [min]
8 x
1
+ 2 x
2
16 (qualit infrieure)
x
1
+ x
2
5 (qualit moyenne)
2 x
1
+ 7 x
2
20 (qualit suprieure)
x
1
, x
2
0.
On peut montrer (par exemple en utilisant la technique des variables articielles) que la solution
optimale de ce programme linaire est
_
x
1
x
2
_
=
_
3
2
_
.
Lobjectif ralis loptimum est z
0
= 7000. Son dual relve du cas favorable (forme canonique
et seconds membres positifs).
_

_
16 y
1
+ 5 y
2
+ 20 y
3
= w [max]
8 y
1
+ y
2
+ 2 y
3
1000 (usine A)
2 y
1
+ y
2
+ 7 y
3
2000 (usine B)
y
1
, y
2
, y
3
0
52
On introduit deux variables dcart y
4
(associe x
1
) et y
5
(associe x
2
). On forme un tableau
simplicial
y
1
y
2
y
3
y
4
y
5
y
4
8 1 2 1 0 1000
y
5
2 1 7 0 1 2000
16 5 20 0 0 0
Des calculs pnibles mener la main aboutissent au tableau simplicial nal :
y
1
y
2
y
3
y
4
y
5
y
2
52/5 1 0 7/5 2/5 600
y
3
6/5 0 1 1/5 1/5 200
12 0 0 3 2 7000
La solution optimale du dual est donc
y =
_
_
0
600
200
_
_
.
Lobjectif ralis est w
0
= 7000. Le thorme est vri. Les variables dcart y
4
et y
5
sont asso-
cies aux variables x
1
et x
2
respectivement. Au signe prs, les cots f
4
et f
5
du tableau simplicial
nal du dual donnent la solution optimale du primal. La proposition est vrie.
Lexemple du boulanger
Reprenons le programme linaire modlisant lactivit du boulanger et son dual.
_

_
4000 x
1
+ 5000 x
2
= z [max]
2 x
1
+ x
2
8 (farine)
x
1
+ 2 x
2
7 (beurre)
x
2
3 (sel)
x
1
, x
2
0
_

_
8 y
1
+ 7 y
2
+ 3 y
3
= w [min]
2 y
1
+ y
2
4000 (pte brise)
y
1
+ 2 y
2
+ y
3
5000 (pte feuillete)
y
1
, y
2
, y
3
0
Ici, cest le primal qui est facile rsoudre. Voici le tableau simplicial nal calcul lors dun cours
prcdent :
x
1
x
2
x
3
x
4
x
5
x
5
0 0 1/3 2/3 1 1
x
1
1 0 2/3 1/3 0 3
x
2
0 1 1/3 2/3 0 2
0 0 1000 2000 0 22000
Le dual du dual est un programme linaire quivalent au primal. Les variables y
1
, y
2
et y
3
du dual
correspondent aux variables dcart x
3
, x
4
et x
5
du primal. Daprs le thorme et la proposition
53
prcdents, on trouve que lobjectif ralis loptimum par le dual est w
0
= 22000 et que sa
solution optimale est :
_
_
y
1
y
2
y
3
_
_
=
_
_
1000
2000
0
_
_
.
3.4.4 Sensibilit de lobjectif une perturbation des seconds membres
On rappelle qu chaque contrainte du primal correspond une variable du dual.
Thorme 5 Si on augmente dune unit (sufsamment petite) le second membre dune contrainte,
on augmente lobjectif ralis dun nombre dunits gal la valeur loptimum de la variable
duale associe la contrainte.
La valeur loptimum de la variable duale est appele valeur marginale de la contrainte.
Lorsquune contrainte est inactive, on peut modier son second membre sans affecter la solu-
tion optimale du programme. On en dduit :
Proposition 17 Si une contrainte est inactive alors sa valeur marginale est nulle.
Le texte qui suit justie le thorme, sans le dmontrer. Supposons par exemple, dans le pro-
blme de production de papier, que la quantit de papier de qualit moyenne commande passe de 5
6 tonnes. Cette perturbation modie un des cots du dual. Elle ne modie pas les contraintes.
Elle ne modie donc pas le polydre des solutions ralisables du dual. Supposer cette modica-
tion petite, cest supposer que le sommet du polydre correspondant la solution optimale du dual
ne change pas. On en conclut que lobjectif ralis loptimum du dual augmente de la valeur
loptimum de la variable duale y
2
associe la contrainte.
_

_
1000 x
1
+ 2000 x
2
= z [min]
8 x
1
+ 2 x
2
16
x
1
+ x
2
5 / 6
2 x
1
+ 7 x
2
20
x
1
, x
2
0.
_

_
16 y
1
+ 5 / 6 y
2
+ 20 y
3
= w [max]
8 y
1
+ y
2
+ 2 y
3
1000
2 y
1
+ y
2
+ 7 y
3
2000
y
1
, y
2
, y
3
0
Appliquons maintenant le thorme 4. loptimum, les objectifs raliss par le primal et le dual
sont gaux. Lobjectif ralis loptimum par le primal est donc augment de y
2
, cestdire de
la valeur marginale de la contrainte modie.
Voici une interprtation possible, base sur lalgorithme du tableau simplicial de ce quon en-
tend par une petite modication : une modication des seconds membres qui naffecte pas le choix
des pivots lors du droulement de lalgorithme du tableau simplicial est sufsamment petite.
54
Valeurs marginales en AMPL
Voici le modle AMPL de lexemple de production de papier.
set USINES;
set PAPIERS;
param qte_commandee {PAPIERS} >= 0;
param cout_quotidien {USINES} >= 0;
param production_quotidienne {USINES, PAPIERS} >= 0;
var jours_ouvres {USINES} >= 0;
minimize cout_total :
sum {u in USINES} (jours_ouvres [u]
*
cout_quotidien [u]);
subject to commande_satisfaite {p in PAPIERS} :
sum {u in USINES}
jours_ouvres [u]
*
production_quotidienne [u, p] >= qte_commandee [p];
data;
set USINES := A B;
set PAPIERS := inf moy sup;
param qte_commandee :=
inf 16
moy 5
sup 20;
param cout_quotidien :=
A 1000
B 2000;
param production_quotidienne :
inf moy sup :=
A 8 1 2
B 2 1 7;
Rsolution. On vrie successivement que la contrainte sur le papier de qualit infrieure est
inactive et quune augmentation de 10 tonnes de la quantit commande de papier de qualit sup-
rieure produit une augmentation de 10 200 = 2000 euros des cots.
ampl: model papier.ampl;
ampl: solve;
MINOS 5.5: optimal solution found.
2 iterations, objective 7000
ampl: let qte_commandee ["inf"] := 17;
ampl: solve;
MINOS 5.5: optimal solution found.
0 iterations, objective 7000
ampl: let qte_commandee ["inf"] := 16;
ampl: let qte_commandee ["sup"] := 30;
ampl: solve;
MINOS 5.5: optimal solution found.
0 iterations, objective 9000
On constate enn quune augmentation de 11 tonnes de la quantit commande de papier de
qualit suprieure nest pas sufsamment petite .
55
ampl: let qte_commandee ["sup"] := 31;
ampl: solve;
MINOS 5.5: optimal solution found.
1 iterations, objective 9269.230769
Les valeurs des variables duales associes aux contraintes sont appeles shadow prices en
AMPL. On les obtient par la commande display nom_de_la_contrainte .
ampl: model papier.ampl;
ampl: solve;
MINOS 5.5: optimal solution found.
2 iterations, objective 7000
ampl: display commande_satisfaite;
commande_satisfaite [
*
] :=
inf 0
moy 600
sup 200
Attention : en AMPL, ce sont les bornes des contraintes qui jouent le rle des seconds membres
(on les obtient en accolant les sufxes lb et ub au nom de la contrainte). Et il y a deux
bornes (lune delles pouvant valoir ). Par convention, le logiciel afche la valeur marginale
correspondant la borne la plus proche du corps de la contrainte (la valeur du corps sobtient
en accolant le sufxe body au nom de la contrainte). Comment le logiciel procdetil ? Une
contrainte AMPL munie de deux bornes se traduit par deux contraintes mathmatiques. Le tableau
simplicial calcul par le logiciel (ou ce qui en tient lieu) comporte deux variables duales. Lune des
deux variables au moins est nulle puisque les deux contraintes mathmatiques ne peuvent pas tre
actives en mme temps. Le logiciel choisit celle qui est non nulle, si elle existe.
ampl: display commande_satisfaite.lb, commande_satisfaite.body,
commande_satisfaite.ub;
commande_satisfaite.lb commande_satisfaite.body commande_satisfaite.ub :=
inf 16 28 Infinity
moy 5 5 Infinity
sup 20 20 Infinity
Des interprtations similaires sappliquent ce que le logiciel AMPL appelle les cots rduits
des variables.
3.4.5 Critres doptimalit
On conclut par deux thormes permettant de dcider si une solution ralisable est optimale ou
pas. On montre comment appliquer en pratique le thorme des carts complmentaires.
Thorme 6 Soient x et y deux solutions ralisables de deux programmes linaires en dualit,
dobjectifs conomiques nots f et g respectivement.
Alors
t
f x =
t
g y si et seulement si x et y sont des solutions optimales.
56
Le thorme suivant est connu sous le nom de thorme des carts complmentaires ou
thorme des relations dexclusion .
Thorme 7 (thorme des carts complmentaires)
On considre un programme linaire comportant n variables x
1
, . . . , x
n
et m contraintes. Son
dual comporte m variables y
1
, . . . , y
m
et n contraintes. chaque variable x
i
correspond une
variable dcart y
m+i
. chaque variable y
i
correspond une variable dcart x
n+i
.
Soient x une solution ralisable du premier et y une solution ralisable du second.
Les solutions ralisables x et y sont optimales si et seulement si x
i
y
m+i
= y
j
x
n+j
= 0 pour
tous 1 i n et 1 j m.
Exemple dutilisation
Le thorme des carts complmentaires permet de dterminer si une solution ralisable x dun
programme linaire est optimale ou pas. On peut lutiliser ainsi : on part de la solution ralisable x;
ensuite on pose que tous les produits x
i
y
j
mentionns dans le thorme sont nuls ; on en dduit des
conditions (un systme dquations) sur une solution du dual ; on rsout ce systme ; sil admet une
solution y et si cette solution est bien ralisable alors x et y satisfont les hypothses du thorme
et x est prouve optimale. Voici la dmarche illustre sur lexemple de production de papier.
Oublions temporairement que nous avons dj dmontr de nombreuses reprises que
_
x
1
x
2
_
=
_
3
2
_
est la solution optimale du programme linaire modlisant lexemple de production de papier et
dmontronsle au moyen du thorme des carts complmentaires. En substituant ces valeurs dans
les quations et en comparant les valeurs obtenues aux seconds membres, on obtient les valeurs
des variables dcart. Voici le programme sous forme standard et les valeurs de toutes les variables.
Toutes les coordonnes de la solution candidate sont positives ou nulles : cette solution est bien
ralisable.
_

_
1000 x
1
+ 2000 x
2
= z [min]
8 x
1
+ 2 x
2
x
3
= 16
x
1
+ x
2
x
4
= 5
2 x
1
+ 7 x
2
x
5
= 20
x
1
, x
2
0.
_
_
_
_
_
_
x
1
x
2
x
3
x
4
x
5
_
_
_
_
_
_
=
_
_
_
_
_
_
3
2
12
0
0
_
_
_
_
_
_
.
Voici maintenant le dual sous forme standard ainsi que la correspondance entre les variables de
chaque programme et les variables dcart de lautre.
_

_
16 y
1
+ 5 y
2
+ 20 y
3
= w [max]
8 y
1
+ y
2
+ 2 y
3
+ y
4
= 1000
2 y
1
+ y
2
+ 7 y
3
+ y
5
= 2000
y
1
, y
2
, y
3
0
x
1
y
4
x
2
y
5
x
3
y
1
x
4
y
2
x
5
y
3
57
On cherche des valeurs pour les variables duales telles que les produits entre les cinq couples de
variables soient nuls :
x
1
y
4
= 3 y
4
= 0
x
2
y
5
= 2 y
5
= 0
x
3
y
1
= 12 y
1
= 0
x
4
y
2
= 0 y
2
= 0
x
5
y
3
= 0 y
3
= 0
Ces relations impliquent que y
1
= y
4
= y
5
= 0 et que y
2
et y
3
satisfont
_
y
2
+ 2 y
3
= 1000
y
2
+ 7 y
3
= 2000
solution
_
y
2
y
3
_
=
_
600
200
_
.
La solution du dual obtenue est ralisable. Les hypothses du thorme des carts complmentaires
sont satisfaites. La solution candidate du primal est donc bien une solution optimale. On peut
vrier par acquis de conscience que les objectifs raliss loptimum sont gaux. En effet, z
0
=
w
0
= 7000.
58
Chapitre 4
Thorie des graphes
Un graphe est une structure de donnes pouvant reprsenter des situations trs diverses : r-
seaux dautoroutes, planning de succession de tches, courants dans un circuit lectrique . . . Elle
senrichit quand on attribue aux sommets ou aux arcs/artes une valeur, cestdire un nombre
reprsentant une longueur, une capacit de transport, une probabilit de transition . . . On dit quon
a affaire un graphe valu. Dans ce chapitre, nous allons nous concentrer sur les problmes de
thorie des graphes qui sont des problmes doptimisation : trouver un chemin de valeur minimale
entre deux sommets (on minimise la valeur du chemin), le ot maximal pouvant scouler par un
rseau de canalisations (on maximise un ot) . . . Ce chapitre doit beaucoup aux livres [4] et [3].
Le premier met laccent sur la pratique des algorithmes. Le deuxime sur la thorie : les preuves
de correction, de complexit et les subtilits dimplantation. Chacun des deux livres est nettement
plus complet que ce cours.
4.1 Vocabulaire
Certaines dnitions varient suivant les ouvrages. En gnral, ces variations sont minimes. On
distingue les graphes orients (des sommets relis par des arcs ou des ches) des graphes non
orients (des sommets relis par des artes). Cette distinction nest pas trs fondamentale :
tout algorithme conu pour les graphes non orients peut aussi tre appliqu aux graphes
orients : il suft de ne pas tenir compte du sens des ches ;
tout graphe non orient est quivalent un graphe orient : il suft de remplacer chaque arte
par deux arcs.
Formellement, un graphe est un couple G = (S, A) o S est lensemble des sommets et A
S S est lensemble des arcs ou des artes. Dans le cas dun graphe orient, chaque couple
(x, y) A reprsente un arc. La premire composante x du couple est la source (ou lorigine) de
larc. La seconde y en est le but (ou la destination). Dans le cas dun graphe non orient, chaque
couple (x, y) Areprsente une arte dextrmits x et y. Dans ce cas, les couples (x, y) et (y, x)
dsignent la mme arte
1
. Si (x, y) est un arc ou une arte, on dit que x et y sont voisins, et que x
1. Certains auteurs [3] interdisent la prsence de boucles (x, x) dans les graphes non orients. Certains autorisent
la prsence darcs et dartes dans un mme graphe.
59
(respectivement y) est un voisin de y (respectivement x).Voici un exemple de graphe orient avec
S = {A, B, C, D, E, F} et A = {(A, B), (B, B), (B, C), (C, A), (B, D), (F, E)}.
A
B
C
D
E
F
Un graphe G

= (S

, A

) est un sousgraphe de G si S

S et A

A S

. Soit S

un sousensemble de S. On dit que G

= (S

, A

) est le sousgraphe de G engendr par S

si
A

= A S

.
Soit G = (S, A) un graphe orient. Un chemin dans G est une suite de sommets x
1
, . . . , x
k
de S (un mme sommet pouvant apparatre plusieurs fois) telle que, quel que soit 1 i < k, le
couple (x
i
, x
i+1
) A.
Soit G = (S, A) un graphe orient ou non. Une chane dans G est une suite de sommets
x
1
, . . . , x
k
de S (un mme sommet pouvant apparatre plusieurs fois) telle que, quel que soit 1
i < k, lun des couples (x
i
, x
i+1
), (x
i+1
, x
i
) A. Remarque : pour dsigner sans ambiguit une
chane dans un graphe orient, il peut tre ncessaire de prciser aussi les arcs
2
(la difcult se
prsente dans lalgorithme de FordFulkerson pour dsigner les chanes amliorantes ).
La longueur dun chemin (ou dune chane) x
1
, . . . , x
k
est le nombre darcs (ou dartes) qui
le composent : k 1. Un chemin qui se referme sur luimme est un circuit. Un graphe qui ne
comporte aucun circuit est dit acyclique. Une chane qui se referme sur ellemme est un cycle. Un
chemin (une chane) est simple sil (si elle) ne passe pas deux fois par le mme arc (la mme arte).
Un chemin (une chane) est lmentaire sil (si elle) ne passe pas deux fois par le mme sommet.
Tout chemin (toute chane) lmentaire est simple. De tout chemin (chane) on peut extraire un
chemin (une chane) lmentaire ayant mme source et mme destination (mmes extrmits).
Dans un graphe orient, un sommet y est accessible partir dun sommet x sil existe un che-
min de x vers y. Dans un graphe non orient, un sommet y est accessible partir dun sommet x
sil existe une chane entre x et y. Un graphe orient G est fortement connexe si pour tous som-
mets x et y il existe un chemin de x vers y et un chemin de y vers x. Un sousgraphe G

dun
graphe orient G est une composante fortement connexe de G si G

est fortement connexe et nest


pas strictement inclus dans un autre sousgraphe fortement connexe de G. Un graphe fortement
connexe na quune seule composante fortement connexe.
La connexit est une proprit des graphes orients ou non. Un graphe G est connexe si pour
tous sommets x et y il existe une chane dextrmits x et y. Un sousgraphe G

de G est une
composante connexe de G si G

est connexe et nest pas strictement inclus dans un autre sous


graphe connexe de G. Dans un graphe non orient, la composante connexe dun sommet x est
lensemble des sommets accessibles partir de x par contre, dans un graphe orient, la composante
fortement connexe dun sommet x nest en gnral pas lensemble des sommets accessibles partir
de x (elle est incluse dans lensemble). Le graphe suivant est connexe. La composante fortement
2. Certains auteurs dnissent les chemins et les chanes comme des suites darcs ou dartes. Dautres prcisent
la fois les sommets et les arcs ou les artes empruntes.
60
connexe de A est ({A}, ). Une autre composante fortement connexe est
({E, F, C, G}, {(E, F), (F, C), (C, G), (G, E)}).
Lensemble des sommets accessibles partir de A est {A, F, E, C, G}.
D
F
E
C G
B
A
4.2 Reprsentations dun graphe
Soit G = (S, A) un graphe avec S = {x
1
, . . . , x
n
} et A = {a
1
, . . . , a
m
}. Voici les principales
reprsentations possibles de G.
La reprsentation sagittale
Elle sobtient en dessinant le graphe.
La reprsentation par matrice dadjacence
Deux sommets x et y sont dits adjacents sil existe un arc de x vers y ou de y vers x (sil existe
une arte entre x et y dans le cas de graphes non orients). La matrice dadjacence est une matrice
B de taille n n indice par les sommets. Par convention B
k
j
vaut 1 si larc (x
j
, x
k
) A et 0
sinon. Si le graphe est valu on met des poids plutt que des 1 dans la matrice. Dans le cas des
graphes non orients, la matrice est symtrique.
La reprsentation par matrice dincidence
On dit quun sommet x est incident un arc a (ou encore que a est incident x) si x est la
source ou la destination de a (si x est une extrmit de a dans le cas de graphes non orients). La
matrice dincidence C est de taille n m. Les indices de ligne sont les sommets. Les indices de
colonne sont les arcs (ou les artes). Soient x
j
un sommet et a
k
un arc. Par convention C
k
j
vaut 1
si x
j
est la source de a
k
, 1 si x
j
est la destination (mais pas la source) de a
k
et 0 sinon. Dans le cas
des graphes non orients, C
k
j
vaut 1 si x
j
est une extrmit de a
k
.
La reprsentation par liste de successeurs
Il sagit dun tableau succ de n listes chanes. Le tableau est indic par les sommets. La liste
succ(x
i
) contient tous les successeurs de x
i
.
61
La reprsentation par liste de prdecesseurs
Il sagit dun tableau pred de n listes chanes. Le tableau est indic par les sommets. La liste
pred (x
i
) contient tous les prdecesseurs de x
i
.
4.3 Complexit
Fonctions dune variable.
Dnition 16 Soient f et g deux fonctions de R dans R. On dit que f O(g) sil existe deux
constantes relles n
0
, c > 0 telles que f(n) c g(n) pour tout n > n
0
.
Nous nous servirons de cette notation de la faon suivante : la fonction f(n) dsignera le temps
de calcul ou le volume mmoire consomm par une procdure en fonction de la taille n de sa don-
ne ; la fonction g sera une fonction dcrite par une expression analytique simple (par exemple, n,
n
2
, nlog n, . . .). La notation f O(g) signiera que, pour des donnes sufsamment grandes,
le temps de calcul (ou le volume mmoire) consomm par la procdure crot moins vite que g(n)
( une constante multiplicative prs). On ne sintresse pas au comportement de la procdure pour
de petites valeurs de n. Le graphique suivant illustre lexpression f O(g) de faon intuitive.
c g(n)
f(n)
n
0
n
Lexemple des logarithmes. On rappelle que si n = 2
k
alors k est le logarithme en base 2 de n,
not log
2
(n). Plus gnralement, si b est un rel positif et n = b
k
alors k est le logarithme en base b
de n, not log
b
(n).
Tous les logarithmes de n sont gaux une constante multiplicative prs. En effet, log
b
(n) =
ln(n)/ ln(b) o ln dsigne le classique logarithme neperien. Par consquent, lorsquon crit
quune opration a une complexit en O(log n), on ne prcise pas la base.
Considrons par exemple le cas dune opration complique, compose de k oprations l-
mentaires lorsque la donne est de taille n = 2
k
. Comme k = log
2
(n), la complexit de lopration
complique, exprime en fonction de la taille de la donne, cestdire n, est un O(log n).
Fonctions de deux variables. La complexit en mmoire (dune structure de donnes ou dun
algorithme) ou en temps (dun algorithme) est toujours exprime en fonction de quantits na-
turelles associes la donne. Dans le cadre de la thorie des graphes, ces quantits sont le
62
nombre de sommets n et le nombre darcs m. Il nous faut donc tendre la dnition prcdente
aux fonctions de deux variables relles.
Dnition 17 Soient f et g deux fonctions de R
2
dans R. On dit que f O(g) sil existe trois
constantes n
0
, m
0
, c > 0 telles que f(n, m) c g(n, m) pour tous n > n
0
et m > m
0
.
Dans le cas des graphes, les deux variables n et m ne sont pas indpendantes : on a m n
2
avec galit dans le cas des graphes complets et n 1 m ds quon suppose le graphe connexe.
Ainsi,
O(m) O(n
2
) dans tous les cas
O(n) O(m) pour tous les graphes connexes
Complexit des reprsentations
La taille de la reprsentation du graphe varie en fonction de la reprsentation utilise. Dans
le cas dune matrice dadjacence, cest un O(n
2
), dans le cas dune matrice dincidence, cest un
O(nm) et dans le cas de listes de successeurs ou prdecesseurs, cest un O(m + n) (il y a autant
de maillons que darcs, cestdire m, plus la taille de succ, cestdire n fois la taille dun
pointeur). La matrice dadjacence convient aux graphes presque complets. La matrice dincidence
convient aux graphes trs creux (cas o m n).
Complexit des algorithmes
On sintresse ici la complexit en temps dans le pire des cas. Les exemples types cidessous
apparaissent dans beaucoup dalgorithmes tudis dans ce chapitre.
Parcours de tous les successeurs de tous les sommets.
pour tout sommet x faire
pour tout successeur y de x faire
instruction ayant un cot constant
fait
fait
Si on suppose le graphe reprsent par des listes de successeurs, linstruction est excute m
fois, moins si, par exemple, on se restreint des sommets x appartenant une mme composante
connexe. La complexit en temps dans le pire des cas est dans tous les cas un O(m). Si on suppose
le graphe reprsent par une matrice dadjacence, linstruction est toujours excute m fois mais
la complexit en temps dans le pire des cas est un O(n
2
).
Parcours de tous les sommets puis de tous les arcs.
63
pour tout sommet x faire
instruction ayant un cot constant
fait
pour tout arc a faire
instruction ayant un cot constant
fait
La premire boucle a une complexit f
1
(n, m) O(n). En supposant le graphe reprsent
par des listes de successeurs, la seconde a une complexit f
2
(n, m) O(m). Le tout a donc
une complexit f
1
(n, m) + f
2
(n, m) O(n + m). Maintenant, si on suppose le graphe connexe
O(n + m) = O(m).
4.4 Exemples de problmes rencontrs
Historiquement, on date le dbut de la thorie des graphes avec le problme des sept ponts de
Knigsberg (pos et rsolu par Euler en 1736) qui enjambent la Pregel .
FIGURE 4.1 Leonhard Euler (17071783).
Variantes du mme problme : peuton dessiner la gure cidessous sans lever le crayon et en
ne traant quune seule fois chaque arte (peuton trouver un circuit eulerien qui passe par tous les
sommets) ?
64
FIGURE 4.2 Carte historique de Knigsberg datant de lpoque dEuler.
3 3
4
4
2
3
3
Thorme 8 (Euler)
Dans un graphe connexe, il existe un chemin eulerien passant par tous les sommets si et seule-
ment si tous les sommets sont de degr
3
pair sauf ventuellement deux qui doivent alors tre choisis
comme sommets de dpart et darrive.
3. Le degr dun sommet est le nombre dartes admettant le sommet pour extrmit.
65
En 1852, Francis Guthrie, cartographe anglais, remarque quil est possible de colorier la carte
des cantons dAngleterre avec quatre couleurs sans attribuer la mme couleur deux cantons limi-
trophes. Il demande son frre Frederick si cette proprit est vraie en gnral. Celuici commu-
nique la conjecture De Morgan et, en 1878, Cayley la publie. Aprs plusieurs fausses preuves
la premire preuve vritable est tablie en 1976 par deux Amricains (Appel et Haken). La d-
monstration, qui a exig la vrication au cas par cas denviron 1500 cas particuliers est lexemple
le plus important de preuve effectue par ordinateur. Elle ne peut pas tre vrie la main. La
question de lexistence dune dmonstration visage humain est toujours ouverte.
Thorme 9 (Appel et Haken)
Toute carte de gographie peut tre colorie avec quatre couleurs sans que la mme couleur
soit attribue deux pays limitrophes.
Les graphes planaires (ceux qui peuvent tre dessins sans que deux artes se coupent) ont t
fortement tudis. Le thorme suivant est d Euler
Thorme 10 (Euler)
Soit G un graphe planaire et connexe n sommets, m artes et f faces. Alors n m+f = 2.
Ce thorme, qui se dmontre assez facilement par rcurrence sur m, implique que les deux
graphes cidessous ne sont pas planaires. Le premier est le graphe K
3,3
obtenu partir de deux
ensembles de trois sommets, en reliant chaque sommet du premier ensemble chaque sommet du
second. Le second graphe, K
5
, est form de cinq sommets relis deuxdeux.
Cest lautre implication qui est difcile dans le thorme suivant, dmontr par Kuratowski
en 1930.
Thorme 11 (Kuratowski)
Un graphe est planaire si et seulement si aucun de ses sousgraphes ne se rduit
4
lun des
deux graphes cidessus.
4.5 Algorithmes de parcours
Les deux algorithmes cidessous gnralisent les algorithmes de parcours darbres partir
dune racine. On montre dans les deux cas comment adapter les algorithmes pour construire un
arbre couvrant du graphe. La difcult consiste (par comparaison avec les algorithmes de par-
cours darbres) viter de considrer plusieurs fois les mmes sommets. On rsout le problme en
coloriant les sommets parcourus.
4. en un sens quil faudrait prciser.
66
4.5.1 Parcours en largeur dabord
Il sobtient au moyen dune le. On utilise trois couleurs : bleu, vert et rouge.
FIGURE 4.3 Algorithme de parcours en largeur dabord

unit. O(1) total O(n)

unit. O(1) total O(n)

unit. O(1)
_

_
total O(m)
_

_
total O(n +m)
procdure en_largeur (G, s)
Parcours en largeur dabord de la composante connexe de s, sans tenir compte des orientations.
dbut
colorier en bleu tous les sommets sauf s
vider la le
colorier s en vert et lenler
tant que la le nest pas vide faire
dler x
pour tout voisin y de x faire
si y est bleu alors
colorier y en vert et lenler
nsi
fait
colorier x en rouge
fait
n
Les proprits suivantes sont des invariants de boucle :
1. un sommet est vert si et seulement sil est dans la le ;
2. si x est rouge alors tous ses voisins sont verts ou rouges ;
3. si x est vert ou rouge alors il existe une chane entre s et x ne passant que par des sommets
rouges ( lexception de x).
la n de lexcution de la procdure, la composante connexe de s est lensemble des som-
mets rouges (combiner les invariants avec la condition darrt, qui implique quil ny a plus de
sommet vert). On peut modier facilement la procdure pour tenir compte des orientations. la
n, lensemble des sommets rouges est lensemble des sommets accessibles partir de s.
Complexit. On sintresse la complexit en temps de la procdure. On rappelle que le graphe
comporte n sommets et m artes. Pour pouvoir mener le calcul, il faut prciser la reprsentation
du graphe et limplantation des structures de donnes utilises (ici, une le). On suppose que le
graphe est reprsent par des listes de voisins. Par consquent, parcourir tous les successeurs de
tous les sommets a une complexit en O(m). On dcrit dans un des paragraphes suivants une
implantation dune le pour laquelle toutes les oprations ont une complexit en O(1). Le corps de
la boucle intrieure a donc au total une complexit en temps, dans le pire des cas, en O(m). Chaque
sommet de la composante connexe de s est enl et dl une fois. Le cot total des oprations
enler est dj compt dans le O(m). Le cot total des oprations dler est en O(n).
67
La boucle extrieure a donc une complexit en temps dans le pire des cas en O(n + m). Avec
les initialisations, on obtient au nal une complexit en temps en temps dans le pire des cas en
O(n + m).
Application : calcul dune plus courte chane
On peut modier la procdure pour calculer explicitement une plus courte chane (en nombre
darcs) entre s et tout autre sommet x accessible partir de s. Lalgorithme est donn en gure 4.4.
Pour tout x appartenant la composante connexe, on calcule un prdecesseur pred(x) de x dans
cette chane ainsi que la longueur d(x) de cette chane. On obtient ainsi un arbre couvrant de la
composante connexe de s. On adopte les invariants de boucle supplmentaires suivants :
1. si x est vert ou rouge alors pred(x) est rouge, fournit le prdecesseur de x dans une chane
de longueur minimale, gale d(x), entre s et x.
On peut facilement modier cet algorithme pour tenir compte des orientations.
FIGURE 4.4 Le calcul dune plus courte chane entre un sommet distingu et tous les autres som-
mets est une application immdiate du parcours en largeur dabord
procdure plus_courte_chane (G, s)
Plus courte chane entre s et tout autre sommet sans tenir compte des orientations
dbut
colorier en bleu tous les sommets sauf s
vider la le
d(s) := 0
pred(s) est indni
colorier s en vert et lenler
tant que la le nest pas vide faire
dler x
pour tout voisin bleu y de x faire
colorier y en vert et lenler
d(y) := d(x) + 1
pred(y) := x
fait
colorier x en rouge
fait
n
Implantation dune le
On implante facilement une le utilisable pour le parcours en largeur dabord en utilisant un
tableau T n lments indics de 0 n (il y a n + 1 emplacements pour distinguer la le vide
68
dune le comportant n lments) et deux indices d et f. Lindice d est lindice de llment en
dbut de le. Lindice f est lindice de lemplacement qui suit le dernier lment enl. La le est
vide si d = f. On incrmente ces deux indices modulo n + 1 .
T
0 n
B A C
d f
La le contient trois lments
On enle H
f d
B A C H T
T On dle un sommet (B) A C H
d f
Elle a une capacit de six sommets
4.5.2 Parcours en profondeur dabord
On donne dans la gure 4.5 le parcours de graphe orient. Il sobtient au moyen dune pile. On
utilise trois couleurs : bleu, vert et rouge. On adopte les invariants de boucle suivants :
1. un sommet est vert si et seulement sil est dans la pile ;
2. un sommet rouge a des successeurs verts ou rouges ;
3. la pile contient un chemin entre s et le sommet de pile.
Le traitement dun sommet commence au moment o il est colori en vert. Il se termine lors-
quil est colori en rouge. La proposition suivante nonce une proprit clef du parcours en pro-
fondeur. Cette proprit sapplique directement pour trier topologiquement un graphe acyclique.
Proposition 18 (proprit clef du parcours en profondeur dabord)
Soit x un sommet qui vient juste dtre colori en vert. Tous les sommets bleus accessibles
partir de x seront coloris en rouge avant que x ne le soit.
la n de lexcution, lensemble des sommets rouges est lensemble des sommets accessibles
partir de s. On peut modier facilement lalgorithme pour ne pas tenir compte des orientations.
On peut adapter lalgorithme pour calculer un arbre couvrant de lensemble des sommets acces-
sibles partir de s mais les chemins ainsi obtenus ne sont pas de longueur minimale (en parcourant
le graphe en profondeur dabord, on nglige des chanes latrales plus courtes). Cest un in-
convnient visvis du parcours en largeur dabord. Avantage : larbre couvrant engendr par le
parcours en profondeur dabord na pas besoin dtre explicit : on le lit dans la pile.
Pour pouvoir mener lanalyse de complexit, il faut prciser comment on dtermine si x a un
voisin bleu y . Cest ce qui est fait dans lalgorithme de la gure suivante. On suppose le graphe
69
FIGURE 4.5 Algorithme de parcours profondeur dabord
procdure en_profondeur (G, s)
Parcours en profondeur dabord des sommets accessibles partir de s.
dbut
colorier tous les sommets en bleu sauf s
vider la pile
colorier s en vert et lempiler
tant que la pile nest pas vide faire
x := le sommet de la pile
si x a un voisin bleu y alors
colorier y en vert et lempiler
sinon
colorier x en rouge
dpiler x
nsi
fait
n
reprsent par des listes de successeurs. On attribue tout sommet x un indice i(x) gal lindice
du dernier successeur de x trait dans la liste succ (x). On note succ (i, x) le ime lment de la
liste succ (x) des successeurs de x et |succ (x)| la longueur de cette liste. Les indices commencent
1.
Complexit. La boucle intrieure parcourt tous les successeurs de tous les sommets. Comme le
graphe est suppos reprsent par des listes de successeurs, elle est excute au total O(m) fois.
Chaque sommet accessible partir de s est empil et dpil exactement une fois et chaque opra-
tion de pile a une complexit en O(1). La complexit en temps dans le pire des cas de lensemble
des oprations de pile est donc en O(n). Linitialisation a une complexit en O(n). Au total, lal-
gorithme a une complexit en temps, dans le pire des cas, en O(n + m).
Application : dtermination des sommets darticulation
Un sommet darticulation dun graphe est un sommet dont la suppression rend le graphe non
connexe. Leur dtermination a plusieurs applications. Par exemple, ils font partie des chemins
critiques rencontrs dans la mthode MPM. On peut montrer que la racine s est un sommet dar-
ticulation si et seulement si s est le prdecesseur de deux sommets distincts dans larbre couvrant
engendr par le parcours en profondeur dabord du graphe, vu comme un graphe non orient.
70
_
_
_
total O(n)

unit. O(1) total O(n)


_

_
total O(m)
_

_
total O(n)
_

_
total O(n +m)
procdure en_profondeur (G, s)
Parcours en profondeur dabord des sommets accessibles partir de s.
dbut
pour tout sommet x faire
colorier x en bleu
i(x) := 0
fait
vider la pile
colorier s en vert et lempiler
tant que la pile nest pas vide faire
x := le sommet de la pile
i(x) := i(x) + 1
trouv := faux
tant que i(x) |succ (x)| et non trouv faire
si succ (i(x), x) est bleu alors
trouv := vrai
sinon
i(x) := i(x) + 1
nsi
fait
si trouv alors
colorier succ (i(x), x) en vert et lempiler
sinon
colorier x en rouge
dpiler x
nsi
fait
n
Application : tri topologique dun graphe acyclique
Cest une application trs importante. Les graphes acycliques sont des graphes plus compliqus
que les arbres mais qui ne prsentent pas toute la difcult des graphes gnraux. On les rencontre
dans de nombreuses applications (chemins de valeur minimale, mthode MPM). Pour ce type de
graphes, on peut souvent concevoir des algorithmes qui sarrangent pour traiter tous les prdeces-
seurs du sommet courant avant de traiter ce sommet. On obtient ainsi des algorithmes beaucoup
plus simples et efcaces que pour les graphes gnraux. Cest le tri topologique qui donne lordre
suivant lequel traiter les sommets.
On considre pour simplier un graphe dont tous les sommets sont accessibles partir de s. La
premire proposition permet de dcider si le graphe comporte un ou plusieurs circuits. La seconde
permet de trier topologiquement les sommets dun graphe acyclique.
71
Proposition 19 Un graphe comporte un circuit si et seulement si, lors dun parcours en profon-
deur, lun des successeurs du sommet x en haut de pile est vert.
Preuve Limplication . On suppose quun des successeurs y du sommet x en haut de pile est
vert et on montre que le graphe comporte un circuit. Les sommets x et y sont verts. Ils sont donc
dans la pile et il existe un chemin de y vers x. Ce chemin forme un circuit avec larc qui va de x
vers y.
Limplication . On suppose que le graphe comporte un circuit et on montre qu une itration
de lalgorithme, lun des successeurs du sommet en haut de pile est vert. Soit C un circuit de G
et y le premier sommet de C rencontr lors dun parcours en profondeur. Le sommet y est vert.
Tous les autres sommets du circuit sont encore bleus. Daprs la proposition 18, ils seront traits et
donc coloris en vert avant que y ne soit colori en rouge. Ce sera le cas en particulier du sommet x
qui prcde y dans C. Lorsque x sera en sommet de pile, le sommet vert y sera dtect.
Le tri topologique des sommets dun graphe acyclique G consiste ranger les sommets dans
un tableau T indic de 1 n de telle sorte que, quel que soit 1 i n, tous les prdecesseurs
dans G du ime lment de T gurent dans T des indices strictement infrieurs i. Le tri
topologique dun graphe G peut tre vu comme un alignement de tous les sommets le long dune
droite horizontale de telle sorte que tous les arcs de G soient orients de la gauche vers la droite.
Le tri topologique na pas de sens pour les graphes non orients ou les graphes avec circuits.
Proposition 20 Pour trier topologiquement un graphe acyclique, il suft denregistrer les som-
mets dans T au fur et mesure quils sont coloris en rouge lors dun quelconque parcours en
profondeur. Le tableau T doit tre rempli de la droite vers la gauche : en partant de lindice n
jusqu lindice 1.
A
B C
D E
A C E B D
Tri topologique dun graphe acyclique
T :
Le tri topologique a la mme complexit en temps dans le pire des cas que le parcours en
profondeur, cestdire O(n + m).
Remarque pratique : pour trier topologiquement un graphe, il nest pas ncessaire de connatre
lavance le sommet s pass en paramtre lalgorithme de parcours en profondeur. On peut le
choisir arbitrairement. Si certains sommets du graphe sont encore bleus aprs le parcours, il suft
de poursuivre le remplissage du tableau T en choisissant arbitrairement un autre sommet s parmi
les sommets bleus et en rappelant lalgorithme de parcours.
72
4.5.3 Calcul du nombre de composantes connexes dun graphe
La fonction donne en gure 4.6, permet de compter le nombre de composantes connexes dun
graphe. Il faut adapter un peu les procdures prcdentes, qui ne doivent plus initialiser la couleur
des sommets. Ce sont les versions pour graphes non orients qui doivent tre appeles.
FIGURE 4.6 Le calcul du nombre de composantes connexes dun graphe est une application im-
mdiate des algorithmes gnriques de parcours
fonction nombre_de_composantes_connexes (G)
dbut
colorier tous les sommets en bleu
compteur := 0
tant que il existe un sommet bleu s faire
en_largeur (G, s) (ou en_profondeur (G, s))
compteur := compteur + 1
fait
retourner compteur
n
4.6 Recherche dun chemin de valeur minimale
Il faut distinguer la recherche dun chemin de valeur minimale de la recherche du plus court
chemin en nombre darcs ou dartes (trait plus haut) qui nen est quun cas particulier. On sin-
tresse dans cette section des graphes valus cestdire dont les arcs a (les artes) sont munis
de valeurs v(a). La valeur dun chemin (dune chane et plus gnralement dun sousgraphe) est
dnie comme la somme des valeurs des arcs (artes) qui le composent. La recherche dun chemin
de valeur minimale na pas de sens dans le cas o le graphe comporte un circuit absorbant cest
dire un circuit dont la valeur est ngative. Dans ce cas, le chemin de valeur minimale est inni
et a pour valeur . On ne dcrit que deux algorithmes qui ne sappliquent pas dans tous les cas
mais souvent en pratique : les algorithmes de Bellman et de Dijkstra. Parmi les grands absents de
cette section, mentionnons lalgorithme de Ford qui sapplique dans tous les cas. Tous ces algo-
rithmes dterminent un chemin de valeur minimale entre un sommet s donn et tous les sommets
accessibles partir de s. Le sommet s est appel une racine. On montre en n de section que le
problme du calcul dun chemin de valeur minimale entre deux sommets donns est la solution
optimale dun programme linaire en variables relles.
4.6.1 Proprits des chemins de valeur minimale
Dnition 18 Soit x un sommet quelconque dun graphe valu G. On note (x) la valeur dun
chemin (dune chane) de valeur minimale de s x (entre s et x). Si x nest pas accessible partir
de s on pose (x) = +.
73
Proposition 21 Sil existe un arc de y vers x alors (x) (y) + v(y, x).
Proposition 22 Tout souschemin dun chemin de valeur minimale est un chemin de valeur mini-
male.
Proposition 23 Pour tout sommet x on a (x) = min
ypred(x)
((y) + v(y, x)).
4.6.2 Cas des graphes sans circuits : lalgorithme de Bellman
FIGURE 4.7 Richard Ernest Bellman (19201984).
Il sapplique aux graphes orients acycliques. Lalgorithme de Bellman met en application un
schma dalgorithme gnral applicable dans de nombreux contextes aux graphes sans circuit :
avant de traiter un sommet x, on peut sarranger pour traiter tous les prdecesseurs de x. Pour
mettre ce schma en application, il suft de trier topologiquement les sommets du graphe. Lalgo-
rithme de Bellman, donn en gure 4.8, calcule (x) pour tout x S en appliquant directement
la proposition 23. Pour des raisons de lisibilit, on distingue la valeur pi(x) calcule de la valeur
thorique (x) recherche.
Complexit. On suppose le graphe reprsent la fois par des listes de successeurs et des listes
de prdecesseurs. Le tri topologique a une complexit en O(n + m). La boucle parcourt tous les
prdecesseurs de tous les sommets. Elle a donc une complexit en temps dans le pire des cas en
O(m). La complexit en temps totale est donc un O(n + m).
74
FIGURE 4.8 Lalgorithme de Bellman
procdure Bellman (G, s)
dbut
trier topologiquement les sommets du graphe G
pi(s) := 0
pred(s) est indni
pour tous les sommets x en suivant lordre topologique faire
dterminer un prdcesseur y de x tel que pi(y) + v(y, x) soit minimal
pred(x) := y
pi(x) := pi(y) + v(y, x)
fait
n
4.6.3 Cas des graphes valus positivement : lalgorithme de Dijkstra
Lalgorithme de Dijkstra sapplique dans le cas de graphes avec circuits. Il suft que tous les
arcs aient des valeurs positives ou nulles.
Le principe de lalgorithme
On suppose que (x) est connu pour tous les sommets rouges x (le traitement est ni pour
eux). On colorie en vert les voisins des sommets rouges (ils sont en cours de traitement) et en bleu
les autres sommets, quon na pas encore commenc traiter.
Sur le graphique cidessous, on suppose reprsents tous les sommets rouges et tous les som-
mets verts.
Question : y atil un sommet vert qui puisse tre colori en rouge ?
Rponse : oui, z, car (z) = 6.
Pourquoi ? Parce que tous les autres chemins de s vers z commencent par des souschemins,
passant par t ou u, de valeurs suprieures 6 et donc, parce que le graphe est valu positivement,
les valeurs de ces autres chemins sont ellesaussi suprieures 6.
De faon gnrale, il suft chaque itration de choisir le chemin de valeur minimale parmi
les chemins partant de s, nempruntant que des sommets rouges et aboutissant un sommet vert.
75
FIGURE 4.9 Edsger Wybe Dijkstra (19302002).
s
y ( = 5)
x ( = 6)
u
rouges
1
2
1
3 t
z
verts
bleus
?
?
?
?
Lalgorithme de Dijkstra est glouton : il effectue un choix local. Le chemin choisi est obtenu
par slection dans un sousensemble de lensemble de tous les chemins possibles (les chemins
qui passent par les sommets bleus ne sont pas considrs). La notion dalgorithme glouton peut se
formaliser. Voir [3, chapitre 16].
Une ralisation
On sintresse lalgorithme donn en gure 4.10. En mme temps que (x), on calcule un
prdecesseur pred(x) de chaque sommet x dans un chemin de valeur minimale de s vers x.
On attribue trois couleurs aux sommets. On associe une variable pi(x) tout sommet x. Pour
76
des raisons de lisibilit, on distingue la valeur pi(x) calcule par lalgorithme de la valeur thorique
(x) quon cherche. La valeur de pi des sommets verts est calcule incrmentalement. Les sommets
bleus sont ceux pour lesquels aucune valeur de pi nest encore connue.
Dnition 19 On dit quun chemin dun sommet s vers un sommet z est un chemin rouge sil ne
passe que par des sommets rouges ( lexception de z ventuellement).
On adopte les invariants de boucle suivants :
1. si z est un sommet vert ou rouge alors pi(z) est la valeur minimale des chemins rouges de s
vers z et pred(z) donne le prdecesseur de z dans un tel chemin ;
2. un sommet rouge a des successeurs verts ou rouges.
FIGURE 4.10 Premire version de lalgorithme de Dijkstra
procdure Dijkstra (G, s)
dbut
colorier tous les sommets sauf s en bleu
colorier s en vert
pi(s) := 0
pred(s) est indni
tant que il existe au moins un sommet vert faire
parmi les sommets verts, en choisir un, x, tel que pi(x) soit minimal
colorier x en rouge
pour tous les successeurs y de x faire
si y est bleu ou (y est vert et pi(y) > pi(x) + v(x, y)) alors
colorier y en vert
pi(y) := pi(x) + v(x, y)
pred(y) := x
nsi
fait
fait
n
Il est vident que lalgorithme sarrte. Supposons les invariants corrects. Lorsque lalgorithme
sarrte, tous les sommets accessibles partir de s sont rouges. Daprs la proposition 23 on a
pi(z) = (z) pour tout sommet z. Il suft donc de prouver les invariants. On les suppose donc
satisfaits au dbut dune itration. Pour montrer quils sont nouveau vrais au dbut de litration
suivante, il suft de montrer la proposition cidessous.
Lemme 1 Tout chemin de valeur minimale de s vers un sommet vert quelconque passe par un
sommet vert z tel que pi(z) = (z).
77
Preuve Considrons en effet un chemin de valeur minimale de s vers un sommet vert quelconque
et notons z le premier sommet vert rencontr sur ce chemin. Le chemin de s vers z est rouge et de
valeur minimale. Daprs le premier invariant, pi(z) = (z).
Proposition 24 Le sommet x slectionn par lalgorithme vrie pi(x) = (x).
Preuve Considrons un chemin de valeur minimale de s vers le sommet vert x slectionn par
lalgorithme. Ce chemin passe, daprs le lemme, par un sommet vert z tel que pi(z) = (z).
Comme les arcs ont des valeurs positives, (z) = pi(z) (x). Le choix fait par la procdure
implique que pi(x) pi(z). Par consquent (z) (x) pi(x) (z) et pi(x) = (x).
Complexit. Si on sy prend navement, lalgorithme de Dijkstra a une complexit en temps dans
le pire des cas en O(n
2
). On verra ensuite que, si on sy prend mieux, on obtient une complexit
en O(mlog n).
Linitialisation a une complexit en O(n). La boucle extrieure est excute O(n) fois puisque
chacun des sommets accessibles partir de s est colori une seule fois en rouge. chaque itration,
la recherche du sommet x tel que pi(x) est minimal cote O(n) comparaisons si on sy prend
navement, ce qui donne O(n
2
) comparaisons au total. Supposons le graphe implant au moyen
de listes de successeurs, la boucle intrieure est excute au total O(m) fois. Au obtient ainsi une
complexit en temps en O(n
2
+m) cestdire en O(n
2
) puisque m n
2
quel que soit le graphe.
Une ralisation plus sophistique
Il est possible de grer lensemble des sommets verts au moyen dune le avec priorit, cest
dire une le dans laquelle les sommets x tels que pi(x) est minimal sortent avant les autres. Une
telle le peut se raliser sous la forme dun tas binaire comportant au maximum n sommets. Les
opration de tas sont linsertion dun nouveau sommet (sommet bleu colori en vert), la mise
jour de la position dun sommet dj prsent (sommet vert dont la valeur de pi est diminue)
et lextraction dun sommet de valeur de pi minimale. Lalgorithme ainsi obtenu est donn en
gure 4.11.
Complexit. Chacune des trois oprations de tas a une complexit en temps dans le pire des
cas en O(log n). Supposons le graphe implant par des listes de successeurs. Le corps de la boucle
intrieure est excut O(m) fois. Chaque excution a une complexit en O(log n), ce qui donne, au
total une complexit en temps dans le pire des cas en O(mlog n) pour la boucle intrieure. Chaque
sommet est extrait du tas et colori en rouge exactement une fois, ce qui donne une complexit
en temps dans le pire des cas en O(nlog n) pour toutes les extractions de sommets. Supposons le
graphe connexe. On trouve : O(nlog n) O(mlog n). La complexit en temps dans le pire des
cas de la boucle extrieure est donc en O(mlog n). En tenant compte des initialisations, on obtient
une complexit en temps dans le pire des cas pour tout lalgorithme en O(mlog n+n) cestdire
en O(mlog n) puisque le graphe est connexe.
Remarque : dans le cas dun graphe complet, on a m = n
2
et la complexit O(n
2
log n) de la
ralisation plus sophistique est moins bonne que celle O(n
2
) de la ralisation nave. La ralisation
sophistique est surtout intressante pour des graphes comportant relativement peu darcs.
78
FIGURE 4.11 Implantation de lalgorithme de Dijkstra avec un tas binaire

total O(n)

unit. O(log n)
total O(nlog n)

unit. O(log n)

unit. O(log n)
_

_
total
O(mlog n)
_

_
total
O(mlog n)
procdure Dijkstra (G, s)
dbut
colorier tous les sommets sauf s en bleu
vider le tas binaire
pi(s) := 0
pred(s) est indni
colorier s en vert et linsrer dans le tas binaire
tant que le tas binaire nest pas vide faire
extraire un sommet x du tas tel que pi(x) soit minimal
colorier x en rouge
pour tous les successeurs y de x faire
si y est bleu alors
pi(y) := pi(x) + v(x, y)
pred(y) := x
colorier y en vert et linsrer dans le tas
sinonsi y est vert et pi(y) > pi(x) + v(x, y) alors
pi(y) := pi(x) + v(x, y)
pred(y) := x
mettre jour la position de y dans le tas
nsi
fait
fait
n
Implantation dun tas binaire
On peut implanter un tas binaire adapt lalgorithme de Dijkstra au moyen dun tableau T
de n sommets indics de 1 n et dun indice f valant le nombre de sommets prsents dans le tas.
On munit le tableau dune structure darbre en posant que les ls gauche et droit de T
i
sont
T
2i
et T
2i+1
. Lide consiste maintenir en permanence la proprit suivante : tout sommet prsent
dans le tas binaire a une valeur de pi infrieure ou gale celle de ses ls gauche et droit.
La structure de donnes ainsi obtenue est parfois appele minimier (une variante du maximier
enseign dans lUE API2).
T
1 n
f
3 5 9 7
79
On remarque que le tas est un arbre binaire quilibr. Sa hauteur en nombre darcs est log
2
f
qui appartient O(log n).
Pour insrer un lment x dans le tas, il suft de le placer lindice f + 1 puis de le permuter
avec son pre tant quil lui est infrieur. Linsertion dun sommet dans un tas de taille n a une
complexit en O(log n).
Llment en T
1
est minimal. Une fois extrait, il faut reconstruire le tas. Pour cela, on place
le dernier lment T
f
en premire place puis on le permute avec le plus petit de ses deux ls tant
quil est suprieur lun des deux. Lextraction dun lment minimal dun tas de taille n a donc
une complexit en O(log n) aussi.
Lopration de misejour de la position dun sommet dj prsent dans le tas dont la valeur
de pi est diminue est une variante de lopration dinsertion mais pose une difcult : pour la
raliser avec une complexit en O(log n), il faut pouvoir dterminer rapidement la position dans
le tas du sommet misjour. Il suft pour cela de se donner un deuxime tableau P de n entiers,
indic par les sommets et de maintenir la proprit suivante : pour tout sommet x prsent dans le
tas, P
x
donne lindice de x dans T.
4.6.4 Modlisation au moyen de programmes linaires
Le calcul dun chemin de valeur minimale entre deux sommets donns peut tre modlis par
un programme linaire en variables relles modlisant ce quon appelle un rseau de transport .
Ces programmes linaires sont des programmes linaires dun type particulier : il y a une variable
par arc (reprsentant des quantits en transit ou ux), les contraintes sont soit des bornes sur les
ots soit des bornes sur la diffrence entre la somme des ots sortants moins la somme des ots
entrants pour chaque sommet. Ces programmes linaires ont de bonnes proprits : si les para-
mtres sont tous des entiers alors le programme admet au moins une solution optimale dont les
coordonnes sont entires. De plus, si le solveur utilis est un solveur qui cherche des solutions
extrmes (comme lalgorithme du tableau simplicial qui cherche des solutions sur les sommets
du polydre des solutions ralisables) alors la solution optimale trouve aura des coordonnes en-
tires. Il existe des solveurs spcialiss pour les programmes linaires modlisant des rseaux de
transport nettement plus efcaces que les solveurs de programmes linaires en variables relles g-
nraux. Le logiciel AMPL offre une syntaxe (que nous ne prsentons pas ici) permettant de mettre
en vidence ce type de structure.
# Fichier chemin_de_valeur_minimale.ampl
set SOMMETS;
# symbolic parce quun paramtre est cens tre un nombre
param depart symbolic in SOMMETS;
param arrivee symbolic in SOMMETS, <> depart;
# ARCS est un sous-ensemble du produit cartsien SOMMETS x SOMMETS
# Les arcs relient des sommets diffrents.
set ARCS within { x in SOMMETS, y in SOMMETS : x <> y };
param valeur {ARCS} >= 0;
# check permet de vrifier que les paramtres satisfont certaines proprits
# On vrifie ici que pour tout arc (x,y) tel que (y,x) existe v(x,y)=v(y,x).
check : forall { (x,y) in ARCS : (y,x) in ARCS }
80
valeur [x,y] = valeur [y,x];
# use [x,y] = 1 ssi le chemin de valeur minimale emprunte (x,y)
var use {ARCS} >= 0;
minimize valeur_totale :
sum { (x,y) in ARCS } use [x,y]
*
valeur [x,y];
subject to au_depart :
sum { (depart,y) in ARCS } use [depart,y] = 1;
# Cette loi est valable pour tous les sommets sauf le dpart et larrive.
subject to loi_de_conservation
{ c in SOMMETS : c <> depart and c <> arrivee } :
sum { (x,c) in ARCS } use [x,c] = sum { (c,y) in ARCS } use [c,y];
data;
set SOMMETS := A B C D;
param depart := B;
param arrivee := D;
# Remarquer la dclaration conjointe de lensemble ARCS et du paramtre valeur
param : ARCS : valeur :=
B A 8
B C 3
C A 2
A C 2
A D 5;
Rsolution.
ampl: model chemin_de_valeur_minimale.ampl;
ampl: solve;
MINOS 5.5: optimal solution found.
1 iterations, objective 10
ampl: display use;
use :=
A C 0
A D 1
B A 0
B C 1
C A 1
;
4.7 Ordonnancement de tches : la mthode MPM
Il sagit dune application directe des mthodes de recherche des chemins de valeur maximale.
On cherche ordonner un ensemble de tches en tenant compte de contraintes temporelles : telle
tche doit tre termine avant que telle autre tche puisse tre commence.
La mthode MPM (ou mthode franaise des potentiels) permet de dterminer un ordonnance-
ment qui minimise le temps total de ralisation du projet, de dterminer la date de dbut au plus
tt et la date de dbut au plus tard de chaque tche, les tches critiques cestdire celles dont
il est impossible de retarder le dbut sans retarder lensemble du projet ainsi que les marges dont
on dispose pour les tches non critiques. On lillustre sur lexemple donn en gure 4.12.
81
FIGURE 4.12 Tches effectuer pour diter un livre (exemple extrait de [4, section 4.3])
Opration Dure Tches
en quinzaines antrieures
a approbation du plan du livre 1 aucune
b signature du contrat 1 a
c remise du manuscrit 12 b
d approbation du comit de lecture 2 c
e composition du texte 3 d
f correction par les correcteurs de limprimerie 1 e
g clichage et tirage des horstexte 3 d
h excution des dessins et gures 4 d
i rvision des dessins par lauteur 1 h
j correction des dessins : clichage des gures 2 i
k premire correction des preuves par lauteur 2 f
excution des premires corrections limprimerie 1 k
m seconde correction des preuves par lauteur 2 g, j,
n excution des secondes corrections limprimerie 1 m
o tirage du livre 2 n
p tablissement de la prire dinsrer, 1 m
des listes dexemplaires presse et dhommage
q pliage 1 o
r brochage 1 q
s reliure de certains exemplaires 2 q
t impression de la prire dinsrer 1/2 p
u envoi des exemplaires presse 1/4 r, t
v envoi des hommages 1/8 s, t
w envoi des contingents aux libraires 1/2 r, s
Le problme dordonnancement peut se reprsenter par un graphe orient et sans circuit. On
associe un sommet chacune des tches. On rajoute deux tches articielles : D (pour dbut) et F
(pour n). Un arc dun sommet s vers un sommet t signie que la tche s doit tre termine avant
que t puisse commencer. La valeur de larc est la dure de la tche s.
82
D a b c d
e
g
h
f k

m
i j
n o q
r
s
w
v
p
t
u
F
0 1 1 12
2
2
2
3
1
2
1
4 1
2
2
1 2
1
1
1
1
1
1/2
1/2
2
1/8
1/4
1/2
2
3
2
Il est souvent plus pratique de le reprsenter par un tableau construit comme suit. On attribue
une colonne chaque tche du tableau.
: 1
j : 2
g : 3
m m
g : 3
j : 2
l : 1
23
16
21
22
prdecesseurs immdiats
avec leur dure
tche concerne
date de dbut au plus tt
des prdecesseurs de la
date de dbut au plus tt
de la tche m
tche m
tat initial dune colonne du tableau tat nal dune colonne du tableau
Lalgorithme est simple (il applique le principe mme de lalgorithme de Bellman). Supposons
connues les dates de dbut au plus tt
1
, . . . ,
n
de toutes les tches antrieures t
1
, . . . , t
n
dune
tche t. Il est alors facile de calculer la date de dbut au plus tt de t : en notant d
1
, . . . , d
n
les
dures des tches t
1
, . . . , t
n
on a
=
n
max
i=1
(
i
+ d
i
).
Au fur et mesure quon calcule ces dates de dbut au plus tt, on les reporte dans les sous
colonnes de gauche des colonnes du tableau. La date de dbut au plus tt de la tche F donne la
dure totale du projet (sur lexemple, 31 quinzaines et demie).
On encadre ensuite les tches critiques dans le tableau. Ce sont celles quon ne peut pas retarder
sans retarder la dure totale du projet. Elles se calculent en partant de la n. La tche F est critique.
Si t est critique alors, parmi les tches prdecesseurs de t, sont critiques les tches t
i
telles que

i
+d
i
= . Un chemin critique est un chemin de D F uniquement compos de tches critiques.
Il y a deux chemins critiques sur lexemple.
Voici le tableau aprs calcul des tches critiques.
83
0 a 1 b 2 c 14 d 16 e 19 f
0 D : 0 0 a : 1 1 b : 1 2 c : 12 14 d : 2 16 e : 3
16 g 16 h 20 i 21 j 20 k 22
14 d : 2 14 d : 2 16 h : 4 20 i : 1 19 f : 1 20 k : 2
23 m 25 n 26 o 25 p 28 q 29 r
16 g : 3
21 j : 2
22 : 1
23 m : 2 25 n : 1 23 m : 2 26 o : 2 28 q : 1
29 s 26 t 30 u 31 v 31 w 31
1
2
F
28 q : 1 25 p : 1 29 r : 1
26 t :
1
2
26 t :
1
2
29 s : 2
29 r : 1
29 s : 2
30 u :
1
4
31 v :
1
8
31 w :
1
2
On dtermine enn la date de dbut au plus tard de chaque tche, cestdire la date aprs
laquelle on ne peut pas retarder le dbut de la tche sans retarder lensemble du projet. Pour les
tches critiques la situation est simple : la date de dbut au plus tt est gale la date de dbut au
plus tard. Les autres dates de dbut au plus tard se dterminent ellesaussi en partant de la n :
supposons dtermines les dates de dbut au plus tard

1
, . . . ,

n
de toutes les tches successeurs
dune tche t et notons d la dure de t. On a

=
n
min
i=1
(

i
d).
Remarque : les problmes dordonnancement snoncent assez facilement sous la forme de
programmes linaires en variables relles : les dates de dbut au plus tt et au plus tard des tches
peuvent donc se calculer aussi grce au simplexe.
4.8 Flots de valeur maximale
On considre un rseau de transport cestdire un triplet (G, s, t) o G = (S, A) est un
graphe orient valu positivement et s, t S sont deux sommets distingus appels source et
destination du rseau. La restriction une seule source et une seule destination nest pas trs
importante : on peut toujours y ramener un rseau plusieurs sources ou destinations en ajoutant
une source ou une destination articielles (appeles souvent supersource et superdestination). On
suppose tous les sommets accessibles partir de s. On suppose t accessible partir de tout sommet.
84
Les valeurs des arcs de G sont appeles les capacits des arcs. On note c(u, v) la capacit de
larc (u, v). Si (u, v) / A on pose c(u, v) = 0. Voici un exemple de rseau de transport.
s
w
x
y
t
z
16
13
10
4
9
7
20
4
12
14
Le problme rsoudre consiste dterminer le ot maximal pouvant transiter par le rseau.
chaque arc (u, v) du rseau, on associe une variable, appele le ux transitant par cet arc.
Dnition 20 (dnition des ux)
Un ux est une fonction f : S S R satisfaisant les axiomes :
1. f(u, v) c(u, v) pour tous u, v S (contrainte de capacit) ;
2. f(u, v) = f(v, u) pour tous u, v S ;
3.

vS
f(u, v) = 0 pour tout sommet u autre que s et t (loi de conservation des ux).
Dnition 21 (dnition des ots)
Un ot est la donne dun rseau de transport et dun ux. La valeur dun ot est la somme
des ux partant de la source.
On montre facilement que cette valeur est gale la somme des ux arrivant sur la destination.
Voici un exemple de ot (on note ux/capacit) de valeur 15. Vrions le troisime axiome au
niveau du sommet y :

vS
f(y, v) = (12) + 4 + (7) + 15 = 0.
On remarque quon na considr dans la somme que les sommets voisins de y : si v nest pas voisin
de y alors c(y, v) = c(v, y) = 0 et f(y, v) = f(v, y) = 0 daprs les deux premiers axiomes. On
remarque aussi que f(y, w) = f(w, y) = 12 daprs le deuxime axiome.
s
w
x
y
z
t
11/16
4/13
0/10
1/4
4/9
12/12
7/14
7/7
15/20
0/4
Lalgorithme de FordFulkerson est un algorithme incrmental : il part dun ot de valeur
initialement nulle et tente daugmenter sa valeur petit petit. La question est : tant donn un ot,
85
comment augmenter sa valeur ? Une faon vidente consiste chercher un chemin de s vers t form
darcs non saturs, cestdire darcs tiquets f/c tels que f < c. Le chemin (s, x), (x, z), (z, t)
quon peut encore noter s x z t en fournit un exemple. Le long de ce chemin amliorant,
on peut augmenter le ux (et donc la valeur du ot) du minimum des carts entre les capacits
et les ux cestdire de = min(13 4, 14 7, 4 0) = 4. On obtient un nouveau ot de
valeur 19.
s
w
x
y
z
t
11/16
8/13
0/10
1/4
4/9
12/12
11/14
7/7
15/20
4/4
On peut encore augmenter la valeur du ot mais il ny a plus de faon vidente de le faire. Un
rapide coup dil montre que les 4 units transitant de y vers x vont dans le mauvais sens :
en effet, pour arriver la destination, ces units devraient passer par w ou par z et tous les arcs
partant de ces deux sommets sont saturs. Une solution consiste diminuer de 4 le ux de y vers x
et daugmenter de 4 le ux de y vers t. Bien sr, pour maintenir la loi de conservation des ux, il
faut augmenter de 4 le ux de s vers x. On obtient ainsi un nouveau ot de valeur 23.
s
w
x
y
z
t
11/16
12/13
0/10
1/4
0/9
12/12
11/14
7/7
19/20
4/4
La suite darcs (s, x), (y, x), (y, t) ne forme plus un chemin mais une chane amliorante, quon
peut noter s x y z pour mieux faire ressortir larc (y, x) qui est parcouru lenvers. Plus
prcisment,
Dnition 22 (dnition des chanes amliorantes)
Une chane amliorante est une chane lmentaire entre s et t compose darcs (u, v) directs
(parcourus dans le sens de la che) ou indirects (parcourus en remontant la che) tels que
1. si (u, v) est direct alors (u, v) =
def
c(u, v) f(u, v) > 0,
2. si (u, v) est indirect alors (u, v) =
def
f(v, u) > 0.
Le long dune chane amliorante, il est possible daugmenter le ux de la quantit , gale
au minimum des (u, v) pour tous les arcs (u, v) appartenant la chane. Remarquer quil ne
suft pas dnumrer les sommets des chanes amliorantes : il faut prciser les arcs emprunts.
Lalgorithme de Ford et Fulkerson est donn en gure 4.13.
86
FIGURE 4.13 Le schma dalgorithme de FordFulkerson
procdure Ford_Fulkerson (G, s, t)
dbut
initialiser f(u, v) zro pour tout arc (u, v) A
tant que il existe une chane amliorante faire
calculer
pour tout arc (u, v) de la chane faire
augmenter f(u, v) de si (u, v) est direct
diminuer f(v, u) de si (u, v) est indirect
fait
fait
n
Une faon efcace de dterminer sil existe une chane amliorante entre s et t consiste tenter
de la construire partir de s en adaptant le parcours en largeur dabord dun graphe non orient,
plus prcisment la fonction plus_courte_chane. On obtient la fonction donne en gure 4.14.
Cette faon de faire fournit la variante de lalgorithme de FordFulkerson dite dEdmondsKarp.
Il y a plusieurs diffrences visvis de lalgorithme gnrique de parcours : on ne suit un arc
que sil est susceptible de faire partie dune chane amliorante (sil est direct et pas satur ou
indirect avec un ux non nul). On sarrte ds que la destination est atteinte. On implante enn
une fonction plutt quune procdure. La fonction retourne vrai sil existe une chane amliorante
et faux sinon. Si la chane existe, on lobtient partir de la destination du rseau en suivant les
pointeurs pred. En mme temps que la chane, on calcule pour chaque sommet x un entier d(x)
gal la longueur minimale des chanes amliorantes entre s et x. Ce compteur ne contribue pas
lalgorithme. Il est utilis dans le calcul de complexit.
La fonction chane_amliorante_? applique au ot obtenu prcdemment retourne faux. Voici
le coloriage obtenu la n de lexcution.
s
w
x
y
z
t
11/16
0/10
1/4
12/12
11/14
7/7
4/4 12/13
0/9
19/20
sommets rouges sommets bleus
coupe C
87
FIGURE 4.14 La fonction chane_amliorante_ ? recherche la chane amliorante la plus courte
possible dans un ot. Muni de cette fonction, le schma dalgorithme de FordFulkerson devient
lalgorithme dEdmondsKarp.
fonction chane_amliorante_ ? (G, s, t, f)
dbut
colorier tous les sommets en bleu sauf s
vider la le
d(s) := 0
pred(s) est indni
colorier s en vert et lenler
tant que la le nest pas vide et t nest pas rouge faire
dler x
pour tout voisin bleu y de x faire
si larc est direct et pas satur ou indirect avec un ux non nul . . .
si (x, y) A et c(x, y) > f(x, y) ou (y, x) A et f(y, x) > 0 alors
colorier y en vert et lenler
d(y) := d(x) + 1
pred(y) := x
nsi
fait
colorier x en rouge
fait
retourner t est rouge
n
4.8.1 Correction
chaque fois que la fonction chaine_amliorante_? retourne vrai la valeur du ot est aug-
mente dune quantit > 0. Elle nest donc pas maximale. Il suft de prouver que le ot est
maximal lorsque la fonction retourne faux.
Dnition 23 (dnition des coupes)
On obtient une coupe dun rseau de transport en coloriant une partie des sommets (dont la
source) en rouge et lautre partie (dont la destination) en bleu.
Lorsquelle retourne faux, la fonction chane_amliorante_? exhibe une coupe (voir le dessin
cidessus). Ces coupesl sont particulires puisque les sommets rouges sont ncessairement relis
entre eux. La dnition que nous avons adopte est plus gnrale et plus simple.
Dnition 24 (ux et capacit dune coupe)
Supposons xe une coupe dun rseau de transport. Le ux traversant la coupe est la somme
des ux f(u, v) tels que u est rouge et v est bleu ; la capacit de la coupe est la somme des capacits
c(u, v) telles que u est rouge et v est bleu.
88
Bien que les dnitions soient trs semblables, les ux et les capacits des coupes ne se cal-
culent pas de la mme faon, en raison des arcs qui vont du bleu vers le rouge :
rouge bleu
f/c la contribution au ux de C est f
la contribution la capacit de C est 0
C
Considrons la coupe C obtenue la n de lexemple (voir le dessin la n de la section
prcdente). Sa capacit vaut 12 + 7 + 4 = 23. Le ux qui la traverse vaut aussi 12 + 7 + 4 = 23.
Considrons maintenant la mme coupe mais avec le ot obtenu ltape prcdente (dessin ci
dessous). Le ux qui la traverse vaut 12 + (4) + 7 + 4 = 19. Sa capacit na pas chang.
s
w
x
y
z
t
11/16
0/10
1/4
12/12
11/14
7/7
4/4 8/13
4/9
15/20
sommets rouges sommets bleus
coupe C
Lemme 2 Le ux traversant une coupe est infrieur ou gal sa capacit.
La proposition suivante est une proposition clef.
Proposition 25 La valeur du ot est gale au ux traversant nimporte quelle coupe du rseau.
Preuve Par rcurrence sur le nombre de sommets rouges.
Base de la rcurrence. Il y a toujours au moins un sommet rouge : la source. Si seule la source
est rouge alors le ux traversant la coupe est gal la valeur du ot, par dnition du ot.
source
rouge
bleu bleu
bleu
destination
bleue
6/7
3/3
3/5
1/5
2/4
4/6
Quand seule la source est rouge, le ux traversant la coupe est gal la valeur du ot, par dnition
Cas gnral. On considre une coupe quelconque dont au moins deux sommets sont bleus. On
suppose par rcurrence que cette coupe vrie la proposition. On colorie lun des sommets bleus
en rouge (pas la destination, bien sr). On doit montrer que la nouvelle coupe vrie encore la
89
proposition. Plutt que dcrire rigoureusement la preuve, on illustre largument clef sur lexemple
prcdent.
source
rouge
bleu
bleu
destination
bleue
6/7
3/3
3/5
1/5
2/4
4/6
rouge
Le ux traversant la nouvelle coupe est gal lancien ux + (3) + 1 + 2

=0
(loi de conservation des ux)

On peut vrier la proposition sur les exemples prcdent. Elle implique immdiatement que
la valeur dun ot est gale la somme des ux arrivant sur la destination. Combine au lemme,
elle implique la proposition suivante.
Proposition 26 La valeur dun ot est infrieure ou gale la capacit de toutes les coupes du
rseau. En particulier, un ot de valeur gale la capacit dune coupe est ncessairement maxi-
mal.
Lorsquelle retourne faux, la fonction chane_amliorante_? exhibe une coupe dont le ux
est gal la capacit. Le ot est donc maximal et lalgorithme est correct. On peut montrer plus
gnralement le thorme suivant.
Thorme 12 (ot maximal et coupe minimale)
Le ot maximal pouvant transiter par un rseau de transport est gal la capacit minimale
des coupes du rseau.
On remarque quon a affaire une dualit (cf. lintroduction de la section sur la dualit dans
le chapitre consacr au simplexe) : maximiser le ot pouvant transiter par un rseau de transport
quivaut minimiser les capacits des coupes du rseau. Cette dualit fournit un outil permettant
de dmontrer quune solution ralisable (un ux quelconque) est optimal.
4.8.2 Complexit
La variante dEdmondsKarp de lalgorithme de FordFulkerson a une complexit en temps
dans le pire des cas en O(nm
2
) o n dsigne le nombre de sommets et m le nombre darcs.
Dautres implantations de lalgorithme de FordFulkerson ont dautres complexits. Si on sy
prend mal, lalgorithme peut mme ne pas sarrter.
Lentier d(u) calcul par la fonction chane_amliorante_? fournit la longueur minimale des
chanes amliorantes entre s et u. Le lemme 3 cidessous montre que, quel que soit u, cette
longueur crot au sens large chaque itration o elle est calcule. Dans lanalyse qui suit, on
note d
i
(u) la valeur de d(u) litration i.
90
Dnition 25 (dnition des arcs critiques)
Un arc appartenant une chane amliorante est dit critique pour cette chane sil est direct et
devient satur ou sil est indirect et son ux devient nul aprs augmentation du ux le long de la
chane.
Si un arc direct (respectivement indirect) est critique une certaine itration, il peut nouveau
apparatre dans une chane amliorante une autre itration mais il est alors forcment indirect
(respectivement direct). Voir le schma cidessous. Ces considrations, combines au lemme 3, et
au fait que lentier d ne peut pas excder le nombre n de sommets, montre quun arc ne peut tre
critique que O(n) fois.
Toute chane admet au moins un arc critique. Il y a m arcs. La fonction chane_amliorante_?
ne peut donc tre appele que O(nm) fois. Chaque appel cette fonction a une complexit en
temps, dans le pire des cas, en O(m). Par consquent, lalgorithme dEdmondsKarp a une com-
plexit en temps, dans le pire des cas, en O(nm
2
).
source u v destination
d
i
(u) d
i
(v) = d
i
(u) + 1
u v source destination
arc critique (direct ou indirect)
chane amliorante litration i
d
j
(u) = d
j
(v) + 1 d
j
(v)
(daprs le lemme)
chane amliorante une itration j > i
si on suppose que cest la premire itration o larc (u, v)
rapparat, alors il est pris dans lautre sens qu litration i
Lemme 3 Quel que soit le sommet v, lentier d(v) augmente au sens large chaque itration o
il est calcul.
Preuve On raisonne par labsurde. On suppose quil existe un indice i et un sommet v tel que
d
i
(v) > d
i+1
(v) et on cherche une contradiction. Si plusieurs sommets v peuvent tre choisis, on
considre celui pour lequel d
i+1
(v) est minimal.
Dans le parcours effectu par la fonction chane_amliorante_? litration i + 1, notons u le
prdecesseur de v. On a d
i+1
(u) = d
i+1
(v) 1. En raison de lhypothse de minimalit faite sur v,
on a d
i
(u) d
i+1
(u).
litration i, le sommet u est accessible depuis la source par la fonction chane_amliorante_?
sinon u serait inaccessible aussi litration i + 1.
Dans le parcours ltape i, le sommet u ne peut pas tre atteint aprs v sinon on aurait
d
i
(u) > d
i
(v) > d
i+1
(v) > d
i+1
(u), ce qui contredirait le fait que d
i
(u) d
i+1
(u).
Dans le parcours ltape i, le sommet u doit donc tre atteint avant v. Larc (u, v) (di-
rect ou indirect), qui est emprunt litration i + 1, est empruntable litration i. Comme
chane_amliorante_? ralise un parcours en largeur dabord, il est donc emprunt litration i et
91
on a d
i
(v) = d
i
(u) +1. Mais alors d
i
(u) +1 d
i+1
(u) +1 = d
i+1
(v), ce qui contredit lhypothse
que d
i
(v) > d
i+1
(v).
Cette dernire contradiction conclut la preuve du lemme.
4.8.3 Modlisation au moyen de programmes linaires
Le calcul du ot de valeur maximal pouvant transiter par un rseau de transport se modlise
trs facilement par un programme linaire en variables relles. Voir les remarques faites en sec-
tion 4.6.4. La grande puissance dexpression des programmes linaires permet galement de traiter
facilement beaucoup de variantes du problme du ot maximal (ot maximal cot minimal, ot
avec perte du ux le long des arcs . . .). Voici un programme linaire modlisant le problme pr-
cdent.
# Fichier flot_maximal.ampl
set SOMMETS;
param source symbolic in SOMMETS;
param destination symbolic in SOMMETS;
set SOMMETS_INTERNES := SOMMETS diff {source, destination};
set ARCS within {SOMMETS, SOMMETS};
param capacite {ARCS} >= 0;
var flux {(x,y) in ARCS} >= 0, <= capacite [x,y];
maximize valeur_du_flot :
sum {(source,x) in ARCS} flux [source,x];
subject to loi_de_conservation {x in SOMMETS_INTERNES} :
sum {(y,x) in ARCS} flux [y,x] = sum {(x,y) in ARCS} flux [x,y];
data;
set SOMMETS := s, w, x, y, z, t;
param source := s;
param destination := t;
param : ARCS : capacite :=
s w 16
s x 13
w y 12
x w 4
w x 10
y x 9
x z 14
z y 7
z t 4
y t 20;
Rsolution en AMPL. On trouve un ot maximal un peu diffrent. La valeur du ot maximal
est bien sr la mme.
ampl: model flot_maximal.ampl;
ampl: solve;
92
MINOS 5.5: optimal solution found.
0 iterations, objective 23
ampl: option display_1col 0;
ampl: display flux;
flux [
*
,
*
]
: t w x y z :=
s . 12 11 . .
w . . 0 12 .
x . 0 . . 11
y 19 . 0 . .
z 4 . . 7 .
;
4.9 Arbres couvrants de valeur minimale
Dnition 26 Un arbre est un graphe non orient, connexe et sans cycle.
Les arbres de la thorie des graphes sont diffrents des arbres quon rencontre traditionnelle-
ment en programmation. Pour viter les confusions, on appelle ces derniers des arborescences
en tous cas dans cette section. Voici deux diffrences : les arborescences sont souvent implantes
en utilisant des pointeurs qui seraient mieux reprsents par des arcs que par des artes ; dans une
arborescence, on distingue lun des sommets : la racine.
Un arbre est un graphe planaire admettant une seule face. Daprs le thorme dEuler sur les
graphes planaires, un arbre comporte donc n1 artes. Le thorme suivant recense les diffrentes
caractrisations des arbres.
Thorme 13 Soit G = (S, A) un graphe non orient ayant n sommets. Les proprits suivantes
sont quivalentes.
1. G est un arbre,
2. G est connexe et possde n 1 artes,
3. G est sans cycle et possde n 1 artes,
4. pour tous sommets x, y S il existe une unique chane lmentaire dextrmits x et y,
5. G est connexe mais, quelle que soit larte de A, il ne lest plus si on lui retire cette arte,
6. G est sans cycle mais, quelle que soit larte de S S, il ne lest plus si on lui ajoute cette
arte.
Lalgorithme de Kruskal, invent en 1956, permet de calculer un arbre couvrant de valeur mi-
nimale dun graphe connexe G. Il applique une stratgie gloutonne. Aucune racine nest prcise.
Lalgorithme, donn dans la gure 4.16, maintient linvariant suivant :
1. T est inclus dans un arbre couvrant de valeur minimale de G.
93
FIGURE 4.15 Joseph Bernard Kruskal (1928 )
Aussi bien dans lalgorithme que dans les analyses qui le suivent, T est un ensemble dartes. En
toute rigueur, ce nest donc pas un graphe puisque lensemble des sommets nest pas prcis. Cet
abus de langage allge considrablement les notations et ne cre pas de confusion.
Appliqu au graphe suivant, lalgorithme slectionne larte de valeur 1 puis celle de valeur 2.
Pour les artes de valeur 3, il doit choisir soit (B, C) soit (E, C). On voit que le rsultat calcul
nest pas dni de faon unique. Il slectionne aussi les artes (A, F) et (G, D). Pour les artes de
valeur 4, il doit choisir soit (G, F) soit (D, E). Aucune autre arte ne peut ensuite tre rajoute.
Le nombre dartes est gal au nombre de sommets moins un.
A
G F
B
D
C
5
4
3
E
6
3
1
2 3
4
3
5
3
4
Il est vident que lalgorithme sarrte.
Considrons le graphe T retourn par lalgorithme.
Quelle que soit larte a de A \ T, le graphe T {a} comporte un cycle donc, comme G est
connexe, T lest aussi. Par construction, T est sans cycle. Par consquent, daprs le thorme (le
point 1), T est un arbre. Largument qui prouve la connexit de T prouve aussi que T couvre G.
Le graphe T est donc un arbre couvrant de G.
Deux arbres couvrants de G ont le mme nombre dartes daprs le thorme.
94
FIGURE 4.16 Premire version de lalgorithme de Kruskal
fonction Kruskal (G)
Retourne un arbre couvrant de valeur minimale de G
dbut
T :=
trier les artes par valeur croissante
pour chaque arte (x, y) par valeur croissante faire
si T {(x, y)} est sans cycle alors
T := T {(x, y)}
nsi
fait
retourner T
n
Donc, si on suppose linvariant vri, T est gal un arbre couvrant de valeur minimale de G
et lalgorithme est correct.
Il ne reste plus qu montrer linvariant.
Proposition 27 La proprit T est inclus dans un arbre couvrant de valeur minimale de G est
un invariant de boucle de lalgorithme de Kruskal.
Preuve Initialement, T est vide et la proprit est vrie.
Le cas gnral. On suppose T inclus dans un arbre couvrant minimal

T de G. On note (x, y)
larte choisie par lalgorithme. On doit montrer que T {(x, y)} est inclus dans un arbre couvrant
minimal

T

de G (attention : ce nest pas forcment



T car le graphe G peut admettre plusieurs
arbres couvrants minimaux).
On utilise une technique de preuve fonde sur la notion de coupe dun graphe, proche de la
technique employe pour FordFulkerson.
Le graphe T est form dune ou plusieurs composantes connexes. On obtient une coupe de G
en coloriant certains sommets en rouge et les autres en bleu de telle sorte quaucune arte de T
ne soit bicolore. Parmi toutes les coupes possibles, on en considre une, C, telle que (x, y) soit
bicolore.
rouges
bleus
x
y
coupe C
95
Larbre

T contient au moins une arte bicolore sinon il ne serait pas connexe. Sil contient
(x, y), la proposition est prouve. Supposons donc quil ne la contienne pas. Il contient une chane
dextrmits x et y avec laquelle larte (x, y) forme un cycle. Cette chane contient au moins une
arte bicolore (x

, y

) puisque x et y sont de couleurs diffrentes. Cette arte nappartient pas T


car elle est bicolore.
rouges
bleus
x
y
x

coupe C
Notons

T

le graphe (

T \{(x

, y

)}) {(x, y)} obtenu en substituant (x, y) (x

, y

) dans

T. Le
graphe

T

comporte une chane dextrmits x

et y

passant par (x, y). Comme



T est connexe, le
graphe

T

lest donc aussi. Le graphe



T

comporte le mme nombre dartes que



T. Par consquent,
daprs le thorme (point 2),

T

est un arbre. Largument qui prouve que



T

est connexe prouve


aussi que

T

couvre G.
Larte (x, y), qui est de valeur minimale parmi les artes quil est possible dajouter T
sans former de cycle, est donc minimale parmi les artes bicolores et on a v(x

, y

) v(x, y).
Comme v(

) = v(

T) v(x

, y

) +v(x, y) on a v(

) v(

T). Comme

T est de valeur minimale,
v(

) v(

T) et les deux arbres ont mme valeur. Par consquent, T {(x, y)} est inclus dans un
arbre,

T

, de valeur minimale parmi les arbres couvrants de G.


4.9.1 Implantation de lalgorithme de Kruskal
Il sagit de tester efcacement si T {a} est sans cycle ou, ce qui revient au mme, si les deux
extrmits de a appartiennent la mme composante connexe. Les composantes connexes de T
sont les classes dquivalence de la relation : x est quivalent y si x est accessible partir de y.
T {(x, y)} est sans cycle si et seulement si x y.
Dans lalgorithme donn en gure 4.17, on convient de reprsenter chaque classe par un de ses
lments, appel reprsentant canonique de la classe. tre capable de calculer, pour chaque classe
dquivalence, un reprsentant canonique, permet de transformer les quivalences en galits. Ce
principe gnral est le fondement dun grand nombre dalgorithmes et de thories extrmement
importants
5
.
x y si et seulement si rep. canonique (x) = rep. canonique (y).
5. Dans le cadre de la thorie des bases de Grbner par exemple, ce principe permet de dcider si deux expressions
polynomiales en plusieurs variables sont quivalentes, sachant que les variables sont lies par un ensemble de relations
polynomiales.
96
chaque fois quune arte (x, y) est ajoute T, les sommets x et y doivent tre dclars qui-
valents. Il faut donc pouvoir fusionner les deux classes en une seule.
FIGURE 4.17 Deuxime version de lalgorithme de Kruskal
_
total O(n)

total O(mlog m)
_

_
total O(mlog n)
_

_
total O(mlog m)
fonction Kruskal (G)
Retourne un arbre couvrant de valeur minimale de G
dbut
T :=
pour chaque sommet x faire
crer la classe dquivalence {x}
fait
trier les artes par valeur croissante
pour chaque arte (x, y) par valeur croissante faire
si x et y ont des reprsentants canoniques diffrents alors
fusionner la classe de x et celle de y en une seule
T := T {(x, y)}
nsi
fait
retourner T
n
Complexit. La boucle initiale a une complexit en O(n). Le tri des artes a une complexit en
O(mlog m). Lalgorithme effectue O(m) oprations sur les classes dquivalence. On montre dans
le paragraphe suivant que chaque opration de classe dquivalence a une complexit en O(log n).
La boucle nale a donc une complexit en temps, dans le pire des cas, en O(mlog n).
Le graphe est suppos connexe, donc m n 1 et la complexit totale de lalgorithme de
Kruskal est domine par celle du tri des artes : O(n) +O(mlog m) +O(mlog n) = O(mlog m).
Implantation des classes dquivalence
Reste prciser comment implanter les relations dquivalence. La structure de donnes ex-
pose ici est connue sous le nom densembles disjoints. tout sommet x on associe un pointeur
pre(x) et un compteur h(x). Chaque classe dquivalence est reprsente par une arborescence
(voir la dnition en dbut de section). Les arcs sont donns par les pointeurs pre. Le reprsen-
tant canonique de la classe est la racine de larborescence. Le compteur h(x), dont lutilit est
heuristique, vaut la hauteur de larborescence des prdecesseurs de x. Lexemple suivant montre
une implantation de deux classes dquivalence {x, y, t, u} de reprsentant canonique t et {z} de
reprsentant canonique z.
97
h(x) x pre(x)
x
y
u
t 2
1
0
0
z 0
Pour fusionner les classes dquivalence de deux sommets x et z (on raisonne sur lexemple),
on dtermine les reprsentants canoniques t et z des classes des deux sommets puis, soit on affecte t
pre(z) soit on affecte z pre(t). Ce sont les compteurs c qui permettent de choisir : on affecte t
pre(z) parce que h(t) > h(z).
h(x) x pre(x)
x
y
u
t 2
1
0
0
z 0
Ce choix heuristique ralentit la croissance de la hauteur de larborescence et acclre donc les
accs aux reprsentants canoniques. La misejour des compteurs c est trs facile : dans le cas o
on fusionne deux classes dquivalence de hauteurs diffrentes, ils ne sont pas modis. Dans le
cas o on fusionne deux classes dquivalence de mme hauteur, il suft dincrmenter le compteur
associ au reprsentant canonique de la nouvelle classe.
Le raisonnement lmentaire suivant montre quil faut au moins 2
k
sommets pour produire une
classe de hauteur k. Comme une classe comporte au plus n lments, chaque accs au reprsentant
canonique dune classe (et donc chaque opration de classe dquivalence) a une complexit en
O(log n).
hauteur h(x)
conguration
minimale
nombre de
sommets
0 1 2 3
1 2 4 8
2
n1
2
n1
n
2
n
Combien de sommets faut-il au minimum pour obtenir une classe dune hauteur donne ?
98
Maintenant, on peut appliquer une deuxime heuristique naturelle qui namliore pas la com-
plexit de lalgorithme de Kruskal mais qui amliore la complexit [3, chapitre 21] des oprations
sur les classes dquivalence. On raisonne toujours sur lexemple. chaque fois quon dtermine
le reprsentant canonique de la classe dun sommet (mettons) x, on peut aprs coup affecter
pre(x) ladresse de ce reprsentant canonique et ainsi courtcircuiter le sommet intermdiaire y.
Cette heuristique a un effet secondaire : les compteurs h(y) et h(t) ne donnent plus exactement les
hauteurs des arborescences de prdecesseurs des sommets y et t mais des bornes suprieures sur
ces hauteurs.
h(x) x pre(x)
x
y
u
t 2
1
0
0
z 0
99
Chapitre 5
Complments sur le langage AMPL
5.1 Les commentaires
Voici deux faons dinclure des commentaires dans un modle AMPL.
/
*
Ceci est un commentaire rdig sur
plusieurs lignes.
*
/
var x >= 0; # en euros/tonne
5.2 Les paramtres
5.2.1 Paramtres indics par un mme ensemble
Considrons lexemple suivant.
set PROD;
param prix_achat {PROD};
param prix_vente {PROD};
data;
set PROD := A B F;
param prix_achat :=
A 10
B 37
F 17;
param prix_vente :=
A 12
B 29
F 20;
Comme prix_achat et prix_vente sont indics par un mme ensemble, il est possible de dclarer
les deux dun coup.
100
data;
set PROD := A B F;
param : prix_achat prix_vente :=
A 10 12
B 37 29
F 17 20;
Il est mme possible de dclarer en une fois non seulement les deux paramtres mais aussi
lensemble PROD. Il suft de procder comme suit :
data;
param : PROD : prix_achat prix_vente :=
A 10 12
B 37 29
F 17 20;
5.2.2 Paramtres indics par deux ensembles
Le premier indice est lindice de ligne. Le second est lindice de colonne. Si on sest tromp, on
peut insrer (tr) entre lidenticateur du paramtre et le : dans la partie data , indiquant
ainsi quon donne la transpose de la matrice.
set PLATS;
set VITAMINES;
param apport {PLATS, VITAMINES};
data;
set PLATS := potjevleesch carbonnade waterzoi;
set VITAMINES := A C D;
param apport :
A C D :=
potjevleesch 18 20 44
carbonnade 5 30 69
waterzoi 40 5 30;
5.2.3 Laisser des valeurs indnies
Il suft de mettre un . la place de la valeur indnie. En voici une utilisation lors de la
dnition dune matrice symtrique.
param N integer >= 1;
param matsym {lig in 1 .. N, lig .. N} >= 0;
data;
param N := 3;
param matsym :
1 2 3 :=
101
1 4 5 8
2 . 7 11
3 . . 2;
5.2.4 Paramtres indics par trois ensembles
Voici un exemple de dclaration dun paramtre cube trois dimensions.
# fichier cube
set INDICES := 1 .. 2;
param cube {INDICES, INDICES, INDICES};
data;
param cube :=
[
*
,
*
, 1] : 1 2 :=
1 3 5
2 4 6
[
*
,
*
, 2] : 1 2 :=
1 2 11
2 0 7;
5.3 Lafchage
Le format dafchage par dfaut du paramtre cube (le format liste ) nest pas trs agrable.
ampl: model cube;
display cube;
cube :=
1 1 1 3
1 1 2 2
1 2 1 5
1 2 2 11
2 1 1 4
2 1 2 0
2 2 1 6
2 2 2 7
;
On peut obtenir un afchage sous forme plus compacte en modiant la valeur de la variable
prdnie display_1col, qui contient la taille en dessous de laquelle les donnes sont afches
au format liste . Par dfaut sa valeur est 20. Pour forcer lafchage du cube sous forme plus
compacte, il suft donc daffecter display_1col une valeur infrieure au nombre dlments de
cube. Par exemple zro.
ampl: option display_1col 0;
ampl: display cube;
cube [1,
*
,
*
]
: 1 2 :=
102
1 3 2
2 5 11
[2,
*
,
*
]
: 1 2 :=
1 4 0
2 6 7
;
5.4 Les ensembles
5.4.1 Les ensembles non ordonns
On signale au passage lexistence de la fonction card.
set PROD;
param nb_prod := card (PROD);
5.4.2 Les intervalles
Les intervalles sont des ensembles de nombres ordonns (on peut spcier by pas si on le
souhaite).
param N >= 1;
set ANNEES := 1 .. N;
5.4.3 Les oprations ensemblistes
Les oprations ensemblistes permettent de dnir des ensembles partir densembles A et B
existants.
A union B,
A inter B,
A diff B dans A mais pas dans B,
A symdiff B dans A ou B mais pas les deux.
set HUILES_VEGETALES;
set HUILES_ANIMALES;
set HUILES := HUILES_VEGETALES union HUILES_ANIMALES;
5.4.4 Dsigner un lment ou une partie dun ensemble
On dispose des oprateurs suivants
in pour lappartenance
within pour linclusion.
103
# Fichier exemple
set NOEUDS;
param racine in NOEUDS;
set FEUILLES within NOEUDS := NOEUDS diff { racine };
data;
set NOEUDS := 3 17 24 45;
param racine := 17;
Exemple dexcution
$ ampl
ampl: model exemple;
ampl: display NOEUDS;
set NOEUDS := 3 17 24 45;
ampl: display racine;
racine = 17
ampl: display FEUILLES;
set FEUILLES := 3 24 45;
5.4.5 Dsigner un lment dun ensemble de symboles
Implicitement
On peut vouloir manipuler des noeuds dsigns par des symboles plutt que des nombres. Il
faut alors ajouter le qualicatif symbolic au paramtre racine : les paramtres en effet sont censs
dsigner des quantits numriques.
# Fichier exemple
set NOEUDS;
param racine symbolic in NOEUDS;
set FEUILLES within NOEUDS := NOEUDS diff { racine };
data;
set NOEUDS := A B C D
param racine := B;
On continue lexemple prcdent pour montrer un bel exemple de paramtre calcul. On sup-
pose que les noeuds appartiennent un arbre quon dcrit grce la fonction prdecesseur. Cette
fonction est code par un paramtre indic par lensemble des noeuds moins la racine. On signale
quun noeud ne peut pas tre son propre prdecesseur. Enn on affecte au paramtre prof la pro-
fondeur de chaque noeud.
param pred {n in NOEUDS diff {racine}} in NOEUDS diff {n};
param prof {n in NOEUDS} :=
if n = racine then 0 else 1 + prof [pred [n]];
104
Explicitement
Il est parfois utile dans un modle de manipuler explicitement un lment dun ensemble. Cette
opration est viter autant que faire se peut puisque les lments des ensembles ne sont pas censs
tre connus dans le modle. Il vaut mieux utiliser la mthode de la section prcdente. Quand cest
ncessaire, il suft de mettre des guillemets autour du symbole.
set PROD;
param prix {PROD} >= 0;
subject to contrainte_speciale :
prix ["machin"] <= prix ["truc"];
Il est parfois utile aussi de donner la valeur dun ensemble dans le modle et non dans les
donnes. Cette opration aussi est viter autant que faire se peut. Il suft de mettre des guillemets
autour des symboles.
set PROD := { "machin", "truc", "chose" };
5.4.6 Loprateur :
Il est suivi dune expression logique. Voici comment slectionner lensemble des lments
positifs dun ensemble de nombres.
set SIGNES;
set POSITIFS within SIGNES := { i in SIGNES : i >= 0 };
Voici un exemple de matrice triangulaire suprieure.
param N integer >= 0;
param matrice {l in 1 .. N, c in 1 .. N : l <= c};
Voici deux dclarations possibles de lensemble des nombres premiers infrieurs ou gaux N.
param N integer >= 0;
set premiers1 := { n in 2 .. N : forall {m in 2 .. n-1} n mod m <> 0};
set premiers2 := { n in 2 .. N : not exists {m in 2 .. n-1} n mod m = 0};
5.4.7 Ensembles ordonns
On a vu les intervalles qui sont des ensembles de nombres ordonns. On peut manipuler des
ensembles ordonns de symboles galement. Voici une version symbolique de lexemple de la
section 2.5.2. On considre un ensemble demploys de diffrents grades. Les nouveaux employs
du grade g sont soit des anciens employs de ce grade soit danciens employs promus depuis
le grade prcdent. Les expressions conditionnelles permettent de grer les cas particuliers du
premier et du dernier grade. Les fonctions rst et last permettent dobtenir le premier ou le dernier
lment dun ensemble ordonn. Les fonctions next et prev permettent dobtenir le successeur ou
le prdecesseur dun lment dun ensemble ordonn.
105
set GRADES ordered;
var anciens {GRADES} >= 0;
var nouveaux {GRADES} >= 0;
# promus [g] = ceux qui passent de g g+1
var promus {g in GRADES : g <> last (GRADES)} >= 0;
subject to calcule_nouveaux {g in GRADES} :
nouveaux [g] = anciens [g] +
(if g <> first (GRADES) then promus [prev (g)] else 0) -
(if g <> last (GRADES) then promus [g] else 0);
Remarque : il est parfois ncessaire de prciser lensemble auquel appartient llment dont on
cherche le successeur ou le prdecesseur. Voici un exemple.
set Ens ordered;
set Fns ordered within Ens;
data;
set Ens := A B C D E;
set Fns := B D E;
Quel est le prdecesseur de D? La rponse dpend de lensemble considr :
ampl: display prev ("D", Ens);
prev(D, Ens) = C
ampl: display prev ("D", Fns);
prev(D, Fns) = B
5.4.8 Ensembles circulaires
Il est galement possible de dnir des ensembles circulaires (ou cycliques). Il suft de mettre
le qualicatif circular au lieu de ordered. Le prdecesseur du premier lment est le dernier l-
ment. Le successeur du dernier lment est le premier lment.
5.4.9 Sousensembles dun ensemble ordonn
On peut demander quun sousensemble dun ensemble ordonn A soit ordonn suivant le
mme ordre que A ou suivant lordre inverse de celui de A.
set A ordered;
set B within A ordered by A;
set C within A ordered by reversed A;
La mme possibilit existe pour les ensembles circulaires. Il suft dutiliser les expressions
circular by et circular by reversed.
106
5.4.10 La fonction ord
Il permet dobtenir le numro dordre dun lment dans un ensemble ordonn. Lensemble des
sommets de numro dordre infrieur la racine.
set NOEUDS ordered;
param racine symbolic in NOEUDS;
set NOEUDS_INF_RACINE within NOEUDS :=
{ n in NOEUDS : ord (n) < ord (racine, NOEUDS) };
5.4.11 Produits cartsiens
On les a dj rencontrs dans le cadre de paramtres deux dimensions. Voici un exemple de
modlisation de carte routire. Un couple (x, y) appartient ROUTES sil existe une route de x
vers y. Pour les routes double sens, il faut stocker la fois (x, y) et (y, x).
set CARREFOURS;
set ROUTES within { CARREFOURS, CARREFOURS };
param longueur {ROUTES} >= 0;
data;
set CARREFOURS := A B C D;
set ROUTES := (B,A) (B,C) (A,D) (A,C) (C,A);
param : longueur :=
B A 8
B C 3
C A 2
A C 2
A D 5;
On amliore la dclaration comme suit. On prote de la possibilit de dnir dun seul coup
lensemble ROUTES et le paramtre longueur. On vrie aussi que la carte est cohrente : dune
part une route relie deux carrefours diffrents, dautre part si (x, y) et (y, x) appartiennent
ROUTES alors ces deux routes ont mme longueur.
set CARREFOURS;
set ROUTES within { x in CARREFOURS, y in CARREFOURS : x <> y };
param longueur {ROUTES} >= 0;
check : forall { (x,y) in ROUTES : (y,x) in ROUTES }
longueur [x,y] = longueur [y,x];
data;
set CARREFOURS := A B C D;
param : ROUTES : longueur :=
B A 8
B C 3
C A 2
A C 2
A D 5;
107
5.4.12 Ensembles densembles
Le langage AMPL permet de dnir des ensembles indics par dautres ensembles. Il y a un
ensemble de clients et un ensemble de fournisseurs pour chaque entreprise. partir de ces en-
sembles, on cre lensemble des clients de toutes les entreprises ainsi que, pour chaque entreprise,
lensemble de tous les couples (fournisseur, client).
set ENTREPRISES;
set CLIENTS {ENTREPRISES};
set FOURNISSEURS {ENTREPRISES};
set TOUS_LES_CLIENTS := union {e in ENTREPRISES} CLIENTS [e];
set COUPLES {e in ENTREPRISES} := {FOURNISSEURS [e], CLIENTS [e]};
data;
set ENTREPRISES := e1 e2;
set CLIENTS [e1] := c1 c2;
set CLIENTS [e2] := c1 c3;
set FOURNISSEURS [e1] := f1 f2 f3;
set FOURNISSEURS [e2] := f4;
Voici, pour xer les ides, ce quon obtient lexcution.
ampl: display CLIENTS;
set CLIENTS[e1] := c1 c2;
set CLIENTS[e2] := c1 c3;
ampl: display TOUS_LES_CLIENTS;
set TOUS_LES_CLIENTS := c1 c2 c3;
ampl: display COUPLES;
set COUPLES[e1] := (f1,c1) (f1,c2) (f2,c1) (f2,c2) (f3,c1) (f3,c2);
set COUPLES[e2] := (f4,c1) (f4,c3);
5.5 Les oprateurs arithmtiques et logiques
Le tableau suivant donne les oprateurs par priorit croissante. Il ny a aucune difcult
appliquer ces oprateurs sur des paramtres soit dans le corps des contraintes soit pour dnir
des paramtres calculs. Lorsquon les applique des variables, on court le risque dobtenir des
expressions non linaires.
Loprateur less retourne la diffrence de ses deux oprandes si elle est positive et zro sinon.
Loprateur div retourne le quotient de la division euclidienne de ses deux oprandes.
108
Notation Notation type des type du
standard alternative oprandes rsultat
if - then - else logique, arithmtique arithmtique
or logique logique
exists forall logique logique
and && logique logique
not (unaire) ! logique logique
< <= = <> > >= < <= == ! = > >= arithmtique logique
in not in objet, ensemble logique
+ - less arithmtique arithmtique
sum prod min max arithmtique arithmtique
*
/ div mod arithmtique arithmtique
+ - (unaires) arithmtique arithmtique

**
arithmtique arithmtique
Voici un tableau des principales fonctions mathmatiques.
abs(x) valeur absolue
ceil(x) plus petit entier suprieur ou gal
exp(x) exponentielle e
x
floor(x) plus grand entier infrieur ou gal
log(x) logarithme neperien ln x
log10(x) logarithme en base 10
sqrt(x) racine carre
5.6 Quelques commandes de linterprte AMPL
La commande model nom-de-chier permet de charger un modle en mmoire. Il est parfois
utile denregistrer dans des chiers diffrents le modle et ses donnes (par exemple dans le cas o
on souhaite traiter diffrents jeux de donnes). Dans ce cas, on charge en mmoire le modle avec
la commande model nom-de-chier et les donnes avec la commande data nom-de-chier .
La commande reset rinitialise la mmoire de linterprte. Elle est utile en particulier lors-
quon souhaite utiliser la commande model plusieurs fois de suite (lors de la mise au point des
modles).
ampl: model conges.ampl;
ampl: model conges.ampl;
conges.ampl, line 1 (offset 4):
PRODUITS is already defined
context: set >>> PRODUITS; <<<
...
109
conges.ampl, line 13 (offset 390):
stock_final_impose is already defined
context: param >>> stock_final_impose <<< >= 0;
Bailing out after 10 warnings.
ampl: reset;
ampl: model conges.ampl;
La commande option solver nom-de-solveur spcie le solveur utiliser.
La commande solve permet de rsoudre un modle charg en mmoire.
La commande display permet dafcher les valeurs des variables, les valeurs marginales
des contraintes etc . . . Elle permet dafcher plusieurs donnes en mme temps. Sur lexemple, on
afche une variable et ses bornes infrieure et suprieure. Ensuite, on afche une la valeur du corps
dune contrainte et sa valeur marginale.
mpl: model conges.ampl;
ampl: option solver cplex;
ampl: solve;
CPLEX 8.0.0: optimal solution; objective 10231.17857
9 dual simplex iterations (1 in phase I)
ampl: display profit_mensuel.lb, profit_mensuel, profit_mensuel.ub;
: profit_mensuel.lb profit_mensuel profit_mensuel.ub :=
Jan -Infinity 1984 Infinity
Fev -Infinity 1519.68 Infinity
Mar -Infinity 1487 Infinity
Avr -Infinity 800 Infinity
Mai -Infinity 1855 Infinity
Jun -Infinity 2585.5 Infinity
;
ampl: display limitation_de_la_vente.body, limitation_de_la_vente;
: limitation_de_la_vente.body limitation_de_la_vente :=
Jan P1 55 7
Jan P2 50 1.8
...
Jun P5 95 9.2
Jun P6 55 2.4
Jun P7 34.5 0
La contrainte limitation_de_la_vente est indice par des mois et des produits. Il est possible de
nafcher que les valeurs marginales du mois de mai en utilisant la syntaxe suivante.
ampl: display {p in PRODUITS} limitation_de_la_vente ["Mai", p];
limitation_de_la_vente[Mai,p] [
*
] :=
P1 10
P2 6
P3 8
P4 4
P5 11
P6 9
P7 3
;
110
La commande let permet de modier la valeur dun paramtre sous linterprte. Dans lexemple
suivant, prix est une variable, delta et prix_approximatif sont des paramtres.
ampl: model elasticite3.ampl;
ampl: option solver cplex;
ampl: solve;
CPLEX 8.0.0: optimal solution; objective 1992470.886
79 dual simplex iterations (0 in phase I)
ampl: let {p in PRODUITS_LAITIERS} prix_approximatif[p] := prix[p];
ampl: let delta := delta / 2; solve;
CPLEX 8.0.0: optimal solution; objective 1993220.536
37 dual simplex iterations (2 in phase I)
111
Index
:, 105
abs, 25
abus de langage, 94
accessible, 60
acyclique, 60
adjacent, 61
afchage, 102
algorithme dEdmondsKarp, 87, 90
algorithme de Bellman, 74, 83
algorithme de Dijkstra, 75
algorithme de FordFulkerson, 86
algorithme de Kruskal, 94
algorithme glouton, 76, 94
AMPL, 18
arborescence, 93
arbre, 93
arc, 59
arc critique, 90
arc direct, 86
arc indirect, 86
arc satur, 86
arte, 59
arrt du simplexe, 43
base dune matrice, 7, 12
base de Grbner, 97
base ralisable, 36
Bellman, Richard Ernest, 74
binary, 29
Blackett, Patrick, 1
body, 23, 56
but, 59
capacit, 85
card, 103
chane, 60
changement de solveur, 20, 28
check, 107
chemin, 60
chemin amliorant, 86
chemin de valeur minimale, 73
choix de la colonne, 39
choix de la ligne, 39
choix local, 76
circuit, 60
circuit absorbant, 73
circuit eulrien, 64
circular, 106
classe dquivalence, 97
commentaire, 100
complexit, 63
complexit du simplexe, 44
composante connexe, 60, 73
composante fortement connexe, 60
connexe, 60
contrainte, 16
contrainte inactive, 24, 54
coupe, 89, 95
couple, 107
cot, 32
cot rduit, 24, 56
cplex, 18
critre doptimalit, 41, 57
critre de ralisabilit, 46
cycle, 60
D, 32
dclaration de paramtres, 101
Dantzig, George, 31
data, 109
date de dbut au plus tt, 81
112
date de dbut au plus tard, 81
degr dun sommet, 65
destination, 85
d
i
(u), 90
diff, 103
Dijkstra, Edsger Wybe, 75
display, 110
criture matricielle, 9
lmentaire, 60
ensemble, 18, 103
ensemble circulaire, 106
ensemble densembles, 108
ensemble ordonn, 105
ensembles disjoints, 97
quations normales, 14
Euler, Leonhard, 64
exists, 105
extrmit, 59
le, 68, 69
le avec priorit, 78
rst, 105
che, 59
ot maximal, 85
ot maximal par programme linaire, 92
ux, 85
forall, 105, 107
forme canonique, 34
forme canonique par rapport une base, 35
forme standard, 34
fortement connexe, 60
Gauss, Carl Friedrich, 8
graphe, 59
graphe acyclique, 71
graphe non orient, 59
graphe orient, 59
graphe planaire, 66
if, 25, 27, 104
in, 103
incident, 61
integer, 20
inter, 103
intervalle, 103
invariant de boucle, 37
laisser une valeur indnie, 101
last, 105
lb, 18, 23, 56
let, 24, 111
logarithme, 62
matrice, 6
matrice inversible, 8
max, 25
mthode des deux phases, 45
mthode MPM, 81
minos, 18
model, 109
modle AMPL, 18
moindres carrs, 13
next, 105
O, 62
objectif conomique, 16, 32
objectif articiel, 45
oprateurs, 108
option display_1col, 92, 102
option solver, 20, 28, 110
ord, 107
ordered, 105, 106
ordered by reversed, 106
ordonnancement, 81
ordonnancement par programme linaire, 84
origine, 59
param, 100
paramtre, 16, 100
paramtre calcul, 26
paramtre symbolique, 104
parcours en largeur, 67
parcours en profondeur, 69
pivot de Gauss, 9
pivot de GaussJordan, 10
plus court chemin, 87
113
plus court chemin par programme linaire, 80
plus courte chane, 68
polygone des solutions ralisables, 33
ponts de Knigsberg, 64
pred, 62
prev, 105
problme de dmarrage, 45
problme dual, 47, 90
produit cartsien, 107
programmation linaire, 16
programme articiel, 45
programme dual, 48
programme non born, 42
programme primal, 48
racine, 93
rang dune matrice, 7, 12
rc, 24
rduction de problme, 44
reprsentant canonique, 97
reprsentation sagittale, 61
rseau de transport, 85
reset, 109
rsolution en nombres entiers, 20
rsolution graphique, 17, 32
sensibilit de lobjectif loptimum, 54
shadow price, 23, 56
solution de base, 36
solution optimale, 33
solution ralisable, 32
solve, 110
sommet, 59
sommet associ une solution de base, 36
sommet darticulation, 70
sommet multiple, 42
source, 59, 85
sousgraphe, 60
sousgraphe engendr, 60
stock, 21, 27
succ, 61
superdestination, 85
supersource, 85
symbolic, 104
symdiff, 103
tableau simplicial, 36
tche critique, 81
tas binaire, 79
thorme des carts complmentaires, 57
thorme des quatre couleurs, 66
thorme des relations dexclusion, 57
thorme du ot maximal et de la coupe mini-
male, 90
transformer les quivalences en galits, 97
tri topologique, 71
ub, 18, 23, 56
union, 103, 108
valeur marginale, 23, 54, 56
variable, 16
variable articielle, 45
variable dcart, 34
variable de base, 35
variable duale, 54
variable hors base, 35
voisin, 59
within, 103
z
0
, 36
114
Bibliographie
[1] Jacques Baranger. Introduction lanalyse numrique. Hermann, Paris, 1977.
[2] Jean-Luc Chabert, velyne Barbin, Michel Guillemot, Anne Michel-Pajus, Jacques Borowc-
zyk, Ahmed Djebbar, and Jean-Claude Martzloff. Histoire dalgorithmes. Du caillou la puce.
Belin, Paris, 1994.
[3] Thomas Cormen, Charles Leiserson, Ronald Rivest, and Clifford Stein. Introduction lalgo-
rithmique. Dunod, Paris, 2me edition, 2002.
[4] Robert Faure, Bernard Lemaire, and Christophe Picouleau. Prcis de recherche oprationnelle
(mthodes et exercices dapplication). Dunod, Paris, 5me edition, 2000.
[5] Robert Fourer, David M. Gay, and Brian W. Kernighan. AMPL A Modeling Language For Ma-
thematical Programming. International Thomson Publishing, 1993. http://www.ampl.
com.
[6] John J. OConnor and Edmund F. Robertson. The MacTutor History of Mathematics archive.
http://www-history.mcs.st-andrews.ac.uk/history, 2006.
[7] Hilary Paul Williams. Model Building in Mathematical Programming. John Wiley and Sons,
New York, 3rd edition, 1990.
115