Está en la página 1de 4

% ********

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
condicin
if handles.tipo==2
signo=-1;
end

%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 ms negativo de la f. objetivo en 'y'
else
[~,y]=max(simplex(orden(1),1:orden(2)-1)); %se obtiene el
indice del ms 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',[]);
% ********
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);

%*********
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

También podría gustarte