Programmation de la méthode simplexe en Matlab
Vous allez mettre en œuvre trois fonctions Matlab qui, ensemble, résolvent des programmes linéaires sous forme de :
Où A est une matrice m × n, x est un vecteur ligne de longueur n, et c est un vecteur colonne de longueur n.
Vous ne pouvez pas
supposer que A a une forme particulière; En particulier, on ne doit pas
supposer que A est une matrice de contraintes découlant de
l'introduction de variables lentes de la .
En commençant par un
problème de la forme (1), on introduit m nouvelles variables y1,. . . ,
ym et résoudre le problème auxiliaire
Il est clair que nous
pouvons toujours trouver un vecteur facultatif pour le nouveau problème
auxiliaire (en particulier, nous choisissons les variables de base yj et
les colonnes correspondantes de la matrice de contraintes sont
l'identité).
Le problème initial a un
premier vecteur de base réalisable si et seulement si le problème (2) a
une solution telle que y1 = y2 =. . . = Yn = 0.
Il y a cependant une complication. Si l'on arrive à une solution de (2) pour laquelle toutes les variables de base sont , on a alors un vecteur initialement réalisable pour le problème initial. Si, d'autre part, quelques-uns des s
sont fondamentalement réalisables pour notre solution de (2), alors
nous devrions effectuer d'autres manipulations pour obtenir un vecteur
faisable de base pour le problème initial. Nous ne nous occuperons pas
de cela. Notre procédure d'initialisation tentera de trouver la solution
au problème auxiliaire (2).
Si nous trouvons une telle solution et que les variables de base incluent les , nous allons simplement signaler que notre procédure d'initialisation a échoué.
La première étape
La première étape
consiste à implémenter une fonction Matlab appelée simplexe_etape pour
exécuter une seule étape de la méthode simplex révisée. Nous ferons le
suivi du vecteur de base courant réalisable avec trois variables: iB, iN
et xB. Le vecteur iB tiendra les indices de l'ensemble courant de
variables de base, iN tiendra les indices de l'ensemble courant de
variables non base, et xB tiendra les valeurs des variables de base.
La fonction simplexe_etape doit être placée dans un fichier simplexe_etape.m et elle doit avoir la séquence suivante:
function [istatus,iB,iN,xB] = simplexe_etape(A,b,c,iB,iN,xB,iregle)
%
% Prendre une seule méthode simplex pour le programme linéaire
%
% min: c*x
% ST: Ax=b
% x>=0,
%
% ou A est une matrice (m,n).
%
% Paramètres d'entrée:
%
% A - (n, m) matrice de contraintes
% B - (m, 1) Vecteur POSITIF apparaissant dans l'équation de contrainte ci-dessus
% C - (1, n) vecteur donnant les coefficients de la fonction objective
% iB - (1, m) vecteur entier spécifiant les indices des variables de base au début de l'étape simplex
% iN - (1, n-m) vecteur entier représentant les indices de la non-base
% De variables au début de l'étape simplex
% xB - (m, 1) vecteur spécifiant les valeurs de la base
% De variables au début de l'étape simplex
%
% Iregle - paramètre entier spécifiant la règle de pivot à utiliser:
% iregle= 0 indique que la règle du coefficient le plus petit doit être utilisée
% Irelgle = 1 indique que la règle de Bland doit être utilisée%
%
% Paramètres de sortie:
%
% Istatus - paramètre entier rapportant la progression ou lac de celui-ci effectué par cette fonction
% Istatus = 0 indique l'étape normale de la méthode simple non dégénérée terminée
% Istatus = 16 indique que le programme est illimité
% Istatus = -1 indique qu'un vecteur optimal possible a été trouvé
%
% iB - vecteur entier spécifiant les m indices des variables de base après l'étape simplex
% iN - vecteur entier spécifiant les indices n-m des variables non basses après l'étape simplex
% xB - vecteur de longueur m spécifiant les valeurs des variables de base après l'étape simplex
%
Étape deux
La deuxième étape
consiste à implémenter une fonction Matlab pour effectuer
l'initialisation. La fonction doit être appelée simplexe_init et elle
doit être placée dans le fichier simplexe_init.m. La séquence d'appel de
cette fonction est:
function [istatus,iB,iN,xB] = simplexe_init(A,b,c)
%
% Tentative de trouver un vecteur facultatif de base pour le programme linéaire
%
% max: c*x
% ST: Ax=b
% x>=0,
%
% ou A est une matrice (m,n).
%
% Paramètres d'entrée:
%
% A - (n, m) matrice de contraintes
% B - (m, 1) vecteur apparaissant dans l'équation de contrainte ci-dessus
% C - (1, n) vecteur donnant les coefficients de la fonction objective
%
% Paramètres de sortie:
%
% istatus - paramètre entier indiquant le résultat de la procédure d'initialisation
% istatus = 0 indique qu'un vecteur réalisable de base a été trouvé
% istatus = 4 indique que la procédure d'initialisation a échoué
% istatus = 16 indique que le problème est impossible
%
% iB - vecteur entier de longueur m spécifiant les indices des variables de base
% iN - vecteur entier de longueur n-m caractérisant les indices des variables non basses
% xB - vecteur de longueur m spécifiant les valeurs des variables de base
%
Troisième étape :
L'étape finale est la
mise en œuvre d'une méthode simplex de fonction Matlab qui a utilisé les
deux fonctions précédentes pour calculer une solution à un programme
linéaire. La séquence de la méthode de la fonction simplexe, ce qui
devrait se trouver dans le fichier simplexe_methode.m, est la suivante:
function [istatus,X,eta,iB,iN,xB] = simplexe_methode(A,b,c,iregle)
%
% Trouver une solution optimale de base pour le programme linéaire
%
% min: c*x
% ST: Ax=b
% x>=0,
%
% ou A est une matrice (m,n).
%
% Paramètres d'entrée:
%
% A - (n, m) matrice de contraintes
% b - (m, 1) Vecteur POSITIF apparaissant dans l'équation de contrainte ci-dessus
% c - (1, n) vecteur donnant les coefficients de la fonction objective
%
% iregle - paramètre entier spécifiant la règle de pivot à utiliser:
% iregle = 0 indique que la règle du coefficient le plus petit doit être utilisée
% iregle = 1 indique que la règle de Bland doit être utilisée
%
% Paramètres de sortie:
%
% istatus - paramètre entier indiquant les résultats obtenus par cette fonction
% istatus = 0 indique une complète complète (c'est-à-dire qu'une solution a été trouvée et rapportée)
% istatus = 4 indique que le programme est impossible
% istatus = 16 indique que le programme est possible mais que notre procédure d'initialisation a échoué
% Istatus = 32 indique que le programme est illimité
%
% X vecteur de longueur n spécifiant la solution
% eta - la valeur minimale de la fonction objectif
% iB - vecteur entier spécifiant les m indices des variables de base après l'étape simplex
% iN - vecteur entier spécifiant les indices n-m des variables non basses après l'étape simplex
% xB - vecteur de longueur m spécifiant les valeurs des variables de base après l'étape simplex
%
En utilisant n'importe
quelle technique que vous souhaitez, modifiez votre fonction
simplexe_init , il marchera très biens à moins que le programme linéaire
ne soit faisable.
je peut avoir le code source (.M)
RépondreSupprimerMerciii....