function x = simpbdd(A,b,p,l,u) % syntax: x = simpbdd(A,b,p,l,u) % A two-phase simplex routine for min p'x st Ax=b, l<=x<=u. % on input A is mxn, b is mx1, p, l, u are nx1 if nargin < 3 error('require three input arguments'); end if nargin < 5 u = inf*ones(size(p)); if nargin < 4 l = zeros(size(p)); end end [m,n] = size(A); zer_tol = 1.0e-5; piv_tol = 1.0e-8; % set up Phase I problem v = zeros(n,1); lbdd = find(l>-Inf); v(lbdd) = l(lbdd); N = -lbdd'; free = setdiff(1:n,lbdd); ubdd = free(find(u(free)0 [L,U,P] = lu(A(:,free)); j = free([find(abs(diag(U)) zer_tol) error('problem is infeasible'); end; % convert to Phase II problem p = [p; zeros(m,1)]; if ~isempty(j) % could use LU decomp from rsmbdd here c = p(j)'-p(B)'*inv(A(:,B))*A(:,j); if (norm(c,inf) > zer_tol) error('problem is unbounded'); end; end; u(n+1:n+m) = zeros(m,1); [x,B,N] = rsmbdd(A,b,p,l,u,B,N); x = x(1:n); return;