function [istatus, iB, iN, xB]=simplex_step(A,b,c, iB,iN,xB)
% 实现一步单纯形法
%输入参数
% A - (m,n) 系数矩阵
% b - (m,1) 正的右端向量
% c - (n,1) 目标函数系数
% iB - (1,m) 当前基本向量指标数
% iN - (1, n-m) 当前非基变量指标数
% xB - (m, 1) 当前基向量的值
% 输出参数
% istatus - 标记状态
% istatus=0 正常单纯形一步结束
% istatus=32 问题无界
% istatus= -1 找到最优基本可行解
% iB - (1,m) 运行一步单纯形后的基本向量指标数
% iN - (1, n-m) 运行一步单纯形后的非基变量指标数
% xB - (m, 1) 运行一步单纯形后基向量的值
[m,n]=size(A);
B=zeros(m,m);
cB=zeros(1,m);
delta=zeros(1,n-m);
yk=zeros(m,1);
b_y=zeros(m,1);
istatus=0;
for i=1:m
B(:,i)=A(:,iB(i));
cB(i)=c(iB(i));
end;
xB=inv(B)*b;
w=cB*inv(B);
for i=1:n-m
delta(i)=w*A(:,iN(i))-c(iN(i));
end;
[max_delta,k]=max(delta);
if max_delta>0
yk=inv(B)*A(:,k);
if max(yk)>0
tmp=999999;r=1;
for i=1:m
if yk(i)>0
b_y(i)=xB(i)/yk(i);
if b_y(i)<tmp
tmp=b_y(i);
r=i;
end;
end;
end;
tmp=iN(k);
iN(k)=iB(r);
iB(r)=tmp;
else
istatus=32;
end;
else
istatus=-1;
end;
end