Sei sulla pagina 1di 7

INTEGRANTES:

SANTIAGO ESCARABAY
ROBERT LOARTE
JUAN DIEGO ROMERO
JORGE TENE

UNIDAD: INVESTIGACION DE OPERACIONES

CARRERA: SISTEMAS MODULO: VIII PARALELO: A

LOJA - ECUADOR
2010

1
MANUAL DE USUARIO DEL ALGORITMO DEL METODO SIMPLEX

Este algoritmo esta hecho en interfaz utilizando el software MatLab para resolver un
problema de programación lineal por el método Simplex.

Ejecutamos el script en MatLab y nos aparecerá la siguiente pantalla:

1. Ingresamos el numero de variables y el numero de restricciones y seleccionamos el


objetivo ya se maximizar o minimizar:

2. Una vez ingresados estos datos procedemos a pulsar el botón “Crear tabla”.

2
3. Llenamos la tabla inicial con los valores q se muestra en el ensayo anterior lo puedes
descargar de aquí:
http://www.scribd.com/doc/34245098/Adquisicion-de-Computadores-para-El-
Instituto-de-la-ninez-y-la-Familia

4. Presionamos en botón Resolver para visualizar la solución del problema

5. Si quieres comprobar que el algoritmo esta bien prueba con el LINGO, TORA u otro
parecido y si te sale lo mismo es que el algoritmo simplex está bien programado.

3
Código del algoritmo:

% ********
function varargout = IOSimplex(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @IOSimplex_OpeningFcn, ...
'gui_OutputFcn', @IOSimplex_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end

% ********
function IOSimplex_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output=hObject;
handles.numVar=2; %numero de variables
handles.numRest=2; %numero de restricciones
handles.tipo=1; % 1=maximizar 2=minimizar
guidata(hObject, handles);

% ********
function varargout = IOSimplex_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;

% ********
function pmTipo_Callback(hObject, eventdata, handles)
handles.tipo=get(hObject,'Value');
guidata(hObject,handles);

% ********
function pmTipo_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
set(hObject,'String',{'Maximizar','Minimizar'});

% ********
function botResolver_Callback(hObject, eventdata, handles)
simplex=get(handles.tablaDatos,'Data');
%se inserta las variables de holgura-exceso entre las columnas base y
la de las variables de solucion:
simplex=[[simplex(:,1:handles.numVar),[eye(handles.numRest);zeros(1,ha
ndles.numRest)]],simplex(:,handles.numVar+1)];
orden=size(simplex);
base=(zeros(1,handles.numVar)); %se guardan los indices de las
variables que entran en la base
signo=1; %cambia los signos de la funcion objetivo para usar una sola
condicion
if handles.tipo==2
signo=-1;
end

4
%se toma la ultima fila de simplex, se multiplica por el signo, se
pregunta
%si sus elementos son es mayores a cero, se promedian los resultados y
se comparan con 1
while mean((simplex(orden(1),:)*signo)>=0)~=1
disp(simplex);
if handles.tipo==1
[~,y]=min(simplex(orden(1),1:orden(2)-1)); %se obtiene el
indice del más negativo de la f. objetivo en 'y'
else
[~,y]=max(simplex(orden(1),1:orden(2)-1)); %se obtiene el
indice del más positivo de la f. objetivo en 'y'
end
x=1; %guarda el indice de la fila pivote;
pivote=simplex(1,orden(2))/simplex(1,y); %se busca la fila pivote,
se divide var. sol. para columna 'y'
for i=2:(orden(1)-1)
if simplex(i,y)>0
aux=simplex(i,orden(2))/simplex(i,y); %se divide var. sol.
para columna pivote 'y'
if pivote<0 || aux<pivote %se busca el valor menos
positivo
pivote=aux;
x=i;
end
end
end
base(y)=x; %se guarda el indice en donde x entra a la base
simplex(x,:)=simplex(x,:)/simplex(x,y); %se divide la fila pivote
para el elemento pivote
%se calculan los nuevos valores para las filas
for i=1:orden(1)
if i~=x %no se toma en cuenta la fila pivote
aux=(0); %se reemplaza toda la fila en simplex, no
elemento a elemento
for j=1:orden(2);
aux(j)=simplex(i,j)-simplex(i,y)*simplex(x,j);
end
simplex(i,:)=aux; %se reemplaza toda la fila en simplex
end
end
end
disp(simplex);
disp(base);
aux='Solucion optima:';
for i=1:handles.numVar
if base(i)~=0
aux=sprintf('%s\n x%d =
%.3f',aux,i,simplex(base(i),orden(2)));
else
aux=sprintf('%s\n x%d = %.3f',aux,i,0);
end
end
aux=sprintf('%s\n Z = %.3f',aux,abs(simplex(orden(1),orden(2))));
msgbox(aux,'Info');

% ********
function tablaDatos_CreateFcn(hObject,eventdata,handles)
set(hObject,'ColumnName',{});
set(hObject,'RowName',{});
set(hObject,'Data',[]);

5
% ********
function botCrear_Callback(hObject, eventdata, handles)
columnas={''};
filas={''};
for i=1:handles.numVar
columnas(i)={sprintf('x%d',i)};
end
orden=size(columnas);
columnas(orden(2)+1)={'Var sol'};
letra='a';
for i=1:handles.numRest
filas(i)={sprintf('%c',letra)};
letra=letra+1;
end
orden=size(filas);
filas(orden(2)+1)={'Z'};
%se ajusta el ancho de las celdas de acuerdo al numero de variables
ancho=get(handles.tablaDatos,'Position');
ancho=(ancho(3)-35)/length(columnas); %35 es el ancho aproximado de
la cabecera de filas
set(handles.tablaDatos,'ColumnWidth',{ancho});
%se llena la tabla
set(handles.tablaDatos,'RowName',filas);
set(handles.tablaDatos,'ColumnName',columnas);
set(handles.tablaDatos,'ColumnEditable',true);
set(handles.tablaDatos,'ColumnFormat',{'numeric'});
set(handles.tablaDatos,'Data',zeros(handles.numRest+1,handles.numVar+1
));

% ********
function pmVariables_CreateFcn(hObject, eventdata, handles)
set(hObject,'String',{2,3});

% ********
function pmVariables_Callback(hObject, eventdata, handles)
handles.numVar=get(hObject,'Value')+1;
guidata(hObject,handles);

% ********
function pmRest_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
set(hObject,'String',{2,3,4,5,6,7});

% ********
function pmVar_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
set(hObject,'String',{2,3,4,5,6,7});

%*********
function pmRest_Callback(hObject, eventdata, handles)
handles.numRest=get(hObject,'Value')+1;
guidata(hObject,handles);

6
%*********
function pmVar_Callback(hObject, eventdata, handles)
handles.numVar=get(hObject,'Value')+1;
guidata(hObject,handles);

%*********
function tablaDatos_CellEditCallback(hObject, eventdata, handles)
i=get(hObject,'Data');
if isnan(i(eventdata.Indices(1),eventdata.Indices(2)))
i(eventdata.Indices(1),eventdata.Indices(2))=0;
set(hObject,'Data',i);
end

COMPARA PERO NO COPIES….

Potrebbero piacerti anche