2.2 Questions de validité

On peut déduire de la structure des exemples précédents un certain nombre d'informations:

  1. les contraintes ont permis de construire un domaine rectangulaire des solutions dite faisables ou réalisables, qui, dans $\mathbb{R}^2$, est un cas particulier de polyèdre (mais on réserve ce terme pour $\mathbb{R}^n$, $n \geq 2$).
  2. Les solutions sont distinctes en fonction de la valeur des paramètres de l'objectif.
  3. Tant que ces paramètres appartiennent à  un certain ensemble, les solutions sont invariantes. Mais, dès qu'elles dépassent les limites des frontières se produit un changement brutal de solutions.
  4. Les solutions qui sont situées sur un sommet du rectangle sont denses en ce sens qu'il existe un sous-ensemble de pentes de la fonction objectif non vide et sans trou pour lequel elles sont solutions, alors que les solutions dégénérées (les solutions multiples qui se situent sur un côté) n'apparaissent que pour des valeurs exceptionnelles des paramètres et sont instables pour la moindre variation de ces paramètres.

Avant d'aller plus loin, il est intéressant de se poser la question de savoir si toutes ces observations sont pérennes.

Ensembles convexes et non convexes



Considérons le quadran $\mathrm{A}$ de la figure ci-dessus, où on a laissé en fins pointillés les droites qui supportent les frontières des inégalités qui forment le polyèdre des points faisables, afin que le lecteur puisse s'appercevoir qu'elles peuvent tout aussi bien être du type $\geq$ que du type $\leq$. Après l'exemple traité, on peut constater que, si tant est que l'ensemble délimité par les contraintes est convexe, on trouvera toujours une configuration des paramètres $(a_1, a_2)$ telle que chaque sommet et chaque arrête du polygone puisse être solution d'un problème de maximisation. On constate aussi que chaque sommet demeure solution tant que la rotation de l'objectif demeure dans l'angle saillant qui a été représenté sur le sommet, puis devient un côté du polygone$\ldots$

Il est aussi aisé de s'apercevoir qu'en aucun cas, les solutions sont des points intérieurs. La convexité est aussi fondamentale pour que tout sommet soit candidat à  être un optimum. Considérons le quadran $\mathrm{B}$ de la figure ci-dessus.

Il est évident que $A$ ne peut pas être un optimum pour l'objectif représenté par la ligne en pointillés qui passe par $A$. Tous les sommets du polygone ne peuvent être des optima que si le polygone est convexe. Tous les ensembles d'inégalités dans $\mathbb{R}^2$ conduisent-ils à  la construction d'un polygone ? Non. Observez le graphique ci-dessous. Il est construit à  partir de deux inégalités incompatibles. Il ne donne donc pas naissance à  un domaine de points réalisables.

Peut-on considérer des contraintes strictes? La question est difficile mais doit être réglée une fois pour toute. Considérons les trois cadrans de la figure ci-après.

Contraintes inégalitaires strictes



On constate que dans le cas de la contrainte représentée au quadran $(A)$ de la figure ci-dessus, il n'existe aucune solution unique pour toute pente de l'objectif. Ceci provient du fait que la frontière n'appartient pas au domaine.

En ce qui concerne la contrainte représentée au quadran $(B)$, il existe de manière évidente trois points qui sont potentiellement des solutions uniques et, sur les quatre côtés du polygone, seuls deux peuvent être solution (tout dépend de la pente de l'objectif). Enfin, dans le cas de la dernière contrainte représentée au quadran $(C)$ , tous les sommets peuvent être des optima. Seul un côté ne peut pas l'être. Toutes ces configurations posent des difficultés qui doivent être éliminées d'une présentation canonique de la programmation linéaire C'est pourquoi, en général, elles ne sont pas traitées.

Ceci nous indique que pour tous les problèmes représentables dans $\mathbb{R}^2$, il n'est pas nécessaire d'utiliser les instruments plus lourds qui seront développés par la suite, mais qu'il est préférable de suivre la démarche suivante:

  1. Formuler correctement le programme linéaire.
  2. Donner une représentation de la région des points faisables et obtenir les coordonnées des sommets du polygone soit par inspection, soit par l'intersection des deux équations linéaires dont le sommet est à  l'intersection.
  3. Construire une table évaluant la valeur de la fonction objectif pour chaque sommet.
  4. Déterminer la solution optimale à  partir de 3 selon que le problème correspond à  un max ou un min.


Il est important d'apprendre au plus vite à se servir du logiciel qui va être le support du cours. Ce qui est présenté ici n'est pas forcément facile pour un débutant. Mais il n'y a pas d'autre voie. À moins d'être informatitien, il n'y a qu'en se confrontant à un problème réel qu'on peut comprendre comment faire. Pour ce faire et éviter au maximum d'être obligé de réaliser des dessins à la main, voici comment tracer le domaine délimité par les contraintes, de trouver les sommets du polygone et dévaluer l'optimum, tout ceci pour les problèmes en dimension 2. Considérons l'ensemble de contraintes suivant :

\[ \begin{array}{l} x_1 - 2 x_0 \geq 20\\ 2 x_1 + x_0 \geq 22\\ -x_1 + x_0 \geq 5 \end{array} \]

Pour tracer le domaine délimité par ces équations, il faut les mettre sous la forme

\[ x_2 \lesseqqgtr \mathrm{lin}(x_1) \]

expression dans laquelle le symbol $\lesseqqgtr$ est utilisé pour signifier soit $\geq$, soit $\leq$ selon le cas mais certainement pas les deux et où $\mathrm{lin}$ signifie qu'il s'agit d'une expression linéaire en $x_1$. Évidemment, on peut réaliser cette opération à la main, mais il est tellement plus simple de demander à l'ordinateur de le faire. La cellule suivante permet de réaliser cela sur la première équation.



cl1

Voici quelques éléments d'interprétation de cette cellule
  1. On commence par définir les variable d'où la première commande $\texttt(var('x_0\, x_1'))$. On notera que, par défaut dans $\texttt{SageMath}$ seul $x$ est pré-définie comme variable.
  2. On donne un nom à la solution (ici, $s1$) pour pouvoir l'invoquer plus tard.
  3. On demande à $\texttt{SageMath}$ d'afficher le résultat.

En ce qui concerne le résultat, il est affiché en deux éléments : la frontière des points faisables (signe =) et le domaine intérieur des points faisables dans lequel doit se trouver $x_2$. On peut récupérer l'un comme l'autre, mais ici on n'a besoin que de créer une fonction linéaire pour tracer la frontière. Attention, le serveur ne conserve pas longtemps les résultats. Donc en cas de cellules liées, il est nécessaire de ne pas trop attendre pour lancer la suivante, snon il est nécessaire de les relancer toutes.



cl2

Attention : $\mathrm{LatexExpr(..)}$ n'est qu'un ornement de présentation. $\texttt{SageMath}$ ne connaît pas $f_1(x_1)$ mais $f1(x_1)$. Il est maintenant possible de tracer cette fonction.



cl3

Ici :

  1. $\mathtt{fillalpha}$ fixe le niveau d'opacité de la couleur de remplissage. Le choix de ce paramètre est important parce qu'il permet d'éviter le recouvrement de couleur. Les couleurs se mélangent, ce qui est utile pour déterminer le domaine délimité par les contraintes.
  2. la valeur $\mathtt{true}$ permet de remplir jusqu'à l'abscisse ($\mathtt{min}$ rempli uniquement jusqu'à l'ordonnée à l'origine).
  3. En ce qui concerne les couleurs voici les couleurs définies par défaut (ne pas oublier les cotes) : 'aliceblue' , 'antiquewhite' , 'aqua' , 'aquamarine' , 'automatic', 'azure' , 'beige' , 'bisque' , 'black' , 'blanchedalmond' , 'blue' , 'blueviolet' , 'brown' , 'burlywood' , 'cadetblue' , 'chartreuse' , 'chocolate' , 'coral' , 'cornflowerblue' , 'cornsilk' , 'crimson' , 'cyan' , 'darkblue' , 'darkcyan' , 'darkgoldenrod' , 'darkgray' , 'darkgreen' , 'darkgrey' , 'darkkhaki' , 'darkmagenta' , 'darkolivegreen' , 'darkorange' , 'darkorchid' , 'darkred' , 'darksalmon' , 'darkseagreen' , 'darkslateblue' , 'darkslategray' , 'darkslategrey' , 'darkturquoise' , 'darkviolet' , 'deeppink' , 'deepskyblue' , 'dimgray' , 'dimgrey' , 'dodgerblue' , 'firebrick' , 'floralwhite' , 'forestgreen' , 'fuchsia' , 'gainsboro' , 'ghostwhite' , 'gold' , 'goldenrod' , 'gray' , 'green' , 'greenyellow' , 'grey' , 'honeydew' , 'hotpink' , 'indianred' , 'indigo' , 'ivory' , 'khaki' , 'lavender', 'lavenderblush' , 'lawngreen' , 'lemonchiffon' , 'lightblue' , 'lightcoral' , 'lightcyan' , 'lightgoldenrodyellow' , 'lightgray' , 'lightgreen' , 'lightgrey' , 'lightpink' , 'lightsalmon' , 'lightseagreen' , 'lightskyblue' , 'lightslategray' , 'lightslategrey' , 'lightsteelblue' , 'lightyellow' , 'lime' , 'limegreen' , 'linen' , 'magenta' , 'maroon' , 'mediumaquamarine' , 'mediumblue' , 'mediumorchid' , 'mediumpurple' , 'mediumseagreen' , 'mediumslateblue' , 'mediumspringgreen' , 'mediumturquoise' , 'mediumvioletred' , 'midnightblue' , 'mintcream' , 'mistyrose' , 'moccasin' , 'navajowhite' , 'navy' , 'oldlace' , 'olive' , 'olivedrab' , 'orange' , 'orangered' , 'orchid' , 'palegoldenrod' , 'palegreen' , 'paleturquoise' , 'palevioletred' , 'papayawhip' , 'peachpuff' , 'peru' , 'pink' , 'plum' , 'powderblue' , 'purple' , 'red' , 'rosybrown' , 'royalblue' , 'saddlebrown' , 'salmon' , 'sandybrown' , 'seagreen' , 'seashell' , 'sienna' , 'silver' , 'skyblue' , 'slateblue' , 'slategray' , 'slategrey' , 'snow' , 'springgreen' , 'steelblue' , 'tan' , 'teal' , 'thistle' , 'tomato' , 'turquoise' , 'violet' , 'wheat' , 'white' , 'whitesmoke' , 'yellow' , 'yellowgreen' .

Si ces couleurs ne suffisent pas il existe d'autres possibilités comme d'avoir accès aux couleurs HTML. Par exemple, on remplacera 'aquamarine' par fillcolor='#DC0005'. C'est peut-être la méthode la plus simple, parce qu'en cherchant sur le net on peut trouver des colors pickers comme celui qui suit Un Color Picker. L'inconvénient, c'est qu'on risque de rechercher dans un fichier une couleur à l'aveuglette si ce fichier comprend beaucoup de couleurs. Une solution c'est de la sauvegarder sous un nom et de l'appeler par ce nom. Par exemple, on insérera dans le codevenetianred='#DC0005' et on passera la couleur par fillcolor=venetianred..

On peut maintenant regrouper la représentation des trois équations en utilisant des couleurs différentes pour voir ce qui se produit. Cela va être fait en deux temps parce qu'il faut observer le sens des inégalités avant de pouvoir obtenir le domaine des points faisables.



cl21

En observant $S1$, $S2$ et $S3$, on en conclut que les deux premières inégalités sont dans le même sens, mais que la troisième est dans le sens contraire. On obtient donc le graphique désiré comme suit :

cl22

Ainsi, l'ensemble des points faisables est clairement établi. Mais on peut encore améliorer sa présentation en coloriant complètement le polygone formé par ces points. Pour ce faire, il est nécessaire d'avoir accès à ses sommets. Or, ceux-ci sont délimités par les intersections des frontières des inégalités auxquelles il ne faut pas oublier de rajouter les inégalités constituées par les conditions de positivité. Mais attention, comme le montre une observation du graphique toutes les intersections ne sont pas valides. Voici comment on peut opérer pour obtenir les intersections valides : deux sont le résultat des intersections des droites frontières de faisabilité, deux peuvent se calculer directement soit comme $f_2(0) = x_1$, soit comme $f3(x_0)=0$. On va commencer par se concentrer sur les deux autres sommets. En d'autres termes, on a besoin de : \[ \begin{array}{cl} (x_0,x_1)^a &(x_0,x_1)= (0,0)\\ x_0,x_1)^b & x_0 = 0, x_1 = f1(0) \\ (x_0,x_1)^c & x_0 \text{ solution de } f1(x_ 0)=f2(x_ 0), x_1 = f1(x_0)=f2(x_0)\\ (x_0,x_1)^d & x_0 \text{ solution de } f1(x_ 0)=f3(x_ 0), x_1 = f1(x_0)=f3(x_0)\\ (x_0,x_1)^e & x_0 \text{ solution de } 0=f3(x_0),x_1=0 \end{array} \]



cl23

On dispose de tous les points. On peut donc les positionner sur le graphique. Mais au paravant, il est peut-être nécessaire de commenter le code qui a été utilisé dans la dernière cellule.

  1. Des éléments placés entre crochets ($[\ldots]$) constituent une liste ; des éléments placés entre accolades ($[\ldots]$) constituent un ensemble.
  2. Sur un ensemble, on peut appliquer des fonctions spécifiques à des ensembles, comme par exemple, la constitution de sous-ensembles ($\texttt{Subsets}(\mathcal{A},2)$) qui demande la formation de tous les sous ensembles constitués de 2 éléments à partir de $\mathcal{A}$. Mais le résultat est encore un ensemble.
  3. Quand on a une liste $\texttt{l=[1, 2, 3, 4, 5, 6]}$, il est possible de réaliser des opérations simples pour la réduire, l'augmenter, ou éliminer un élément de la liste. Par exemple :
  4. De manière générique, $x_{inter}=\texttt{solve(3*x+ 2==0, x)}$ permet d'obtenir la racine de l'équation $3*x+ 2=0$ sous la forme $x_{sol}=\texttt{[x==(-2/3)]}$. Il s'agit bien d'une liste. Si on veut utiliser la valeur ($(-2/3)$), il est nécessaire de la récupérer. $x_{sol}\texttt{[0]}$ permet d'obtenir le premier élément de cette liste $(x==(-2/3))$. $x_{sol}\texttt{[0].lhs()}$ permet d'obtenir le terme de gauche ($\texttt{lhs}= \text{left hand side}$) sous entendu de l'assignement signalé par $==$. On remarquera que $sol$ n'est pas un élément mais une liste d'où la présence d'un premier indice pour dire de quel élément il s'agit dans la liste (ici, la liste est composée d'un unique élément).
  5. $\texttt{n(a,i)}$ garantit que le résultat sera donné de manière décimale ($\mathtt{n}$ pour numérique, $\texttt{i}= \text{nombre de décimales}$). C'est important pour pouvoir utiliser le résultat dans les graphiques.

Tout ceci semble un peu particulier pour des personnes qui n'ont qu'une approche élémentaire de la programmation, mais en travaillant avec une feuille et du papier avant de s'attaquer à la programmation, même éléments par éléments, on y arrive.

On peut maintenant rajouter les points sur le graphique.



cl24

Ici, deux commentaires s'imposent :

  1. $\texttt{Python}$ admet deux manières de balayer une liste :
    1. par balayage, la méthode classique d'indiçage des éléments ;
    2. par compréhension, en signalant simplement à quel ensemble les éléments appartiennent. C'est cette seconde méthode qui est utilisée ici.

Maintenant, supposons que l'on cherche à maximiser la fonction objectif suivante :

\[ Z= .35 x_0 + 1.75 x_1 \]

La méthode qui s'apparente le plus à la méthode feuille/crayon est la suivante : on évalue les différentes valeurs de $Z$ calculée en chaque sommet et on cherche la valeur maximale. Ceci peut être réalisé avec le code suivant :

cl25

Il est maintenant facile de compléter le graphique.



cl26

Juste un dernier mot pour finir sur ce point : l'approche proposée ici n'est pas simple. Mais, elle permet de substituer l'imprécision des tracés à mainlevée sur une feuille de papier. Si dans un cours, les choses semblent aller de soi, ne vous faites pas d'illusion : il faut tatônner, remettre mille fois le métier sur l'ouvrage pour atteindre une bonne pratique.


Considérer le programme suivant

\[ \begin{array}{c} \max_{\{x_1,x_2\}} \left\{\left.3 x_1+ 2 x_2\right| 2 x_1+x_2\leq 18, 2x_1 + 3x_2\leq 42,3x_1+x_2\leq 24,x_1 \geq 0,x_2\geq0\right\} \end{array} \]
  1. Donner une représentation du domaine constitué par les contraintes.
  2. Identifier les sommets du domaine.
  3. Donner une représentation de l'objectif.
  4. Déterminer la valeur optimale de l'objectif et de ses arguments.
Réponse 🕵️‍

Considérer le programme suivant

\[ \begin{array}{c} \max_{\{x_1,x_2\}} \left\{\left.3 x_1+ 5 x_2\right| x_1\leq 4, 3x_2\leq 12,3x_1+2x_2\leq 18,x_1 \geq 0,x_2\geq0\right\} \end{array} \]
  1. Donner une représentation du domaine constitué par les contraintes.
  2. Identifier les sommets du domaine.
  3. Donner une représentation de l'objectif.
  4. Déterminer la valeur optimale de l'objectif et de ses arguments.
Réponse 🕵️‍

Considérer le programme suivant

\[ \begin{array}{c} \min_{\{x_1,x_2\}} \left\{\left.5 x_1+ 6 x_2\right| 3x_1+ 2x_2\geq 6, 3x_1-x_2\leq 12,-x_1+x_2\leq 4,2x_1 + 5 x_2 \leq 20,x_1 \geq 0,x_2\geq0\right\} \end{array} \]
  1. Donner une représentation du domaine constitué par les contraintes.
  2. Identifier les sommets du domaine.
  3. Donner une représentation de l'objectif.
  4. Déterminer la valeur optimale de l'objectif et de ses arguments.
Réponse

Considérer le programme suivant

\[ \begin{array}{c} \max_{\{x_1,x_2\}} \left\{\left. 4 x_1+ x_2\right| x_1+ 3x_2\geq 5, 3x_1+x_2\geq 8,-x_1+3x_2\leq 7,x_1 \geq 0,x_2\geq0\right\} \end{array} \]
  1. Donner une représentation du domaine constitué par les contraintes.
  2. Identifier les sommets du domaine.
  3. Donner une représentation de l'objectif.
  4. Déterminer la valeur optimale de l'objectif et de ses arguments.
Réponse🕵️‍

Considérer le programme suivant

\[ \begin{array}{c} \max_{\{x_1,x_2\}} \left\{\left. x_1+ x_2\right| x_1- x_2\geq 2, x_1+x_2\leq 2,x_1\leq 5,x_2 \leq 7, x_1 \geq 0,x_2\geq0\right\} \end{array} \]
  1. Donner une représentation du domaine constitué par les contraintes.
  2. Identifier les sommets du domaine.
  3. Donner une représentation de l'objectif.
  4. Déterminer la valeur optimale de l'objectif et de ses arguments.
Réponse

Construire un exemple de programmation linéaire qui n'est pas faisable et représenter son domaine.

Réponse

Considérons un ménage dont les préférences sont décrites une fonction d'utilité linéaire : $u(c, l) = \alpha c - \beta l$, où $c$est le montant de sa consommation, dont le prix est $p$, $l$ le nombre d'heures travaillées, $\alpha$ et $\beta$ étant des paramètres positifs. On suppose également que le ménage reçoit un niveau de salaire nominal $w$, et que le temps disponible dans la journée est $l_0$.

  1. Écrire la contrainte budgétaire (C.B.).
  2. Tracer graphiquement l'ensemble des contraintes : $c \geq 0$, $l_0 \geq 0$ et C.B.
  3. Trouver une condition en fonction de $(\alpha, \beta)$, pour que $(c^\star, l^\star)$ l'argument du maximum de la fonction d'utilité soit dans l'espace des contraintes.
  4. Résoudre graphiquement le problème linéaire.
Réponse🕵️‍

👈  👉