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.
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
, l'indice variant de
à
pour les
variables naturelles, de
à
pour les variables "
"
et de
à la fin pour les variables "
".
En sortie,
contient les équations récrites,
est l'ensemble
de toutes les variables,
est l'ensemble des variables "
"
et
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
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.
Le programme avance (LISTING 5) exécute le déplacement
consistant en l'échange des rôles entre la variable principale
,
choisie par l'utilisateur, et la variable auxiliaire exerçant la contrainte
la plus forte. Le cas exceptionnel où l'on trouve un mouvement
ne se produit qu'en présence de contraintes redondantes.
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.
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).
La matrice
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.