function [sol,flag]=simplexUnaFase(A,b,c)
%% la función [sol,flag]=simplex(A,b,c)
%% resuelve el problema
%%  Max c'x,     S.A.  A.x <= b, x>=0
%%
%% CON b>=0
%%
%% y devuelve
%% flag= 0, si no existe solución,
%%     = 1, si la solución es única,
%%     = 2, si existe un segmento de soluciones,
%%     = inf, si la solución es no acotada
%% sol = solucion, en los casos (flag=0 o =1)
%%     = NaN, en otro caso (flag=-1 o =inf).
%%

% ciclo
n = 7; m = 3; c = [-3/4 20 -1/2 6 0 0 0]; A = [1/4 -8 -1 9   1 0 0
     1/2 -12 -1/2 3 0 1 0
     0   0   1   0 0 0 1];
b = [0 ; 0 ; 1];
 J = [5 6 7];      % INDICES DE LA BASE
 JN = [1 2 3 4];   % INDICES NO EN LA BASE




%if (rank(A)==m),
 % NONDEGENERATE

 B = A(:,J);   % VECTORES BASE
 x=0*c;        % CALCULA SFB INICIAL
 if (rank(B)==m)
  x(J)=B\b;
  if (x<0),    % NO ES SFB (ERROR)
   error('error imposible obtener SFB inicial');
  else         % ¿DEGENERADA?
   if ( length(find(x==0))>n-m ),
    SFBdegenerada=true;
   else
    SFBdegenerada=false;
   end
  end
 else
  error('error en rango B');
 end


continua = true; while(continua),
 J,JN,x,
 % CONDICION DE ENTRADA EN LA BASE
 cbar = c(JN)-c(J)*(B\A(:,JN)),
 if (cbar>=0),
  % CRITERIO DE PARADA (OPTIMO ENCONTRADO)
  continua = false;
  flag = 0; xopt = x;
 else
  % CRITERIO DE ENTRADA, CBAR NEGATIVO DE MENOR J
  if (SFBdegenerada==false),
   JNneg = find(cbar<0);           % CASO NORMAL
   [value,ind]=min( cbar(JNneg) ); % SELECCIONA MINIMO
   JNselect=JN(JNneg);
   jin = JNselect(ind),            % VARIABLE QUE ENTRA x_jin
  else % SFBdegenerada==true
   JNneg = find(cbar<0);           % REGLA DE BLAND
   ind=1;                          % SELECCIONA EL PRIMERO
   JNselect=JN(JNneg);
   jin = JNselect(ind),            % VARIABLE QUE ENTRA x_jin
   if (jin==7); pause; end
  end
  % AHORA CALCULAREMOS LA DIRECCIÓN DE BÚSQUEDA (FACTIBLE)
  d = 0*c; d(jin)=1;
  d(J) = -B\A(:,jin); dJ=d(J),

  if (d(J)>=0),
   % SOLUCION NO ACOTADA
   continua = false;
   -inf,
  else
   % AHORA HAY QUE DETERMINAR EL tmax TAL QUE x+tmax*d SIGA
   % SIENDO FACTIBLE (CRITERIO DE SALIDA)
   Jneg = J(d(J)<0);
   mrt=-x(Jneg)./d(Jneg),
   [tmax,ind]=min( -x(Jneg)./d(Jneg) );
   tmax,
   % VARIABLE QUE SALE x_jsal
   jsal = Jneg(ind),

   % nuevo vértice
   x = x + tmax*d;
   J(find(J==jsal))=jin; J=sort(J);      % ORDENO POR ESTETICA!!
   JN(find(JN==jin))=jsal; JN=sort(JN);
   B = A(:,J);   % vectores base
   %pause;
  end

 end

end

%else % if (rank(A)==m)
 % Degenerate


%end if (rank(A)==m)
