previous up next contents
Previous: 2. Algorithme du simplexe Up: Recherche Opérationnelle Next: B. Compléments   Contents

Subsections

A. Programmation effective

A.1 Listings commentés (Maple)

Une optimisation évidente de l'algorithme du simplexe consiste à confier le soin des additions et multiplications à un ordinateur. On sera néanmoins attentif à ne pas sous-traiter la réflexion, qui constitue le coeur du métier d'ingénieur.


\begin{algorithm}
% latex2html id marker 886
[htbp]
\begin{algorithmic}[1]
\par
...
...t des inégalités, création des variables supplémentaires.
}
\par
\end{algorithm}

Le programme mk_simplex (LISTING 1) a pour objectif de créer toutes les variables auxiliaires nécessaires à la transformation des inéquations en équations et à la transformation des contraintes non satisfaites par l'origine du problème initial en contraintes satisfaites par l'origine d'un problème de plus grande taille. Pour des raisons de commodité, les trois sortes de variables s'appellent toutes $ x$, l'indice variant de $ 1$ à $ N$ pour les variables naturelles, de $ N+1$ à $ N+M$ pour les variables "$ y$" et de $ N+M+1$ à la fin pour les variables "$ z$".

En sortie, $ eqs$ contient les équations récrites, $ tous$ est l'ensemble de toutes les variables, $ spec$ est l'ensemble des variables "$ z$" et $ lieu$ est la liste des coordonnées dont l'égalité à 0 caractérise le point où l'on se trouve.

Le programme pt_vue (LISTING 2) est un programme "cosmétique" destiné à récrire l'ensemble des équations du point de vue du sommet où l'on se trouve. L'écriture effective de ce programme est tout à fait simple (on utilise $ solve$ pour résoudre), mais est loin d'être optimale. En effet, une étape est caractérisée par l'échange de rôles entre une variable "actuellement principale" et une variable "actuellement auxiliaire" : une résolution de proche en proche serait plus rapide.


\begin{algorithm}
% latex2html id marker 930
[htbp]
\begin{algorithmic}[1]
\par
...
...fichage du système (du point de vue du sommet en cours).
}
\par
\end{algorithm}

Le programme avance (LISTING 5) exécute le déplacement consistant en l'échange des rôles entre la variable principale $ piv$, choisie par l'utilisateur, et la variable auxiliaire exerçant la contrainte la plus forte. Le cas exceptionnel où l'on trouve un mouvement $ x_{piv}=0$ ne se produit qu'en présence de contraintes redondantes.


\begin{algorithm}
% latex2html id marker 941
[htbp]
\begin{algorithmic}[1]
\par
...
... de l'algorithme (avec choix du pivot par l'utilisateur).
}
\par
\end{algorithm}

\begin{algorithm}
% latex2html id marker 951
[htbp]
\begin{algorithmic}[1]
\par
...
...right)$\ ;
\par
\end{algorithmic}
\par
\caption{randavan}
\par
\end{algorithm}


\begin{algorithm}
% latex2html id marker 961
[htbp]
\begin{algorithmic}[1]
\par
...
... de l'algorithme (avec choix du pivot par l'utilisateur).
}
\par
\end{algorithm}


\begin{algorithm}
% latex2html id marker 970
[htbp]
\begin{algorithmic}[1]
\par
...
...e étape de l'algorithme (avec choix aléatoire du pivot).
}
\par
\end{algorithm}

Enfin, le programme randavance (LISTING 6) détermine quels sont les pivots possibles (variables ayant une influence positive sur la fonction de bénéfice) et en choisit un aléatoirement.

A.2 Scilab 4.1 utilise un algorithme quadratique

Scilab A.2.1   La commande Scilab 4.1 de résolution des "programmes linéaires" est linpro. Consulter l'aide en ligne help(linpro) pour une description de la syntaxe. Etre attentif au fait que $ f$ est considérée comme une fonction de coût...

Exercise A.2.2   Examiner la feuille de calcul linpro.sci et en déduire la méthode utilisée par le logiciel pour calculer l'optimum voulu.

Scilab A.2.3   Pour résoudre l'exemple de la Section 1.2, nous écrivons :
.  ci=[0;0]       // contrainte inférieure sur $ x_{1},  x_{2}$
.  cs=[1000;500] // contraintes supérieures, matérialisées par $ x_{3},  x_{4}$
.  p=-[4;12]     // les coefficients de la fonction de côut
.  C=[3,6]       // les coefficients des contraintes (ici : $ x_{5}$)
.  b=[4200]      // les majorants contraignants
.  [xx, lagr,ff]=linpro(p,C,b,ci,cs)
Et nous recevons :
.  xx= $ \left[400. ; 500.\right]$, lagr= $ \left[0. ; 4. ; 1.333\right]$, ff=$ -7600$

Exercise A.2.4   Reprendre les calculs en commençant par modifier $ x_{2}$ au point 4 ci-dessus

A.3 Programme simplexe sous Scilab

A.3.1 Incantations initiales


\begin{algorithm}
% latex2html id marker 1014
[!h]
\begin{algorithmic}[1]
\par
\...
...\par
\end{algorithmic}\par
\caption{Incantations initiales}
\par
\end{algorithm}

Les sorties se font à l'écran et dans un fichier. La fonction mymprint gère cela. Avec funcprot(0), on évite le message "fonction redéfinie". Avec ieee(2), une division par 0 engendre le nombre %inf et non une erreur. Avec myseed, on initialise le générateur aléatoire (utile pour debug).

A.3.2 Entrée des données et affichage


\begin{algorithm}
% latex2html id marker 1035
[!h]
\begin{algorithmic}[1]
\par
\...
...) }
\par
\end{algorithmic}\par
\caption{Entrée des données}
\par
\end{algorithm}

La matrice $ ms$ regroupe toutes les données du système. Les contraintes supérieures sont entrées comme des contraintes ordinaires. Les formats d'affichage (fff pour la matrice et fvu pour la vue) sont construits d'après les données.


previous up next contents
Previous: 2. Algorithme du simplexe Up: Recherche Opérationnelle Next: B. Compléments   Contents


douillet@ensait.fr
2008-11-28