function [k, X, Y, pasos, basicos] = vnsimplex(F, signoX, signoXF, basicos, algoritmo)1%vnsimplex2% [k, X, Y] = vnsimplex(F)3%4% Busca la soluci�n de VN mediante el algoritmo simplex. Se parte de unos5% procesos b�sicos. Se resuelve VN para esos procesos y se descartan de6% los b�sicos los procesos con p�rdidas; si ning�n proceso tiene7% rentabilidad positiva se ha encontrado una soluci�n; en caso contrario8% se incorpora a los b�sicos el proceso m�s rentable y se itera el9% procedimiento.10%11% [k, X, Y] = vnsimplex(F, signoX, signoXF, basicos, algoritmo)12% F recetas en tiempo discreto13% signoX signo de las intensidades; por defecto X >= 014% signoXF signo de los balances materiales; por defecto X F(k) = 015% basicos procesos b�sicos con los que se inicia la iteraci�n16% algoritmo n�mero del algoritmo para resolver los problemas b�sicos17% k, X, Y factor, intensidades y valores soluci�n18%19% Los c�digos para los signos son 0 = 1 >= 2 <= 3 >=<20% Si basicos = [] escoge como b�sicos los �ltimos procesos.21% Si algoritmo = [] escoge autom�ticamente el algoritmo para resolver los22% sucesivos sistemas b�sicos.2324% necesita vn.m, forma0.m2526if nargin < 2, signoX = []; end27if nargin < 3, signoXF = []; end28if nargin < 4, basicos = []; end29if nargin < 5, algoritmo = []; end3031cero = 1e-12; %define la precisi�n del cero32[filas, columnas, ancho] = size(F); %determina el tama�o del problema33if isempty(signoX), signoX = 1; end %si no est� definido signoX supone que X >= 034if size(signoX, 2) == 1, signoX = signoX .* ones(1, filas); end %si signoX es un escalar lo aplica a todos los procesos35s0 = (signoX==0); s2 = (signoX==2); s3 = (signoX==3); %establece los procesos con los que no X >= 036if isempty(basicos), basicos=filas:-1:max(1,filas-columnas*5); end %si basicos no est� definido pone los �ltimos procesos37if isempty(algoritmo), algoritmo = -1; end %si algoritmo no est� definido elecci�n autom�tica38k = []; X = []; Y = []; Xbas = []; %crea las variables39for pasos = 1:200 %inicia una iteraci�n de hasta 200 pasos40[k,Xbas,Y]=vn(F(basicos,:,:),signoX(basicos),signoXF,algoritmo,k,Xbas,Y); %busca una soluci�n de VN para los procesos b�sicos41if isempty(k), return; end %si los b�sicos no tienen soluci�n interrumpe42benef = forma0(F, k) * Y; %calcula los beneficios de todos los procesos43benef(s0) = -Inf; benef(s2) = -benef(s2); benef(s3) = abs(benef(s3)); %ajusta los beneficios seg�n su signoX44salida = (benef(basicos) < -cero); %calcula los procesos b�sicos con p�rdidas45basicos(salida) = []; Xbas(salida) = []; %quita de los b�sicos los procesos con p�rdidas46[beneficiomax, entrada] = max(benef); %calcula el proceso m�s rentable de todos47if beneficiomax <= cero, break; end %si no hay procesos m�s que rentables sale del bucle48basicos = [entrada, basicos]; Xbas = [0, Xbas]; %a�ade el proceso m�s rentable a los b�sicos49end %repite el bucle50if pasos>=200, disp('Atenci�n, se super� el m�ximo de iteraciones'); end %avisa de que se ha superado el m�ximo de iteraciones51X = zeros(1,filas); X(basicos) = Xbas; %pone las intensidades de los b�sicos525354