Documente Academic
Documente Profesional
Documente Cultură
Qu es?
Es un algoritmo que permite hallar la inversa de una matriz paso a paso por
medio de iteraciones usando solo la misma matriz
Qu hace?
Realiza operaciones elementales con cada fila, de manera tal que despus de n
iteraciones se consigue la matriz inversa.
Variables:
v = guarda la matriz original
A = matriz que cambia en cada iteracion
d = tamao de la matriz
r = elemento de la matriz cuyo subndices son iguales
P = recorrido de los elementos de la matriz
K = multiplicacin de cada elemento de la matriz por uno de sus elementos
Codigo en Matlab
% Invertir matriz usando las filas
%A=input(' Ingresar Matriz A= ') % Ingresar matriz a invertir
A=[1 0 3
2 4 1
2 1 1];
v=A; % Guardar matriz original
d= max(size(A)); % Dimension de la Matriz
for i=1:d
r=A(i,i); % Recorrer elementos en la diagonal
principal
P=A(i:i,1:d)./r; % dividir fila entre r
P(1,i)=P(1,i)/r; % dividir el pivote entre r
A(i:i,1:d)=P; % guardar fila pivote
for j=1:d
if j~=i
K=P.*A(j,i);
A(j,i)=0;
A(j:j,1:d)=A(j:j,1:d)-K;
end
end
A;
end
inv=A % Comprobar resultado
Ide=A*v
Donde la funcin lineal (8) se llama funcin objetivo; las desigualdades (9) se
llama restricciones y a (10) es la condicin de no negatividad. La optimizacin
puede significar maximizar o minimizar.
Qu hace?
Variables:
I= matriz original
A = matriz
f*c = tamao de la matriz
n = nmero de ecuaciones
vv = nmero de variables
k = ndice de columna (mas negativo)
M(r,k) = posicin
p = el minimo de la matriz
piv = pivote a escoger
Mp = fila donde se encuentra el pivote
Codigo en Matlab
% Guardar en MM la Matriz que constara de funacion objetivo,
% Matriz de restricciones y matriz b
% Ejm MM= [5000 3000 0
% 3 5 15
% 5 2 10 ]
I=MM
[f,c] = size(I); % tamao de la matriz fxc
v=c-1; % numero de variables
n=f-1; % numero de ecuaciones
% Construccion del Tablero Simplex
M=zeros(f,c+n);
M(1:1,1:v)=-I(1:1,1:v);
M(2:f,1:v)=I(2:f,1:v);
M(2:f,v+1:v+n)=eye(n);
M(2:f,c+n:c+n)=I(2:f,c:c)
c=c+n; % Columnas de M
xi=(v+1:1:v+n)'; % Indicador de variables en la Base
for i=1:n
%indice de columna a tomar (mas negativo)
k=min(find(M(1:1,1:c-1)==min(M(1:1,1:c-1))));
%Pivote a escoger y su posicion
pp=M(2:f,c:c)./M(2:f,k:k);
% Hacer todos los componentes del vector pp positivos
% -------------------
d=abs(max(pp))+1;
for w=1:n
if pp(w)<0
pp(w)=d;
end
end
% ------------------
p=min(pp);
r=find(pp==p)+1; % Fila donde esta el pivote
piv=max(M(r,k)); % Valor del pivote
%dividir la fila donde se encuenrta el pivote entre p
Mp=M(r:r,1:c)./piv; % Fila Pivote
M(r:r,1:c)=Mp;
for j=1:f % Se hacen operaciones con la fila pivote
if j~=r
w=max(M(j:j,k:k));
M(j:j,1:c)=M(j:j,1:c)-(Mp*w);
end
end
M % Visualizar resultado de la iteracion
xi(r-1,1)=k; % Identificar variable que ingresa ala base
end
xi(1:n,2:2)=M(2:f,c:c)
z=M(1,c)
Ejemplo
Ejecucion del programa
INFORME DE LABORATORIO DE OPTIMIZACION LINEAL
TEMA: METODO DE PENALIZACION BIG M
FECHA: 01/09/2016
Qu es?
Qu hace?
Variables:
properties(SetAccess = private)
A; % Matriz de restricciones in Ax {<=, =, >=} b
b; % Recursos
c; % Vector de coeficientes de function
inq; % m dimension del vector,
% 1 for >=; 0 for ==; -1 for <=.
m; % Numero de restricciones
n; % Numero de variables originales
x_opt; % solution optima
fval; % Valor objetivo ptimo
type; % Minimizar o maximizar el problema
end
tab; % Tableau
status; % maxIter, ilimitado, imposible, ptimo
terminate;
vars_list; % Lista de nombres de todas las variables
unbounded_vars; % variables sin restriccion
end
properties( Constant )
maxIter = 20;
end
methods
% Comprobar entrada
if nargin < 4
error('bigM: Entrada insuficiente');
end
%% Leer la entrada
% Comprobar min o max
if strcmpi(type,'max')
c = -c;
end
% Compruebe si b es negativo
b_Neg = b < 0;
inq(b_Neg) = -inq(b_Neg);
b(b_Neg) = -b(b_Neg);
A(b_Neg,:) = -A(b_Neg,:);
% Asignar propiedades
p.A = A; p.b = b; p.c = c;
p.inq = inq;
p.terminate = 0;
p.type = type;
end
p.transform_to_standardForm;
p.construct_initial_tableau;
p.printTab;
while ~p.terminate
p.do_simplex_iterate;
p.increment_counter;
p.printTab;
p.remove_artfcl_vars;
p.check_termination;
end
p.output_summary;
end
function transform_to_standardForm(p)
% aadir variables slack
p.n_slack = sum(p.inq < 0)+sum(p.inq > 0);
p.A = [p.A zeros(p.m, p.n_slack)];
p.c = [p.c; zeros(p.n_slack,1)];
idx_slack = p.n+1;
for i = 1:p.m
switch p.inq(i)
case 1 % >=
p.A(i, idx_slack) = -1;
idx_slack = idx_slack+1;
p.vars_list{end+1} = ['s' num2str(i)];
case -1 % <=
p.A(i, idx_slack) = 1;
idx_slack = idx_slack+1;
p.vars_list{end+1} = ['s' num2str(i)];
end
end
end
function construct_initial_tableau(p)
% Encontrar una base potencial
for i = 1:p.n+p.n_slack
if nnz(p.A(:,i)) == 1
row_number = find(p.A(:,i) == 1);
if ~isempty(row_number)
% Aade la columna si no se ha seleccionado la fila actual
if ~ismember(row_number, p.whichRow)
p.whichRow(end+1) = row_number;
p.basis(row_number) = i;
end
end
end
end
% Aadir bigM si es necesario
p.n_artfVar = p.m - sum(p.basis > 0);
if p.n_artfVar > 0
p.artfcl_var_removed = 0;
% Obtener reducedCost
p.reducedCost = zeros(1,p.n + p.n_slack + p.n_artfVar);
y = p.c(p.basis);
function do_simplex_iterate(p)
% DO_SIMPLEX_ITERATE Realiza una iteracin del mtodo simplex.
% In/out basis
p.basis(chooseRow) = workCol;
% Obtener el pivote
pivot = p.tab(chooseRow, workCol);
tmp_row_indx = setdiff(1:p.m+1,chooseRow);
p.tab(tmp_row_indx, :) = p.tab(tmp_row_indx, :) -...
ones(p.m,1) * p.tab(chooseRow,:) .*...
( p.tab(tmp_row_indx, workCol) *...
ones(1,size(p.tab,2)) );
end
function remove_artfcl_vars(p)
% Comprobar si se pueden eliminar variables artificiales
if ~p.artfcl_var_removed
if all( p.tab(end, p.artfcl_var_set) > 0 )
p.tab(:,p.artfcl_var_set) = [];
p.vars_list( p.artfcl_var_set ) = [];
p.artfcl_var_removed = 1;
p.printTab;
end
end
end
function increment_counter(p)
p.counter = p.counter+1;
end
function printTab(p)
for i=1:p.m+1
if i <= p.m
fprintf('%2s | ', p.vars_list{p.basis(i)});
else
fprintf('---------------------------------------------\n');
fprintf('%2s | ', 'RC');
end
for j = 1:size(p.tab,2)
fprintf('%8.2f %4s', p.tab(i,j), '');
if j == size(p.tab,2)-1
fprintf(' | ')
end
end
fprintf('\n');
end
end
function output_summary(p)
if p.terminate
fprintf('\n========== ========== ==========\n');
fprintf('Terminado. \n');
switch lower( p.status )
case 'optimal'
fprintf('Solucion optima: \n');
for i=1:p.n
fprintf('x[%2d ] = %5.2f\n', i, p.x_opt(i));
end
fprintf('Valor optimo de la funcion objetivo: %5.2f\n', p.fval);
case 'ilimitado'
fprintf('el problema es ilimitado. \n');
fprintf('variables ilimitadas: ');
for i = 1:length(p.unbounded_vars)
fprintf('%2s ',p.vars_list{p.unbounded_vars(i)});
end
fprintf('\n');
case 'imposible'
fprintf('problema imposible.\n');
case 'maxiter'
fprintf('numero maximo de iteraciones encontrado.\n');
end
end
end
end
end
Ejemplo1
% max 2x1 + 3x2
% s.t. x1 + 4x2 <= 4
% 2x1 + 3x2 <= 6
% 2x1 + x2 <= 4
% x1>=0, x2>=0.
c = [ 2 3 ]';
A = [1 4; 2 3 ; 2 1];
b = [4 6 4]';
inq = [-1 -1 -1];
p = bigM(A,b,c,inq,'max'); p.solve;
% min -3x1 + x2 + x3
% s.t. x1 - 2x2 + x3 <= 11
% -4x1 + x2 + 2x3 >= 3
% -2x1 + x3 = 1
% x1, x2, x3>=0.
c=[-3 1 1]';
b=[11 3 1]';
A=[1 -2 1;-4 1 2;-2 0 1];
inq=[-1 1 0];
p = bigM(A,b,c,inq,'min'); p.solve;
Qu es?
Qu hace?
Fase II. Use la solucin factible de la fase I como una solucin factible bsica
inicial para el problema original.
Paso 1. Seleccione una variable artificial cero que salga de la solucin bsica y
designe su fila como fila pivote. La variable de entrada puede ser cualquier
variable no bsica (y no artificial) con un coeficiente diferente de cero (positivo
o negativo) en la fila pivote.
Realice la iteracin simplex asociada.
Paso 2. Elimine la columna de la variable artificial (que acaba de salir) de la
tabla. Si ya se eliminaron todas las variables artificiales, contine con la fase II.
De lo contrario, regrese al paso 1.
Variables:
Codigo en matlab
function [cuadro]=simplex2fases(f,A,b)
%% fase 1
% invB=cuadro(2:end,2:m+1)
end
function [cuadro]=simplexR(cuadro,m,B,N,CB,CN)
[fase,f,c]=fases(cuadro);
if (factibilidad(cuadro,c) ==1 )
if(optimalidad(cuadro,m,c,fase) == 1)
msgbox('cuadro ptimo')
else
while (optimalidad(cuadro,m,c,fase) ~= 1)
if fase ~= 3
[fase,f,c]=fases(cuadro);
end
if fase==2
cuadro(2,:)=[];
cuadro(:,2)=[];
fase=3;
end
if optimalidad(cuadro,m,c,fase) == 1
break
end
[V1,p1]=max(cuadro(f,c+m+1:end-1));
% mximo valor columna pivote V valor P posicin
columna=cuadro(f+1:end,end)./cuadro(f+1:end,c+m+p1);
% se dividen los recursos entre la columna pivote
positivo= columna >= 0;
% slo los valores positivos participan
a=(positivo).*columna;
% guardar los valores positivos
a(a==0)=inf;
% si existen valores cero se colocan en infinito
[V2,p2]=min(a);
% valor de la variable de bloqueo (index fila pivote)
fila=cuadro(f+p2,:); % fila pivote
Epiv=cuadro(f+p2,c+m+p1); % elemento pivote
cuadro(p2+f,:)=cuadro(p2+f,:)/Epiv;
for i=1:1:(m+f)
if i~=(p2+f)
cuadro(i,:)=cuadro(i,:)-(cuadro(i,c+m+p1)*(cuadro(p2+f,:)));
end
end
cuadro % se muestra el cuadro en cada iteracin
end
end
else
msgbox('no se puede hacer nada an')
end
identidad=eye(size(cuadro,1)-1);
for i=1:1:size(identidad,2)
for j=3:1:size(cuadro,2)-1
a=identidad(:,i)==cuadro(2:end,j);
if a
for n=1:1:size(identidad,2)
if cuadro(1+n,j)== 1
break
end
end
if (j > 1+size(identidad,2))
j=j-size(identidad,2);
else
j=j+size(identidad,2);
end
function [f]=factibilidad(cuadro,c)
%% verificar factibilidad
function [d]=optimalidad(cuadro,m,c,fase)
%% verificar optimalidad
function [fase,f,c]=fases(cuadro)
if (cuadro(2,end) > 0.01)
fase=1;
else
fase=2;
end
if fase == 1
f=2;
c=2;
else
f=1;
c=1;
end
INFORME DE LABORATORIO DE OPTIMIZACION LINEAL
TEMA: METODO SIMPLEX DUAL
FECHA: 15/09/2016
Qu es?
El mtodo simplex dual se inicia con una solucin mejor que ptima y una
solucin bsica no factible. Las condiciones de optimalidad y factibilidad estn
diseadas para preservar la optimalidad de las soluciones bsicas a medida
que la solucin se mueve hacia la factibilidad.
Condicin dual de factibilidad. La variable de salida, xr, es la variable bsica
que tiene el valor ms negativo (los empates se rompen de forma arbitraria). Si
todas las variables bsicas son no negativas, el algoritmo se termina.1
Condicin dual de optimalidad. Dado que xr es la variable de salida, sea el
costo reducido de la variable no bsica xj, y arj el coeficiente de restriccin en
la fila xr y en la columna xj de la tabla. La variable de entrada es la variable no
bsica con arj , 0 que corresponde a:
Qu hace?
Para iniciar la programacin lineal ptima y no factible, se debe cumplir con
dos requisitos:
1. La funcin objetivo debe satisfacer la condicin de optimalidad del mtodo
simplex regular.
2. Todas las restricciones deben ser del tipo (<=).
Las desigualdades del tipo (>=) se convierten en (<=) al multiplicar ambos
lados de la desigualdad por 21. Si la PL incluye restricciones , la ecuacin se
puede reemplazar por dos desigualdades. La solucin inicial es no factible si al
menos uno de los lados derechos de las desigualdades es negativo.
Variables:
Codigo en Matlab
function x = dual_simplex(c,A,b,eps,x0)
% Resolver:- Max c^Tx sujeto a Ax = b, x >= 0
% Utilizando el mtodo dual simplex
% Se nos da una solucin bsica no degenerada x0
% x = dual_simplex(c,A,b,eps,x0)
% eps es una tolerancia adecuada, digamos 1e-3
[m,n] = size(A);
% Paso 0: - Inicializar B y N y tambin x_B y s_N
B = find(x0);
N = find(ones(n,1) - abs(sign(x0)));
xB = x0(B);
y = A(:,B)'\c(B);
sN = c(N)-A(:,N)'*y;
iter = 0;
while 1 == 1,
iter = iter + 1;
% Paso 1:- Comprobar optimalidad
% de lo contrario, encuentra la variable bsica que deja es x_{B(i)}
[xBmin,i] = min(xB);
if xBmin >= -eps,
fprintf('Hemos terminado \n');
fprintf('El Nmero de iteraciones es %d\n',iter);
x = zeros(n,1);
x(B) = xB;
fprintf('El valor objetivo ptimo es %f\n',c'*x);
return;
end;
% Paso 2:- Actualizar la fila de pivote
e = zeros(m,1);
e(i) = 1;
e = e(:);
v = A(:,B)'\e;
w = A(:,N)'*v;
% Paso 3:- Hallar la variable no bsica de entrada x_{N(j)}
zz = find(w < -eps);
if (isempty(zz))
error('System is infeasible\n');
end
[t,ii] = min(sN(zz)./w(zz));
j = zz(ii(1));
% Paso 4:- Resolver Bd = a_{N(j)} para d
d = A(:,B)\A(:,N(j));
% Paso 5:- Actualizar la base y la solucin bsica x_B
% Actualizar tambin s_N
temp = B(i);
B(i) = N(j);
N(j) = temp;
theta = xB(i)/w(j);
xB = xB - theta*d;
xB(i) = theta;
sN = sN -t*w;
sN(j) = -t;
end; % while
Qu es?
Qu hace?
Paso 1. Determine pi, el elemento de costo mnimo en la fila i de la matriz de
costos original, y rstelo de todos los elementos de la fila i, i 5 1, 2, 3.
Variables:
Codigo en Matlab
mcostos=AA % Matriz de costos
asignar = false(size(mcostos));
costo = 0;
mcostos(mcostos~=mcostos)=Inf;
vmat = mcostos<Inf;
vcol = any(vmat);
vfil = any(vmat,2);
nfil = sum(vfil);
ncol = sum(vcol);
n = max(nfil,ncol);
if ~n
return
end
dmat = zeros(n);
dmat(1:nfil,1:ncol) = mcostos(vfil,vcol);
% Paso 1: Restar el mnimo de fila, de cada fila.
dmat = bsxfun(@minus, dmat, min(dmat,[],2));
while 1
% Paso 3: Cubrir cada columna con un cero estrellado. Si todas
% las columnas estn marcados entonces el tablero es mximo
primeZ = false(n);
cubrircol = any(starZ);
if ~any(~cubrircol)
break
end
cubrirfil = false(n,1);
while 1
% Paso 4: Encontrar un cero sin marca y prepararlo. Si no hay ningn
cero
% marcado en la fila que contiene este cero, ir al paso 5.
% De lo contrario, cubrir esta fila y descubrir la columna que
% contiene el cero marcado. Continuar de esta manera hasta que
% no queden al descubierto los ceros a la izquierda. Guardar el
% valor ms pequeo descubierto e ir al paso 6.
zP(:) = false;
zP(~cubrirfil,~cubrircol) = ~dmat(~cubrirfil,~cubrircol);
Paso = 6;
while any(any(zP(~cubrirfil,~cubrircol)))
[uZr,uZc] = find(zP,1);
primeZ(uZr,uZc) = true;
stz = starZ(uZr,:);
if ~any(stz)
Paso = 5;
break;
end
cubrirfil(uZr) = true;
cubrircol(stz) = false;
zP(uZr,:) = false;
zP(~cubrirfil,stz) = ~dmat(~cubrirfil,stz);
end
if Paso == 6
% Paso 6: Aadir el valor mnimo sin cubrir a todos los elementos de cada
fila cubiertos, y restarlo de todos los elementos de cada columna
descubierto.
% Volver al paso 4 sin alterar ningun marcado, primos, o lneas ubiertas.
M=dmat(~cubrirfil,~cubrircol);
minval=min(min(M));
if minval==inf
return
end
dmat(cubrirfil,cubrircol)=dmat(cubrirfil,cubrircol)+minval;
dmat(~cubrirfil,~cubrircol)=M-minval;
else
break
end
end
% Paso 5: Construir una serie alternando preparados y ceros, de la
siguiente manera:
% Z0 representa el cero al descubierto encontrado en el paso 4.
% Z1 denota el cero participado en la columna de D0 (si existe).
% Z2 denota el cero imprimada en la fila de Z1 (siempre habr uno).
% Continuar hasta que la serie termina en un cero imprimado que no tiene
% favoritos cero en su columna. No destacar cada favoritos cero de la
serie,
% cada cero marcado de la serie, borrar todos los nmeros primos y
descubrir
% todas las lneas en la matriz. Volver al paso. 3
filZ1 = starZ(:,uZc);
starZ(uZr,uZc)=true;
while any(filZ1)
starZ(filZ1,uZc)=false;
uZc = primeZ(filZ1,:);
uZr = filZ1;
filZ1 = starZ(:,uZc);
starZ(uZr,uZc)=true;
end
end
Qu es?
El algoritmo de Floyd es ms general que el de Dijkstra, porque determina la
ruta ms corta entre dos nodos cualesquiera de la red. El algoritmo representa
una red de n nodos como matriz cuadrada con n renglones y n columnas. El
elementos (i,j) de la matriz expresa la distancia d_ij del nodo i al nodo j, que es
finita si i est conectado directamente con j, e infinita en caso contrario.
Qu hace?
Determina la ruta ms corta entre los nodos i y j con las matrices D_n y S_n con
las siguientes reglas:
Variables:
P = guarda la matriz
n = tamao de la matriz
R = generacin de la matriz de recorridos
N= nmero de rotaciones
aa = variable auxiliar
P = visualiza ponderaciones
R = visualiza recorridos
Codigo en Matlab