Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [k, X, Y, pasos, basicos] = vnsimplex(F, signoX, signoXF, basicos, algoritmo)
2
%vnsimplex
3
% [k, X, Y] = vnsimplex(F)
4
%
5
% Busca la soluci�n de VN mediante el algoritmo simplex. Se parte de unos
6
% procesos b�sicos. Se resuelve VN para esos procesos y se descartan de
7
% los b�sicos los procesos con p�rdidas; si ning�n proceso tiene
8
% rentabilidad positiva se ha encontrado una soluci�n; en caso contrario
9
% se incorpora a los b�sicos el proceso m�s rentable y se itera el
10
% procedimiento.
11
%
12
% [k, X, Y] = vnsimplex(F, signoX, signoXF, basicos, algoritmo)
13
% F recetas en tiempo discreto
14
% signoX signo de las intensidades; por defecto X >= 0
15
% signoXF signo de los balances materiales; por defecto X F(k) = 0
16
% basicos procesos b�sicos con los que se inicia la iteraci�n
17
% algoritmo n�mero del algoritmo para resolver los problemas b�sicos
18
% k, X, Y factor, intensidades y valores soluci�n
19
%
20
% Los c�digos para los signos son 0 = 1 >= 2 <= 3 >=<
21
% Si basicos = [] escoge como b�sicos los �ltimos procesos.
22
% Si algoritmo = [] escoge autom�ticamente el algoritmo para resolver los
23
% sucesivos sistemas b�sicos.
24
25
% necesita vn.m, forma0.m
26
27
if nargin < 2, signoX = []; end
28
if nargin < 3, signoXF = []; end
29
if nargin < 4, basicos = []; end
30
if nargin < 5, algoritmo = []; end
31
32
cero = 1e-12; %define la precisi�n del cero
33
[filas, columnas, ancho] = size(F); %determina el tama�o del problema
34
if isempty(signoX), signoX = 1; end %si no est� definido signoX supone que X >= 0
35
if size(signoX, 2) == 1, signoX = signoX .* ones(1, filas); end %si signoX es un escalar lo aplica a todos los procesos
36
s0 = (signoX==0); s2 = (signoX==2); s3 = (signoX==3); %establece los procesos con los que no X >= 0
37
if isempty(basicos), basicos=filas:-1:max(1,filas-columnas*5); end %si basicos no est� definido pone los �ltimos procesos
38
if isempty(algoritmo), algoritmo = -1; end %si algoritmo no est� definido elecci�n autom�tica
39
k = []; X = []; Y = []; Xbas = []; %crea las variables
40
for pasos = 1:200 %inicia una iteraci�n de hasta 200 pasos
41
[k,Xbas,Y]=vn(F(basicos,:,:),signoX(basicos),signoXF,algoritmo,k,Xbas,Y); %busca una soluci�n de VN para los procesos b�sicos
42
if isempty(k), return; end %si los b�sicos no tienen soluci�n interrumpe
43
benef = forma0(F, k) * Y; %calcula los beneficios de todos los procesos
44
benef(s0) = -Inf; benef(s2) = -benef(s2); benef(s3) = abs(benef(s3)); %ajusta los beneficios seg�n su signoX
45
salida = (benef(basicos) < -cero); %calcula los procesos b�sicos con p�rdidas
46
basicos(salida) = []; Xbas(salida) = []; %quita de los b�sicos los procesos con p�rdidas
47
[beneficiomax, entrada] = max(benef); %calcula el proceso m�s rentable de todos
48
if beneficiomax <= cero, break; end %si no hay procesos m�s que rentables sale del bucle
49
basicos = [entrada, basicos]; Xbas = [0, Xbas]; %a�ade el proceso m�s rentable a los b�sicos
50
end %repite el bucle
51
if pasos>=200, disp('Atenci�n, se super� el m�ximo de iteraciones'); end %avisa de que se ha superado el m�ximo de iteraciones
52
X = zeros(1,filas); X(basicos) = Xbas; %pone las intensidades de los b�sicos
53
54