function [k, X, Y, pasos, distancias, sal1, sal2] = vn(F, signoX, signoXF, algoritmo, par1, par2, par3)
if nargin < 2, signoX = []; end
if nargin < 3, signoXF = []; end
if nargin < 4, algoritmo = []; end
if nargin < 5, par1 = []; end
if nargin < 6, par2 = []; end
if nargin < 7, par3 = []; end
k = []; X = []; Y = []; pasos = []; distancias = []; sal1 = []; sal2 = [];
if isempty(F), disp('Los procesos de producci�n no est�n definidos'); return, end
[filas, columnas, ancho] = size(F);
if ancho == 1, [filas, columnas] = size(forma0(F, 1)); end
if isempty(signoX), signoX = 1; end
if size(signoX, 2) == 1, signoX = signoX.*ones(1,filas); end
if isempty(signoXF), signoXF = 0; end
if size(signoXF, 2) == 1, signoXF = signoXF.*ones(1,columnas); end
if isempty(algoritmo), algoritmo = 0; end
simplex = (algoritmo == -1);
if algoritmo <= 0
if ancho == 1
algoritmo = 11;
else
filasestandar = filas - sum(signoX == 0) + sum(signoXF == 1) + sum(signoXF == 2) + 2*sum(signoXF == 3);
if (filas*columnas) < 50
if simplex, par1 = []; par2 = 1; end
algoritmo = 1;
elseif and(abs(filasestandar-columnas) < 2, columnas < 100)
if simplex, par1 = 1; end
algoritmo = 2;
elseif and(filasestandar==columnas, columnas < 500)
if simplex, par1 = 1; end
algoritmo = 2;
elseif and(filas < 3000, columnas < 200)
algoritmo = 11;
else
if simplex
algoritmo = 11;
else
algoritmo = 6;
end
end
end
end
if and(ancho == 1, sum(algoritmo==[1,2,6,7,8]))
F = formapolinomioinverso(F);
disp('Matrices de flujos netos aproximadas con formapolinomioinverso');
end
switch algoritmo
case 1
disp('Algoritmo 1: vnautovalor');
[k, X, Y, pasos] = vnautovalor(F, signoX, signoXF, par1, par2);
[X, Y, k] = normalizacion(k, X, Y, F, 1);
[k, X, Y] = quitarsolucionesrepetidas(k, X, Y);
case 2
disp('Algoritmo 2: vnautovalor mayor orden');
[Fn, signoX, signoXF] = formaproblema(F, signoX, signoXF);
[k, X, Y, pasos] = vnautovalor(Fn, 1, 0, 0, par1);
[X, Y] = formasolucion(X, Y, signoX, signoXF);
[X, Y, k] = normalizacion(k, X, Y, F, 1);
[k, X, Y] = quitarsolucionesrepetidas(k, X, Y);
case 3
disp('Algoritmo 3: vnbiseccion');
[k, X, Y, pasos] = vnbiseccion(F, signoX, signoXF, par1, par2);
[X, Y] = normalizacion(k, X, Y, F);
case 4
disp('Algoritmo 4: vnnewton');
[k, X, Y, pasos] = vnnewton(F, signoX, signoXF, par1);
[X, Y] = normalizacion(k, X, Y, F);
case 5
disp('Algoritmo 5: vnpls');
[k, X, Y, pasos] = vnpls(F, signoX, signoXF, par1, par2);
case 6
disp('Algoritmo 6: vnsimplex');
[k, X, Y, pasos, sal2] = vnsimplex(F, signoX, signoXF, par1);
case 7
disp('Algoritmo 7: vnnolineal');
[k, X, Y, pasos, sal1] = vnnolineal(F, signoX, signoXF, par1, par2);
[X, Y] = normalizacion(k, X, Y, F);
case 8
disp('Algoritmo 8: vnbrody');
[k, X, Y] = vnbrody(F, signoX, signoXF);
[X, Y] = normalizacion(k, X, Y, F);
case 9
[k, Xsi, Ysi, u, pasos, kno, Xno, Yno] = cpbusqueda(F, signoX, signoXF, par1);
[X, Y] = normalizacion(k, Xsi, Yno, F);
if condicionesvn(k, X, Y, F, signoX, signoXF)
disp('Algoritmo 9: cpbusqueda');
else
[k, X, Y, pasos2] = vnbiseccion(F, signoX, signoXF, k, kno);
pasos = [pasos, pasos2];
[X, Y] = normalizacion(k, X, Y, F);
disp('Algoritmo 9: cpbusqueda -> vnbiseccion');
end
case 10
[k, X, Y, u, pasos] = cpbusqueda(F, signoX, signoXF, par1);
[X, Y] = normalizacion(k, X, Y, F);
if condicionesvn(k, X, Y, F, signoX, signoXF)
disp('Algoritmo 10: cpbusqueda');
else
[k, X, Y, pasos2] = vnpls(F, signoX, signoXF, k, X);
pasos = [pasos, pasos2];
disp('Algoritmo 10: cpbusqueda -> vnpls');
end
case 11
k0 = par1;
X = par2;
[k1, X, Y, pasos] = vnpls(F, signoX, signoXF, k0, X);
if condicionesvn(k1, X, Y, F, signoX, signoXF)
disp('Algoritmo 11: vnpls');
k = k1;
else
[ksi, Xsi, Ysi, usi, pasos2] = cpbusqueda(F, signoX, signoXF, k0);
pasos = [pasos, pasos2];
[X, Y] = normalizacion(ksi, Xsi, Ysi, F);
if condicionesvn(ksi, X, Y, F, signoX, signoXF)
disp('Algoritmo 11: vnpls; cpbusqueda');
k = ksi;
else
[k3, X, Y, pasos3] = vnpls(F, signoX, signoXF, ksi, Xsi);
pasos = [pasos, pasos3];
if condicionesvn(k3, X, Y, F, signoX, signoXF)
disp('Algoritmo 11: vnpls; cpbusqueda -> vnpls');
k = k3;
else
[kw, Xw, Yw, uw, pasos4, kno, Xno, Yno] = cpbusqueda(F, signoX, signoXF, ksi, 1);
pasos = [pasos, pasos4];
[X, Y] = normalizacion(ksi, Xsi, Yno, F);
if condicionesvn(ksi, X, Y, F, signoX, signoXF)
disp('Algoritmo 11: vnpls; cpbusqueda -> vnpls; cpbusqueda');
k = ksi;
else
[k, X, Y, pasos5] = vnbiseccion(F, signoX, signoXF, ksi, kno);
pasos = [pasos, pasos5];
[X, Y] = normalizacion(k, X, Y, F);
disp('Algoritmo 11: vnpls; cpbusqueda -> vnpls; cpbusqueda -> vnbiseccion');
end
end
end
end
otherwise
disp('Atenci�n, no hay ning�n algoritmo con ese n�mero');
end
numsoluciones = size(k, 2);
distancias = zeros(filas+columnas+1, 3, numsoluciones);
if numsoluciones == 0
disp('Atenci�n, no se ha encontrado ninguna soluci�n');
else
for c1 = 1:numsoluciones
[solucion, distancia, distanciatotal] = condicionesvn(k(c1), X(c1,:), Y(:,c1), F, signoX, signoXF);
if nargout > 4, distancias(:,:,c1) = distancia; end
if ~solucion
if numsoluciones > 1, q = [' ', num2str(c1), ' ']; else q = ' '; end
disp(['Atenci�n, la distancia de la soluci�n', q, 'a las condiciones de m�ximo, ', num2str(distanciatotal) , ', supera la prefijada.']);
end
end
end
function [X, Y, k] = normalizacion(k, X, Y, F, tipo)
if nargin < 5, tipo = 0; end
v = version;
for c1 = 1:size(k, 2)
if and(tipo == 1, v([1,2]) == '5.')
w = max(abs(imag([k(c1), X(c1,:), Y(:,c1)'])));
if w > 1e-10, disp(['Atenci�n, la soluci�n ', num2str(c1) , ' conten�a t�rm�nos complejos de magnitud ', num2str(w), '.']); end
k(c1) = real(k(c1)); X(c1,:) = real(X(c1,:)); Y(:,c1) = real(Y(:,c1));
end
s = sum(abs(X(c1,:)));
if s > 0
X(c1,:) = X(c1,:) ./ s;
Y(:,c1) = Y(:,c1) .* s;
end
if tipo == 0
q = -X(c1,:) * forma1(F, k(c1)) * Y(:,c1);
if abs(q) > 0, Y(:,c1) = Y(:,c1) ./ q; end
end
end
function [k, X, Y] = quitarsolucionesrepetidas(kn, Xn, Yn)
if ~isempty(kn)
k = kn(1); X = Xn(1, :); Y = Yn(:, 1);
for c1 = 2:size(kn, 2)
poner = 1;
for c2 = 1:size(k, 2)
if sum(abs([kn(c1), Xn(c1,:), Yn(:,c1)'] - [k(c2), X(c2,:), Y(:,c2)'])) < 1e-12
poner = 0; break;
end
end
if poner, k = [k, kn(c1)]; X = [X; Xn(c1,:)]; Y = [Y, Yn(:,c1)]; end
end
else
k = []; X = []; Y = [];
end