Portion | Énergie (kcal) | Protéines (g) | Calcium (mg) | Prix/portion | |
Céréales | 28g | 110 | 4 | 2 | 3 |
Poulet | 100g | 205 | 32 | 12 | 24 |
Oeufs | 2 gros | 160 | 13 | 54 | 13 |
Lait entier | 237cc | 160 | 8 | 285 | 9 |
Tarte | 170g | 420 | 4 | 22 | 20 |
Porc et haricots | 260g | 260 | 14 | 80 | 19 |
Quels choix pour Polly ?
Comment formaliser le problème ? (modélisation)
Qu’est-ce qui fait la spécificité du problème ?
Savez-vous résoudre des problèmes similaires ?
Sous les contraintes: 2*x1 + 3*x2 + x3 <= 5
4*x1 + x2 + 2*x3 <= 11
3*x1 + 4*x2 + 2*x3 <= 8
x1, x2, x3 >= 0
Minimiser: 3*x1 - x2
Sous les contraintes: - x1 + 6*x2 - x3 + x4 >= -3
7*x2 + 2*x4 = 5
x1 + x2 + x3 = 1
x3 + x4 <= 2
x2, x3 >= 0
Maximiser:
z:= |
| cjxj |
Sous les contraintes:
| aijxj≤ bi, pour i=1,…,m |
xj≥0, pour j=1,…,n |
Un choix des variables (x1,…,xn) est appelé solution du problème.
Une solution est faisable si elle vérifie les contraintes.
z est appelé fonction objective. À chaque solution elle associe une valeur.
Une solution est optimale si elle est faisable et maximize la fonction objective.
On considère les quatre problèmes de programmation linéaire standard suivants, écrits avec la syntaxe du système de calcul formel MuPAD:
x2 <= 7 ],
3 +x1 +x2,
Nonnegative]:
Chvatal7b := [ [ x1 +x2 <= 2,
-2*x1-2*x2 <= -10 ],
3*x1 -x2,
NonNegative]:
Chvatal7c := [ [-2*x1 +x2 <= -1,
-x1-2*x2 <= -2 ],
x1 -x2,
NonNegative]:
extra := [ [ x1 +x2 <= 1 ],
x1 +x2,
NonNegative]:
11 = s2 + 4*x1 + x2 + 2*x3
8 = s3 + 3*x1 + 4*x2 + 2*x3
Que peut-on dire dessus?
C’est un système linéaire à 6 inconnues et 3 équations.
L’ensemble des solutions est un sous espace de dimension 3 de ℝ3, que l’on peut décrire en prenant comme paramètres x1, x2 et x3.
En effet, vu la forme triangulaire, s1, s2 et s3 s’expriment en fonction de x1, x2 et x3.
Transformer le système pour prendre comme paramètres s1, s2, et x1.
4*x1 + x2 + 2*x3 <= 11,
3*x1 + 4*x2 + 2*x3 <= 8 },
5*x1 + 4*x2 + 3*x3,
NonNegative]:
Solution faisable ?
Amélioration de la solution ?
Introduction de variables d’écart:
11 = s2 + 4*x1 + x2 + 2*x3
8 = s3 + 3*x1 + 4*x2 + 2*x3
----------------------------------
z = 5*x1 + 4*x2 + 3*x3
En augmentant x1 jusqu’à 5/2, on fait tomber s1 à zéro.
On transforme le système, pour se ramener à une situation similaire à la précédente:
1 = s2 - 5*x2 - 2*s1
1/2 = s3 - 1/2*x2 + 1/2*x3 - 3/2*s1
-----------------------------------------
z = 25/2 - 7/2 x2 + 1/2*x3 - 5/2*s1
On augmente x3 jusqu’à 1, ce qui fait tomber s3 à 0:
2 = x1 + 2*x2 + 2*s1 - s3
1 = s2 - 5*x2 - 2*s1
---------------------------------
z = 13 - 3*x2 - s1 - s3
Et maintenant, que fait-on ?
-x1 +3*x3 <= 2,
2*x1 + 3*x2 - x3 <= 2,
2*x1 - x2 + 2*x3 <= 4],
5*x1 + 5*x2 + 3*x3,
NonNegative]:
bi=si+ |
| aijxj, pour i=1,…,m |
z= |
| cjxj |
Ou sous forme matricielle:
|
2 = s2 - x1 + 3 x3
2 = s3 + 2 x1 + 3 x2 - x3
4 = s4 + 2 x1 - x2 + 2 x3
---------------------------------
z = 0 + 5 x1 + 5 x2 + 3 x3
linopt::Transparent(Chvatal19);
+- -+
|"linopt","restr",slk[1],slk[2],slk[3],slk[4],x3,x1,x2|
| |
| "obj", 0, 0, 0, 0, 0, 3, 5, 5|
| |
| slk[1], 3, 1, 0, 0, 0, 1, 1, 3|
| |
| slk[2], 2, 0, 1, 0, 0, 3,-1, 0|
| |
| slk[3], 2, 0, 0, 1, 0, -1, 2, 3|
| |
| slk[4], 4, 0, 0, 0, 1, 2, 2,-1|
+- -+
2 = s1 + 3/2 x2 + 3/2 x3 - 1/2 s4
3 = s2 + 3/2 x2 + 5/2 x3 + 1/2 s4
2 = s3 - 4 x2 + 3 x3 - s4
----------------------------------------
z = 5 - 5/2 x2 + 11/2 x3 - 5/2 s4
x1,s1,s2,s3 sont les variables basiques; {x1,s1,s2,s3} est la base.
x2,x3,s4 sont les variables non basiques.
Voici le dictionnaire correspondant au tableau précédent:
x4 = 2 - 3/2 x2 - 3/2 x3 + 1/2 x7
x5 = 3 - 3/2 x2 - 5/2 x3 - 1/2 x7
x6 = 2 + 4 x2 - 3 x3 + x7
---------------------------------
z = 5 - 5/2 x2 + 11/2 x3 - 5/2 x7
Les équations d’un tableau décrivent un sous-espace affine E de ℝn+m.
Un point p de cet espace est caractérisé par ses coordonnées dans les variables non-basiques.
Que peut-on dire des deux sous-espaces affine de ℝn+m qu’ils définissent ?
Chaque choix de variables non-basiques correspond à une base affine de ce sous-espace.
Un tableau est faisable si la solution basique (0,…,0) est une solution faisable.
De manière équivalente, un tableau est faisable si les constantes dans les équations du haut sont toutes positives ou nulles.
Revenons à l’exemple [1, p. 19]:
t:=linopt::Transparent(Chvatal19);
t:=linopt::Transparent::userstep(t, slk[3], x3);
Utilisez l’algorithme du simplexe pour résoudre les programmes linéaires suivants:
[[ x1 +x2+2*x3 <= 4,
2*x1 +3*x3 <= 5,
2*x1 +x2+3*x3 <= 7],
3*x1+2*x2+4*x3,
NonNegative]:
Chvatal26_21c :=
[[2*x1+3*x2 <= 3,
x1+5*x2 <= 1,
2*x1 +x2 <= 4,
4*x1 +x2 <= 5],
2*x1 +x2,
NonNegative]:
On a un algorithme qui marche sur quelques exemples.
Il faut vérifier trois points pour savoir s’il marche en général:
Proof. Il suffit d’analyser le tableau faisable. Notons S1,…,Sm les variables basiques, X1,…,Xn les variables non-basiques, et C1,…,Cn,z* les coefficients tels que z=z*+∑CiXi.
Par exemple, dans le tableau final du problème6, on a X1=x2, X2=s1, X3=s2, S1=x1, S2=x3, S3=s3, C1=−3, C2=−1, C3=−1 et z*=13.
- x1 + 3*x2 + 4*x3 <= 2,
2*x1 - 4*x2 + 6*x3 <= 3],
2*x1 - x2 + 8*x3,
NonNegative]:
t0:= linopt::Transparent(Chvatal29);
t1:= linopt::Transparent::userstep(t0, slk[1], x3);
t2:= linopt::Transparent::userstep(t1, slk[3], x1);
t3:= linopt::Transparent::userstep(t2, slk[2], x2);
t4:= linopt::Transparent::userstep(t3, x3, slk[1]);
Proof. (Résumé)
Chaque itération correspond à un tableau faisable.
Un tableau faisable est entièrement caractérisé par le choix des variables basiques.
Il n’y a que C(n+m,m) choix possibles de variables basiques.
Avec une stratégie incorrecte, l’algorithme du simplexe peut cycler éternellement:
0.5*x1 - 1.5*x2 - 0.5*x3 + x4 <= 0,
x1 <= 1],
10*x1 - 57*x2 - 9*x3 - 24*x4,
NonNegative]:
t0 := linopt::Transparent(Chvatal31);
t1 := linopt::Transparent::userstep(t0, slk[1], x1);
t2 := linopt::Transparent::userstep(t1, slk[2], x2);
t3 := linopt::Transparent::userstep(t2, x1, x3);
t4 := linopt::Transparent::userstep(t3, x2, x4);
t5 := linopt::Transparent::userstep(t4, x3, slk[1]);
t6 := linopt::Transparent::userstep(t5, x4, slk[2]);
Comment garantir que l’algorithme ne cyclera pas ?
L’algorithme du simplexe ne peut cycler qu’en présence de dégénérescence.
Idée: supprimer les dégénérescences en perturbant légèrement le système!
On introduit des constantes ε1>>⋯>>εn.
Inconvénient: solution approchée, ou introduction de calcul symbolique
Cette méthode est simple et élégante.
Par contre, elle empêche toute stratégie pour faire converger l’algorithme plus vite.
Stratégie au choix, mais si z n’augmente pas pendant plus d’un certain nombre d’itérations, on bascule sur la stratégie du plus petit index jusqu’à ce que l’on soit sorti de la dégénérescence.
Pour le moment, l’algorithme du simplexe nécessite de partir d’un tableau faisable.
Le système pourrait même ne pas avoir de solution!
Maximiser: x1−x2+x3
Sous les contraintes:
2x1−x2+2x3≤4
2x1−3x2+x3≤−5
−x1+x2−2x3≤−1
x1,x2,x3≥0
Maximiser: −x0
Sous les contraintes:
2x1−x2+2x3−x0≤4
2x1−3x2+x3−x0≤−5
−x1+x2−2x3−x0≤−1
x0,x1,x2,x3≥0
Remarques:
Étudions ce nouveau système:
2*x1 - 3*x2 + x3 - x0 <= -5,
2*x1 - x2 + 2*x3 - x0 <= 4],
-x0,
NonNegative]:
t0:=linopt::Transparent(Chvatal40);
t1:=linopt::Transparent::userstep(t0, slk[2], x0);
t2:=linopt::Transparent::userstep(t1, slk[1], x2);
t3:=linopt::Transparent::userstep(t2, x0, x3);
Maintenant, nous savons que le système P est faisable.
En fait, en éliminant x0 on obtient même un tableau faisable pour P!
Algorithme du simplexe en deux phases pour résoudre un problème P sous forme standard:
Phase I:
En effet, il y a une solution faisable avec x0=0, et on peut passer en phase II.
Il y a une solution faisable avec x0=0. On peut donc passer en phase II.
P est infaisable, et on s’arrête.
Situation impossible si on fait toujours sortir x0 en priorité de la base.
Phase II:
t1:=linopt::Transparent::userstep(t0, slk[2], x0)
t2:=linopt::Transparent::userstep(t1, slk[1], x1)
t3:=linopt::Transparent::userstep(t2, x0, x2)
t0:=linopt::Transparent(Chvatal44_39a)
t1:=linopt::Transparent::userstep(t0, slk[1], x1)
t2:=linopt::Transparent::userstep(t1, slk[2], x2)
t3:=linopt::Transparent::userstep(t2, slk[3], slk[2])
Pour une discussion complète sur ce thème, nous renvoyons au livre de référence [1, 4. How fast is the simplex method], ainsi qu’à l’excellente Foire Aux Questions http://rutcor.rutgers.edu/ mnk/lp-faq.html pour les évolutions récentes.
Sous les contraintes:
x1−x2−x3+3x4≤1
5x1+x2+3x3+8x4≤55
−x1+2x2+3x3−5x4≤3
x1,x2,x3,x4≥0
Borne supérieure sur la valeur optimale z*?
D’après la seconde contrainte:
z*≤4x1+x2+5x3+3x4≤ |
| x1+ |
| x2+5x3+ |
| x4≤ |
|
En utilisant la somme de la deuxième et troisième contrainte:
z*≤4x1+3x2+6x3+3x4≤58 |
On recherche des combinaisons linéaires des contraintes:
Ce qui donne:
(y1+5y2−y3)x1+(−y1+y2+2y3)x2+(−y1+3y2+3y3)x3+(3y1+8y2−5y3)x4 |
≤ y1+55y2+3y3 |
Quelles sont les contraintes pour obtenir une borne sur z* ?
Pour garder le sens des inégalités: y1,y2,y3≥0
Pour obtenir une majoration de z=4x1+x2+5x3+3x4:
y1+5y2−y3≥4
−y1+y2+2y3≥1
−y1+3y2+3y3≥5
3y1+8y2−5y3≥3
Si y1,y2,y3 satisfont ces conditions, on obtient la borne z≤ y1+55y2+3y3.
On veut donc minimiser y1+55y2+3y3!
Par exemple, en prenant y1=0 et y2=y3=1, on retrouve l’inégalité z≤58.
Maximiser:
z= |
| cj xj |
Sous les contraintes:
| aij xj≤ bi, pour i=1,…,m |
xj≥0, pour j=1,…,n |
Le dual de P est le problème:
Minimiser:
w= |
| bi yi |
Sous les contraintes:
| aij yi≥ cj, pour j=1,…,n |
yi≥0, pour i=1,…,m |
P est appelé problème primal.
| cj xj≤ |
| bi yi |
Proof. Il suffit d’appliquer les inégalités qui définissent les solutions faisables:
z= |
| cj xj≤ |
| ⎛ ⎜ ⎜ ⎝ |
| aij yi | ⎞ ⎟ ⎟ ⎠ | xj= |
| ⎛ ⎜ ⎜ ⎝ |
| aij xj | ⎞ ⎟ ⎟ ⎠ | yi≤ |
| bi yi=w |
En particulier:
| cj xj= |
| bi yi, |
La donnée de (y1,y2,y3) donne un certificat de l’optimalité de la solution (x1,x2,x3,x4):
Quelqu’un qui veut faire une vérification peut le faire quasiment sans calcul:
il suffit de tester que les solutions sont faisables et que que z=w.
La réponse est oui, et c’est le théorème central de la programmation linéaire.
| cj xj*= |
| bi yi*. |
Ce théorème nous assure de l’existence d’un certificat.
Mais y-a-t’il une technique pour le calculer ?
Oui, car la preuve va être constructive: son principe va précisément être de construire une solution optimale, en utilisant le tableau final obtenu par l’algorithme du simplexe.
Le tableau initial est:
[[ x1 - x2 - x3 + 3*x4 <= 1,
5*x1 + x2 + 3*x3 + 8*x4 <= 55,
-x1 +2*x2 + 3*x3 - 5*x4 <= 3 ],
4*x1 + x2 + 5*x3 + 3*x4,
NonNegative]:
t0:=linopt::Transparent(Chvatal54)
L’algorithme du simplexe donne comme tableau final:
t2:=linopt::Transparent::userstep(t1, slk[3], x2)
Ce calcul donne la solution optimale (x1*:=0, x2*:=14, x3*:=0).
Ce calcul donne aussi un certificat, mais pour le vérifier, il faut refaire tout le calcul!
Sortons le lapin du chapeau …
La variable y1 est associée à la première contrainte, qui elle même est associée à la variable d’écart s1. Hop, on prends pour y1* l’opposé du coefficient de s1 dans l’expression de z dans le tableau final. De même pour y2* et y3*:
y1*:=11, y2*:=0, y3*:=6. |
(y1*,y2*,y3*) est une solution faisable du problème dual.
Par «miracle», on obtient w*=z*.
On a donc pu lire le certificat voulu directement sur le tableau final!
Voyons maintenant pourquoi cela marche dans le cas général.
Proof. Il suffit de construire une solution faisable (y1*,…,ym*) vérifiant w*=z*.
On applique l’algorithme du simplexe au problème initial, en introduisant comme d’habitude les variables d’écart s1,…,sm. Dans le tableau final, z est de la forme
z=z*+ |
|
| xj+ |
| di si, |
où les cj et di sont des coeffs nuls pour les variables basiques, et négatifs pour les autres.
On pose comme dans l’exemple:
yi*:=−di, pour i=1,…,m. |
Il ne reste plus qu’à vérifier que (y1*,…,ym*) est faisable et donne w*=z*.
C’est un calcul fastidieux mais direct (surtout sous forme matricielle!) …
Pour une solution quelconque (x1,…,xn), on a par définition:
z= |
| cj xj |
si=bi− |
| aij xj |
En remplaçant dans l’expression ci-dessus, on obtient
| cj xj=z*+ |
|
| xj− |
| yi*(bi− |
| aijxj) |
| cj xj=z*− |
| bi yi*+ |
| ( |
| + |
| aij yi*) xj |
Cette égalité étant vérifiée quel que soit le choix de (x1,…,xn), il doit y avoir égalité des coefficients des xj de part et d’autre. On en déduit d’une part que
z*= |
| bi yi*=w*, |
comme voulu, et d’autre part que
| aij yi*=cj− |
| ≥ cj, |
c’est-à-dire que (y1*,…,ym*) est une solution faisable du problème dual.
Il s’ensuit:
P admet une solution optimale si et seulement si Q en admet une.
Si P est faisable, alors Q est borné; si Q est faisable, alors P est borné.
Maximiser: 2x1−x2
Sous les contraintes:
x1−x2≤1
−x1+x2≤−2
x1,x2≥0
Le tableau suivant résume les possibilités (nb: un problème non borné est faisable!)
primal\dual | optimal | infaisable | non borné |
optimal | possible | impossible | impossible |
infaisable | impossible | possible | possible |
non borné | impossible | possible | impossible |
Pour voir cela, on va raffiner l’inégalité w≥ z sur des solutions xj et yi faisables en utilisant les variables d’écart pour mesurer la différence w−z.
Donner une formule raisonable pour ti.
Exprimer w−z en fonction des xi, yi, si, ti.
Par définition des variables d’écart si, on a
si=bi− |
| aijxj, |
et donc
bi=si+ |
| aijxj. |
De même, par définition des variables d’écart tj pour le problème dual, on a
tj= |
| aijyi−cj, |
que l’on utilise pour exprimer cj
cj= |
| aijyi−tj. |
En remplaçant dans l’expression de w−z, on obtient
w−z= |
| biyi− |
| cjxj= |
| siyi+ |
| ⎛ ⎜ ⎜ ⎝ |
| aijxj | ⎞ ⎟ ⎟ ⎠ | yi− |
| ⎛ ⎜ ⎜ ⎝ |
| aijyi | ⎞ ⎟ ⎟ ⎠ | xj+ |
| tjxj |
Qui se simplifie en:
w−z= |
| siyi+ |
| tjxj. |
yi*=0 ou si*=0, pour tout i=1,…,m; |
xj*=0 ou tj*=0, pour tout j=1,…,n. |
Donc, lorsque la solution optimale du problème est non dégénérée, la technique que l’on a utilisée dans les exercices permet toujours d’obtenir un certificat, pour le prix de la résolution d’un système de m équations linéaires en m variables.
Sous les contraintes
2x1+x2≤14
−x1+x2≤8
2x1−x2≤10
x1,x2≥0.
Faire une figure dans le plan de la région des solutions faisables.
Donner le problème dual.
Prendre y1=y2=1,y3=0. Donner l’inégalité sur les xi correspondante, et représenter la région qu’elle délimite dans le plan.
Donner quelques solutions faisables du problème dual.
Tracer sur la figure les régions délimitées par les inégalités correspondantes.
Calculer la solution optimale du primal et du dual.
Les tracer sur la figure.
Essayer d’interpréter géométriquement les théorèmes que l’on a rencontrés.
Une papetterie produit et vend différents types de papier: du papier kraft vendu au rouleau, du papier recyclé vendu à la ramette et du papier velin vendu à la feuille. Pour celà, elle dispose en début de mois d’un certain stock de matière première: de l’eau (à l’hectolitre), du chlore (au litre) du bois (à la tonne), du vieux papier (au kilo), des fibres textiles (au ballot). Remplacer les stocks en fin de mois à un certain coût. Chaque type de papier nécessite une certaine proportion de chaque matière première. Par exemple, le chlore sert à blanchir le papier; il n’y en a pas besoin pour le papier kraft; le papier velin est essentiellement produit à partir de bois et de fibres textiles, etc. Le but est de prévoir, pour le mois qui vient, quelle quantité de chaque papier il faut produire pour maximiser le profit de la papetterie.
Modéliser ce problème sous forme de programme linéaire sous forme standard.
xj : quantité de produit j fabriquée
cj : prix de vente unitaire du produit j
aij: quantité de ressource i consommée par unité de produit j fabriquée
bi: limites sur la disponibilité de la ressource i
Maximiser:
z= |
| cjxj |
Sous les contraintes:
| aijxj≤ bi, pour i=1,…,m; |
xj≥0, pour j=1,…,n. |
Quelle dimension (au sens physique) ont les variables xj , bi , cj , aij?
On voudrait trouver une interprétation pour les variables yi dans le problème dual. Quelle dimension physique ont-elles ? Qu’est-ce que cela suggère ?
Cela suggère que yi mesure la valeur intrinsèque de la ressource i pour l’usine.
Maximiser:
z= |
| cjxj |
Sous les contraintes:
| aijxj≤ bi+ti, pour i=1,…,m; |
xj≥0, pour j=1,…,n. |
a une solution optimale, et la valeur optimale est
z*+ |
| yi*ti |
où z* est la valeur optimale du problème original et (y1*,…,ym*) est la solution optimale du dual.
Autrement dit, on peut mesurer l’espérance de gain au voisinage d’une solution optimale lorsque l’on relaxe certaines des contraintes: yi* décrit le gain que l’usine peut espérer en augmentant la quantité de ressource i disponible.
Maintenant, le bûcheron a aussi l’option d’emprunter pour augmenter son capital initial, et ce pour un taux d’intérêt total de S% sur la durée de l’opération. Alternativement, il peut décider d’investir son capital dans une autre activité rapportant T% sur la durée de l’opération. Déterminer, selon les valeurs de S et T, la meilleure stratégie à adopter.
Soit z* la valeur optimale du problème primal et (y1*,…,ym*) une solution optimale quelconque du problème dual. Montrer que pour toute solution faisable (x1,…,xn) du problème primal où l’on a relaxé chaque contrainte i de la quantité ti, on a
| cjxj≤ z*+ |
| yi*ti |
Proof. Exprimons le fait que (x1,…,xn) est solution faisable du problème avec les contraintes relaxées:
| aijxj≤ bi+ti |
Donc:
| yi* | ⎛ ⎜ ⎜ ⎝ |
| aijxj | ⎞ ⎟ ⎟ ⎠ | ≤ |
| yi*bi+ |
| yi*ti=w*+ |
| yi*ti=z*+ |
| yi*ti |
On a trouvé le terme de droite voulu.
Reste à trouver le terme de gauche, ce que l’on fait avec une inversion de somme similaire à celle qui a été utilisée dans les démonstrations précédentes.
| yi* | ⎛ ⎜ ⎜ ⎝ |
| aijxj | ⎞ ⎟ ⎟ ⎠ | = |
| ⎛ ⎜ ⎜ ⎝ |
| aijyi* | ⎞ ⎟ ⎟ ⎠ | xj≥ |
| cjxj |
Règles du jeu (pour deux personnes, Louis et Claire).
À chaque tour, chaque joueur cache un ou deux pions, et essaye de parier, à voix haute, combien de pions l’autre joueur a caché. Si un seul des joueurs a parié la bonne solution, son score augmente d’autant de point qu’il y a de pions cachés en tout; le score de l’autre joueur diminue du même nombre de points. Sinon, rien ne ce passe. Par exemple, si Claire cache 2 pions et parie 1 tandis que Louis cache 2 pions et parie 2, Louis gagne 4 points et Claire en perds 4.
Le but est de trouver une stratégie gagnante.
À chaque étape, chaque joueur a le choix entre 4 actions:
Chacune de ces options est appelée stratégie pure.
Quelles autres stratégies ?
Stratégie de Claire: inconnue; elle a joué c1 fois [1,1], c2 fois [1,2], c3 fois [2,1] et c4 fois [2,2].
Stratégie de Louis: lancer une pièce à chaque tour pour choisir entre [1,2] et [2,1].
Calculer les gains et pertes de Claire et Louis.
Résultat:
Gain de Louis: (c1−c4)/2.
Perte moyenne maximale à chaque tour: 1/2.
Une stratégie aléatoire de ce type est appellée stratégie mixte.
Chaque matrice A=(aij) définit un jeu. À chaque tour, le joueur par Ligne (Louis) choisit une ligne i parmi les m lignes, et le joueur par Colonnes (Claire) choisit une colonne j parmi les n colonnes.
Le gain pour Louis est le coefficient aij:
Écrire la matrice pour le jeu papier/ciseaux/caillou/puits.
On note N:=∑ici et yi:=ci/N. Calculer le gain moyen par tour pour Louis.
xi≥0 et x1+⋯+xm=1. |
On considère x:=[x1,…,xm] comme un vecteur ligne, et y:=[y1,…,yn]T comme un vecteur colonne, de façon à pouvoir écrire commodément le gain de Louis sous la forme:
xAy. |
Ici, x est constant. Cela peut se mettre sous la forme du programme linéaire en y:
| xAy |
Si Louis veut une bonne garantie pour maintenir ces gains hauts (ou ses pertes faibles), il peut chercher une stratégie mixte qui maximise la quantité miny xAy.
On appelle une telle stratégie mixte optimale; son gain moyen vaut
|
| xAy |
Comment calculer la stratégie optimale ?
Tel quel, le problème ne se met pas sous la forme d’un programme linéaire. On avait vu une astuce pour se débarasser d’un min dans les contraintes; celle ci ne s’applique cependant que lorsque l’on prend le min d’un nombre fini d’expressions, alors qu’ici il y en a a priori autant que de choix de y.
(0,…,0,1,0,…,0). |
Autrement dit:
| xAy= |
|
| aijxi. |
Interprétation ?
Proof. Clairement, pour une stratégie pure j donnée:
| xAy≤ |
| aijxi. |
Maintenant, supposons que j0 minimise ∑i=1maij0xi:
| aijxi≥ |
| aij0xi pour j=1,…,n. |
Alors, si y:=(y1,…,yn) est un vecteur stochastique, on a:
xAy= |
|
| xiaijyj= |
| yj | ⎛ ⎜ ⎜ ⎝ |
| aijxi | ⎞ ⎟ ⎟ ⎠ | ≥ |
| yj | ⎛ ⎜ ⎜ ⎝ |
| aij0xi | ⎞ ⎟ ⎟ ⎠ | = | ⎛ ⎜ ⎜ ⎝ |
| yj | ⎞ ⎟ ⎟ ⎠ | ⎛ ⎜ ⎜ ⎝ |
| aij0xi | ⎞ ⎟ ⎟ ⎠ | . |
Donc, comme voulu,
xAy≥ |
| aij0xi |
Supposons que Claire veuille aussi adopter une stratégie mixte optimale. Formuler de même son problème sous forme de programme linéaire.
| x*Ay= |
| xAy*, |
Interprétation ?
Proof. Application immédiate du théorème de dualité.
| x*Ay= |
| xAy*. |
D’où vient cette particularité ?
Il n’est pas très pratique de devoir annoncer simultanément les paris.
Jeu de poker avec trois cartes (jeu inventé et analysé par Kuhn en 1950).
A et B déposent chacun un pion, puis reçoivent chacun une carte.
Ensuite, A peut parier un pion supplémentaire ou passer.
De même pour B, puis pour A, jusqu’à ce que:
Étant donné une distribution des cartes, décrire les stratégies pures pour A et B.
Décrire toutes les stratégies pures pour A et B.
Quelle est la taille de la matrice des gains ?
Y-a-t’il des stratégies que l’on peut éliminer d’office ?
Au final, on peut obtenir comme matrice de gain:
124 | 124 | 314 | 324 | |
112 | 0 | 0 | −1/6 | −1/6 |
113 | 0 | 1/6 | 1/3 | −1/6 |
122 | −1/6 | −1/6 | 1/6 | 1/6 |
123 | −1/6 | 0 | 0 | 1/6 |
312 | 1/6 | −1/3 | 0 | −1/2 |
313 | 1/6 | −1/6 | −1/6 | −1/2 |
322 | 0 | −1/2 | 1/3 | −1/6 |
323 | 0 | −1/3 | 1/6 | −1/6 |
Stratégie mixte pour A: [1/3,0,0,1/2,1/6,0,0,0]; stratégie mixte pour B: [2/3,0,0,1/3]T.
Résumé de la stratégie de A:
Pour A, bluffer ou contre-bluffer est rentable.
Résumé de la stratégie de B:
Pour B, bluffer est rentable, mais pas contre-bluffer.
Objectif: étudier une certaine classe de problèmes de programmation linéaire sur laquelle l’algorithme du simplexe prends une forme simple et efficace.
Les noeuds sont des villes.
Les arcs sont des câbles électriques, à sens unique, reliant les villes.
Sources (noeuds avec production): 6: 9 MW; 7: 5 MW
Puits (noeuds avec consommation): 3: 6 MW; 4: 6 MW; 5: 2 MW
Noeuds intermédiaires (noeuds sans production ni consommation): 1,2
Il y a des pertes en lignes, donc transporter du courant a un coût. On le modélise par un coût par unité de courant transportée sur chaque arc entre la ville i et la ville j.
Répartition du flux de courant pour satisfaire la consommation au plus bas coût?
Comme le consommateur ne se soucie pas de l’origine du courant (un watt, c’est un watt), et comme le coût dans les deux situations est le même, on peut ignorer cette ambiguïté, et considérer que ces deux situations sont équivalentes.
On impose les restrictions suivantes:
Ces restrictions permettent d’obtenir un algorithme plus simple et élégant. Nous verrons plus tard comment les contourner pour traiter des problèmes plus généraux.
Une solution d’un problème de transport peut être modélisé en introduisant pour chaque arc allant du noeud i au noeud j une variable xij qui mesure le flux le long de cet arc.
Le seulement si est clair; le si demanderait une vérification pour décider les détails de la réalisation: quel watt venant d’où se retrouve où au final.
Les solutions faisables sont donc décrites par un système d’équations de la forme:
x14+x24−x45=6. |
(ici, il s’agit du sommet 4 dans notre exemple), et d’inégalités du type x14≥0.
Là encore les notations ne sont pas parfaites: une paire ij indexe un arc, et donc une colonne, et non pas une cellule de la matrice…
Avec cette notation, et en notant b le vecteur colonne des bi, x le vecteur colonne des xij, et c le vecteur ligne des cij on peut mettre le problème sous forme matricielle:
Minimiser: cx
Sous les contraintes: Ax=b et x≥0.
x:= | ⎡ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ |
| ⎤ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ | , b:= | ⎡ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ |
| ⎤ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ |
A:= | ⎡ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ |
| ⎤ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ |
c:= | ⎡ ⎣ |
| ⎤ ⎦ |
c:= | ⎡ ⎣ |
| ⎤ ⎦ |
On peut vérifier que dans l´égalité Ax=b, la quatrième composante donne l’équation
x14+x24−x45=6, |
correspondant au sommet 4.
Chemin | Cycle |
Graphe non connexe | Graphe connexe |
Forêt (graphe acyclique) | Arbre |
Arbre couvrant du réseau:
Y-a-t’il une solution ? Est-elle faisable ?
Formellement, il existe un unique vecteur x:=[xij] vérifiant:
Ax=b et xij=0 pour ij n′appartenant pas à T. |
Si de plus le vecteur x vérifie x≥0, c’est une solution arborescente faisable.
On dit aussi que l’arbre est faisable.
Soit T un arbre.
On note x:=[xij] la solution correspondante.
Objectif: comparer le coût cx pour la solution x avec le coût cxpour une autre solution faisable x.
Soit y:=[y1,…,yn] les prix à chaque noeuds pour la solution x.
Lors de l’application du simplexe, on a comparé le coût du transport cij d’une unité le long de l’arc ij par rapport à la différence de prix yj−yi entre les noeuds i et j.
On pose cij:=cij−(yj−yi), et c=[cij] le vecteur ligne correspondant.
Proof. On va utiliser le résultat de l’exercice pour reformuler le coût de x en fonction de c:
c |
| =( |
| +yA) |
| = |
|
| +yA |
| = |
|
| +yb. |
En particulier, cx=cx+yb.
Comme en plus cij=0 si ij∈ T et xij=0 si ij∉T, cx=0, on a cx=yb.
Conclusion: cx=cx+cx.
Exercice: finissez de le démontrer!
Proof. Si x est une autre solution faisable, xij≥0. Donc cx=∑cijxij≥0.
Comment choisir un arbre de départ faisable ?
On va, comme pour le simplexe habituel, introduire un problème auxiliaire:
Problème: existe-t’il un arbre faisable dans le réseau modifié n’utilisant pas d’arc artificiel?
On prend comme fonction de coût w:=∑ij artificiel xij.
De la sorte, si x est une solution faisable du problème original, alors w=0.
On applique le simplexe. À la fin, on est dans l’une des situations suivantes:
Comme dans le cas général, l’algorithme du simplexe pour les réseaux a les propriétés suivantes:
Pour les détails, nous renvoyons à [1, Ch. 19].
Dans les exercices suivants, on cherche à contourner les restrictions sur les problèmes standards de transport.
Pour adapter la production à la demande, l’usine a le choix entre plusieurs options:
À la fin de l’année, on veut de plus qu’il n’y ait plus aucun stock, afin de faciliter l’inventaire.
Évidemment, l’objectif est d’adapter la production au moindre coût.
Modéliser ce problème sous forme de problème de transport standard.
Dans le département de mathématiques d’une université aux USA, l’évaluation des enseignants par les étudiants a donné au cours des derniers semestres les résultats suivants:
Cours\Professeur | Bill | Yu | Luis | John | Hugh |
Calculus 1 | 3 | 4 | 2,3 | 2,9 | 2,8 |
Differential Equations | 2,25 | 3,2 | 3,7 | 1,9 | 4,4 |
Statistics | 2,6 | 3,7 | 4,5 | 2.7 | 3,1 |
Calculus 2 | 3,9 | 4,1 | 2,6 | 3,9 | 2,4 |
Discrete maths | 2,8 | 2,8 | 3,5 | 3,4 | 4,2 |
Dans un semestre, chaque cours est enseigné par un professeur, et chaque professeur enseigne un cours. Le chef du département veut répartir les cours du prochain semestre entre les professeurs de façon à exploiter au mieux leurs talents respectifs (ou minimiser la grogne des étudiants, au choix…). Il décide de prendre comme mesure de la qualité d’une répartition la moyenne sur chaque cours de la note du professeur qui l’enseigne.
Modéliser le problème, et indiquer comment on pourrait le résoudre.
Proof. Une solution arborescente pour P a toujours des coefficients entiers!
En effet, la matrice d’incidence de l’arbre a des coefficients 1, −1 et 0, et on peut la mettre sous forme triangulaire avec des coefficients 1 et−1 sur la diagonnale. Du coup, lorsque l’on calcule le flux le long des arcs de l’arbre (ce qui revient à inverser la matrice), on obtient uniquement des flux entiers.
Le théorème d’intégralité est assez simple. Alors quel est son intérêt
?
Le problème précédent est appellé problème d’assignement, et est essentiellement combinatoire (les variables sont discrètes).
Ce que dit fondamentalement le théorème d’intégralité, c’est que dans certains cas les méthodes de programmation linéaire peuvent être utilisées pour résoudre des problèmes purement combinatoire, ce qui est loin d’être trivial!
C’est le sujet de la combinatoire polyhédrale.
Les problèmes de programmation linéaire en entiers (on impose que les solutions soit à coordonnées entières) sont notoirement difficile. Ils sont la plupart du temps NP-complets, et nécessitent la plupart du temps l’utilisation d’algorithme de backtrack (essai-erreur) qui ne sont pas polynomiaux.
Par contre, si par chance on peut les mettre sous forme de problèmes standards de transport, le théorème d’intégralité permet de les résoudre par l’algorithme du simplexe.
On a des objets de différentes tailles l1,…,ln et différentes valeurs v1,…,vnque l’on veut mettre dans un sac-à-dos de taille l. Évidemment le sac est trop petit, et l’on doit donc faire un choix. Le but est de remplir au maximum le sac-à-dos. Cela peut se mettre sous la forme:
Maximiser v=∑i=1nxivi, sous les contraintes 0≤ xi≤1, xi entier.
Peut-on le mettre sous forme de problème de transport ?
On note que l’algorithme du simplexe n’est pas polynomial!
Par contre, il existe un autre algorithme, dit de l’ellipsoïde, pour résoudre les problème de programmation linéaire qui est polynomial. Il est amusant de constater qu’en pratique il est moins efficace que l’algorithme du simplexe. Nous renvoyons au Chvatal pour une description complète de cet algorithme.
Toujours est-il que cela peut permettre de montrer que le problème d’assignement est polynomial.
Pour des détails sur ce domaine, nous recommandons particulièrement la lecture de l’article sur le sujet dans le handbook of combinatorics.
L’idée générale de la combinatoire polyhédrale est la suivante:
Le théorème de dualité donne alors des relations de type min-max entre des problèmes combinatoires.
Si chaque fille connait exactement k≥1 garçons et chaque garçon connaît exactement k filles, alors on peut arranger n mariages de façon à ne pas marier des inconnus.
Proof. On associe à chaque fille i une source ri produisant une unité, et à chaque garçon un puit si consommant une unité, et on met un arc entre chaque couple ri si se connaissant.
Indépendamment du coût sur les arcs, le problème est faisable:
Il suffit de mettre un flux de 1/k sur chaque arc.
Le théorème d’intégralité indique alors qu’il y a une solution entière.
Cette solution entière donne une façon d’organiser les mariages.
⎡ ⎢ ⎢ ⎣ |
| ⎤ ⎥ ⎥ ⎦ | . |
X est une matrice de permutation si sur chaque ligne et chaque colonne il y a exactement un 1 et n−1 zéros:
⎡ ⎢ ⎢ ⎣ |
| ⎤ ⎥ ⎥ ⎦ | . |
La matrice précédente correspond à la permutation 3,1,2.
Clairement une matrice de permutation est une matrice doublement stochastique.
Les matrices de permutations sont les matrices doublement stochastiques à coeffs entiers.
On va maintenant regarder une application de la programmation linéaire pour étudier des graphes non orientés comme le suivant:
Une couverture C de ce graphe est un ensemble de sommets qui touchent toutes les arêtes, comme par exemple C:={1,3,4,7,8}:
Modélisation: Chaque village est représenté par un sommet du graphe précédent, les arêtes représentant les routes. Résoudre notre problème revient à chercher une couverture de taille minimale du graphe.
Un couplage M de ce graphe est un ensemble d’arêtes qui ne se touchent pas, comme par exemple M:={{1,3},{4,5},{7,8}}:
Modélisation: chaque sommet du graphe précédent représente une personne, et chaque arête relie deux personnes qui se connaissent bien. Résoudre notre problème revient alors à rechercher un couplage de taille maximale dans le graphe.
Proof. Comme C est une couverture, chaque arête de M devra être touchée par au moins un sommet dans C. De plus, M étant un couplage, chaque sommet de C touche au plus une arête de M. Donc, on a bien |M|≤|C|.
Dans notre exemple, non. Par contre, on va voir que pour certaines classes de graphe, cela va être vrai: on aura un théorème de dualité min-max. Comme par hasard, c’est une conséquence de la programmation linéaire.
On appelle graphe biparti un graphe dont on peut partitioner les sommets en deux paquets A et B de sorte que toutes les arêtes soient entre A et B:
On peut par exemple introduire le réseau suivant.
Chaque solution entière du réseau correspond à un couplage M du graphe biparti (les arêtes sur lesquelles passent une unité). Le coût de cette solution est 4−|M|. Donc minimiser ce coût revient à rechercher un couplage de taille max.
Voilà une solution arborescente optimale du réseau; on a indiqué sur les sommets les prix relatifs, et sur les arêtes les quantités transportées:
La taille maximale d’un couplage M est donc 3.
On remarque que les sommets du graphe biparti de prix 1 à gauche et de prix 0 à droite (en grisé) forment une couverture optimale de taille 3 du graphe biparti.
C’est une exemple typique où le théorème de dualité de la programmation linéaire donne un théorème min-max reliant deux problèmes combinatoires qui ne sont pas clairement reliés a priori.
Dans cette section, nous allons regarder une généralisation des problèmes de transports, dans lesquels on ajoutera des contraintes de capacités maximales.
Nous verrons rapidement que l’algorithme du simplexe et les résultats théoriques en découlant peuvent être étendus sans grosses difficultés. Puis nous étudierons quelques applications.
Minimiser: cx
Sous les contraintes: Ax=b et 0≤ x≤ u,
où A est la matrice d’incidence d’un réseau.
(u pour upper bound).
Minimiser: cx
Sous les contraintes: Ax=b et l≤ x≤ u.
Comme on peut le constater dans l’exercice précédent, on ne peut pas toujours espérer trouver une solution optimale, ni même une solution faisable arborescente: c’est-à-dire telle qu’on utilise aucune arête en dehors d’un certain arbre T.
On va donc relâcher cette contrainte. Toute arête en dehors de l’arbre T devra être soit non utilisée, soit au contraire utilisée à pleine capacité:
Une solution x est T-arborescente si tout arc ij∉T on a:
xij=0 ou xij=uij. |
Une solution x est arborescente s’il existe un arbre couvrant T tel que x est T-arborescente.
Nous allons maintenant voir sur un exemple comment on peut adapter l’algorithme du simplexe pour les réseaux.
Dans le cas classique (sans limites de capacités), le principe était de faire rentrer dans l’arbre T une arête ij inutilisée (xij=0) rentable (yi+cij<yj) de façon à pouvoir l’utiliser.
Ici, il y a un autre cas de figure: faire rentrer une arrête ij utilisée à pleine capacité (xij=uij) alors qu’elle n’est pas rentable (yi+cij>yj), de façon à pouvoir diminuer son utilisation.
Proof. La démonstration est très similaire à celle du cas sans limites de capacités.
On va considérer une autre solution faisable x du problème, et comparer les coûts cx et cx correspondants.
On pose cij:=cij−(yj−yi), et c=[cij] le vecteur ligne correspondant.
cij mesure le coût relatif:
On note que dans les trois cas, cijxij≥cijxij. Donc matriciellement cx≥cx.
Comme précédemment on peut écrire c matriciellement sous la forme c=c−yA.
De plus, x et x sont solutions faisables et vérifient donc toutes deux Ax=b.
On en déduit alors:
c |
| = |
|
| +yA |
| = |
|
| +yb≥ |
| x+yb= |
| x+yAx=cx. |
Objectif:
Maximiser le volume du flot, c’est-à-dire la quantité transportée entre s et p.
Clairement, cela se généralise à tout problème de flot max.
Si les contraintes de capacités sont entières (ou infinies), alors:
La capacité de la coupe C est la somme des capacités des arrêtes sortantes de C.
Que peut-on en déduire sur la valeur d’un flot ?
Une dualité et un théorème min-max, bien-sûr!
Proof. On considère une solution F optimale du problème de flot obtenue avec le simplexe pour les réseaux avec limites de capacité.
On calcule les valeurs yi en chaque sommets.
Les coûts sont de 0 partout sauf sur l’arc ps, où le coût est de −1.
Donc la valeur de yi est:
On prend comme coupe C l’ensemble des sommets i avec yi=0.
Chaque arc ij sortant de C est «rentable» puisque yi+cij=0<1=yj.
Or, ij n’est pas dans l’arbre, et le flot est optimal.
Donc ij doit être utilisé à pleine capacité: xij=uij.
De même, tout arc ij entrant est non rentable, et n’est donc pas utilisé: xij=0.
Conclusion: Le volume du flot F est égal à la capacité de la coupe C:
⎪ ⎪ | F | ⎪ ⎪ | = |
| xij− |
| xij= |
| uij= | ⎪ ⎪ | C | ⎪ ⎪ | . |
Dans ce cas, il ne peut pas y avoir de coupe de capacité finie.
Donc le théorème reste valide.
En fait, non, puisque xij=0, ∀ xij est solution.
Un tel cas correspond en fait à une solution dégénérée qui est arborescente vis-à-vis de plusieurs arbres.
En fait, en faisant un pivot convenable, on peut toujours remettre ps dans l’arbre.
On a vu que les problèmes de flots était un cas particulier des problèmes de transport avec limites de capacités.
Quel est donc l’intérêt de considérer les problèmes de flots ?
On a un algorithme (méthode du chemin augmentant) plus rapide que le simplexe.
On peut le transformer en problème de flot, en oubliant les coûts, et en rajoutant une source, reliée convenablement aux producteurs, et un puits, relié convenablement aux consommateurs:
S’il existe un flot de volume 8, les arcs reliant s aux producteurs seront utilisés à pleine capacité, et de même pour les arcs reliant les consommateurs à t. Cela simule exactement les productions et consommations escomptées, donc le problème de réseau d’origine est faisable.
La réciproque est aussi clairement vraie: si le problème est faisable, alors il existe un flot de volume 8.
Dans notre cas, on en déduit que le problème n’est pas faisable. En effet, on peut trouver une coupe de capacité 7.
De manière générale, on peut toujours transformer un problème de transport avec limite de capacité en un problème de flot, de façon à déterminer s’il est faisable.
Cela donne un algorithme plus rapide que le simplexe pour la phase I de la résolution.
Modèle: le sous-sol a été délimité en un certain nombre de blocs. Pour chaque bloc i, on connaît le coût Ci d’excavation, et le profit Pi que l’on peut escompter de son traitement.
Au final, on associe à chaque bloc i la quantité wi=Ci−Pi. Si l’on ne considère pas les autres blocs, il est rentable de creuser i si et seulement si wi<0.
On veut déterminer quels blocs on doit creuser pour maximiser le profit total −∑iwi (ou autrement dit minimiser ∑iwi).
Maintenant, il y a des contraintes supplémentaires: si un bloc i est sous un bloc j, on ne peux pas creuser i sans creuser j!
On introduit un ordre partiel, de sorte que i<j si pour creuser i on doit creuser j.
Comme on le verra, la forme des blocs, et le type d’ordre partiel n’est pas relevant.
Comment modéliser notre problème sous forme de problème de flot max ?
La modélisation des contraintes de précédences est un peu astucieuse!
On introduit le réseau suivant:
C’est la remarque suivante qui va faire marcher la machine:
S’il existe deux blocs i<j, avec i∈ C et j∈ C, alors C est de capacité infinie.
La réciproque est vraie.
Les coupes de capacité finie sont en correspondance avec les coupes respectant les contraintes.
Maintenant, on peut vérifier que la capacité d’une coupe finie vaut exactement
| wi− |
| wi. |
Quitte à rajouter le terme constant ∑i, i blocwi, on est en train de calculer le profit lorsque l’on enlève les blocs i avec i∈ C.
Résumé: Soit I un ensemble de blocs, et C la coupe {s}∪ I.
Maximiser le profit revient à trouver une coupe min.
a→ c, a→ d, a→ f, a→ g, b→ c, b→ g, d→ g, e→ f, e→ g.
Une chaîne C de P est un ensemble de sommets de P deux à-deux comparables:
x∈ C et y∈ C ⇒ x<y ou y<x. |
Une antichaîne A de P est un ensemble de sommets deux-à-deux incomparables.
Une couverture en chaînes de P est un ensemble C1,…,Ck de chaînes, de sorte que tout sommet de P est dans une unique chaîne Ci.
Une couverture en antichaînes de P est un ensemble A1,…,Ak d’antichaînes, de sorte que tout sommet de P est dans une unique antichaîne Ai.
Y-aurait-il un théorème min-max reliant la taille de la plus grande chaîne et la taille de la plus petite couverture en antichaînes ? Et un autre reliant la taille de la plus grande antichaîne et celle de la plus petite couverture en chaînes ?
Montrer que |C|≤ k.
Montrer que |A|≤ k.
Le théorème dans l’autre sens est plus difficile et bien plus profond. Il n’y a pas de construction élémentaire de l’antichaîne et de la couverture en chaîne idoine. On va en fait se ramener à la programation linéaire (surprise).
Proof. On note n le nombre de sommets de P.
Choisir une couverture en chaîne de P est équivalent à sélectionner un certain nombre d’arcs dans P, de sorte que chaque sommet ait au plus un arc sortant de sélectionné, et un arc rentrant de sélectionné.
Remarque: s’il y a k chaînes, il y a n−k arcs sélectionnés.
Cela ressemble à un problème de couplage maximal dans un graphe biparti.
On construit un graphe biparti B dans lequel chaque sommet x de P est dupliqué en (x,1) et (x,2).
Chaque fois que x<y dans P, on relie (x,1) et (y,2).
Qu’est-ce qu’un couplage dans B?
Un ensemble d’arcs de P vérifiant exactement les conditions voulues.
Une couverture de P en k chaînes correspond à un couplage de B de taille n−k.
Prenons une couverture de P de taille k minimale.
Cela donne un couplage de taille max n−k de B.
Le théorème min-max pour les graphes bipartis indique qu’il y a une couverture de B de même taille: n−k sommets de B qui touchent tous les arcs.
Dans P cela correspond à au plus n−k sommets qui touchent tous les arcs.
Soit A l’ensemble des sommets restants qui est de taille au moins k.
Il ne peut pas y avoir d’arcs entre deux sommets de A.
Conclusion: A est une antichaîne de taille au moins k.
Rechercher un couplage max dans un graphe biparti est un problème très classique.
Il existe en fait des techniques plus rapides que les algorithmes de réseaux de transport.
L’une d’entre elles est la méthode du chemin augmentant.
On peut construire un couplage de taille maximal progressivement à partir d’un couplage vide en rajoutant des arêtes une à une. Mais si on n’est pas parti correctement, on risque d’être bloqué avec un couplage qui est maximal, alors qu’il n’est pas de taille maximale. Il faut appliquer une transformation au couplage pour pouvoir l’agrandir.
Un sommet M-saturé (ou saturé) est un sommet touchant une arête du couplage.
Un chemin M-alterné de G est un chemin de G qui utilise alternativement des arêtes dans M et hors de M.
Un chemin M-augmentant est un chemin M-alterné commençant et finissant par des sommets non M-saturés.
Cas particulier: lorsque le chemin M-augmentant consiste d’une seule arête reliant deux sommets non saturés, on est ramené au rajout d’une arête au couplage M′.
Le couplage M dessiné est maximal, mais pas de taille maximale. Trouvez un chemin M-augmentant et construisez le couplage M′ correspondant.
Est-ce que cette opération de chemin augmentant est suffisante ?
Proof. Soit M un couplage, comme dans l’exemple suivant:
On suppose qu’il existe un couplage M′ de taille strictement plus grande.
On va construire un chemin M-augmentant.
On considère le graphe H obtenu par réunion de M et M′.
Les sommets de H sont de degré au plus 2.
Ses composantes connexes sont donc des doubles arêtes ou des cycles et chemins dont les arêtes alternent entre M et M′. Dans un cycle ou une double arête il y a autant d’arêtes de M que de M′. Il y aura donc forcément un chemin qui contiendra une arête de plus de M′ que de M. Ce chemin est un chemin M-augmentant.
On déduit de ce théorème un algorithme (ou plutôt une méthode):
Pour un graphe quelconque, l’étape 2 peut être difficile!
Par contre, pour un graphe biparti, il y a un algorithme.
Cet algorithme renvoie soit un chemin M-augmentant, soit une couverture du graphe de taille |M|, ce qui indiquera que le couplage M est de taille maximale.
Soit U l’ensemble des sommets de X non touchés par M, et V l’ensemble des sommets de Y non touchés par M.
On va rechercher par un parcours en largeur les chemins M-alternés allant de U à V.
S (resp. T) va représenter l’ensemble des sommets x de X (resp. Y) pour lesquels on aura déjà trouvé un chemin M-alterné allant de U à x.
Démontrer que T∪(X−S) est bien une couverture de taille |M| du graphe.
Donner la preuve
La méthode du chemin augmentant se généralise à la recherche de couplage max dans un graphe biparti valué, et en fait aussi aux problèmes de flots max. On ne va regarder son fonctionnement que sur un exemple, et on renvoie à [1, p. 369] pour les détails.
Un chemin allant de la source s au puits p est F-augmentant si pour chaque arête ij du chemin on a:
À partir d’un chemin F-augmentant, on peut construire un nouveau flot F′ qui sera de volume strictement plus gros.
Le principe de l’algorithme de Ford-Fulkerson est de partir d’un flot F quelconque, et de l’améliorer itérativement en recherchant des chemins F-augmentant.
À chaque étape, la recherche d’un chemin F-augmentant se fait par un parcours en profondeur, de manière similaire à la recherche d’un chemin M-augmentant dans un graphe biparti. Si cette recherche échoue, elle dévoile une coupe de capacité égale au flot, ce qui donne un certificat d’optimalité du flot.
Si toutes les capacités sont entières et finies, chaque itération augmente le flot d’au moins 1. Cet algorithme ne peut donc pas cycler, et il termine en un nombre fini d’étapes.
Avec une mauvaise stratégie, et des capacités infinies ou non-entières, l’algorithme peut ne pas terminer.
Avec une stratégie convenable, cet algorithme est en fait polynomial, en O(n3), même si les capacités sont infinies ou non entières.
Pour les réseaux avec peu d’arcs, il y a des algorithmes plus compliqués qui permettent d’obtenir d’encore meilleurs bornes. Cf. [1, p. 369] pour les détails.
Pour conclure ce chapitre sur la programmation linéaire, nous présentons rapidement quelques méthodes alternatives qui ont été développées pour résoudre les problèmes de programmation linéaire généraux. Nous nous contentons d’évoquer leur principe, leurs avantages et inconvénients, et donnons des références pour ceux qui voudraient en savoir plus.
Si un tel système est faisable, le volume de l’ensemble des solutions peut alors être minoré par une quantité V qui dépends de la dimension de l’espace, et de la taille des coefficients dans le système linéaire.
On part d’un ellipsoïde E suffisamment gros pour contenir toutes les solutions faisables.
Si le centre de E est une solution faisable, on a terminé.
Sinon, on peut couper l’ellipsoïde en deux, et inclure ce demi-ellispoïde dans un ellipsoïde E′ qui contient encore toutes les solutions faisables. On réitère avec E:=E′.
À chaque itération, on a V(E′)<α V(E), où α<1 est une constante qui ne dépends que de la dimension; donc le volume de E décroît exponentiellement. Au bout d’un petit nombre d’itérations, si l’on a pas obtenu de solution faisable, on a V(E)<V, ce qui prouve que la système n’a pas de solution faisable.
Le principe du simplexe est de ne considérer que des solutions basiques qui sont à la frontière du polyèdre, et d’utiliser de l’algèbre linéaire pour itérer parmi ces solutions.
Ici au contraire, la méthode ne considère que des solutions strictement à l’intérieur du polyèdre. L’idée est d’approximer les inégalités du système linéaire, qui forment fondamentalement des discontinuités, en barrières de potentiel, qui sont elles continues. Du coup, on peut utiliser les techniques d’optimisation non-linéaire continue, comme les méthodes de gradients.