今天花了点时间,将这个程序完成了,里面还有一些小错误,代码写的还是有点乱,明天再整理了
update:
今天又花了点时间,将程序里面的错误找出来了一些,现在这个程序应该大体是可用的,那么就这样了
min1=0.00001;(update:如果用nan的话,效果更好,将这些数忽略掉)
%b 约束条件 列向量(update 应该是行向量)
function [JI opt]=simplex2(C,CB,b,A,BL)
%purpose 验算手工单纯形
%define variables
%C 目标函数变量系数 行向量
%CB 辨识初始基 行向量
%b 约束条件 列向量
%A 约束系数矩阵 矩阵
%delta 检验数 行向量
%JBL 基变量序号
%BL 基向量位置-----------换一个结构变成一个逻辑向量
%FBL 非基变量位置
%JI 解
%opt 目标值
%MAX1 提供一个极大值
%MIN1 提供一个极小值
format rat;
max1=100000;
min1=0.00001;
delta=C-CB*A;%计算检验数
[YS GS]=size(A);%非基变量是哪些
disp('显示第一个表')
disp(C);
disp(A);
disp(delta);
temp12=length(BL);
s='基变量有X';
ss='';
for iij=1:temp12
ss=strcat(ss,[s num2str(BL(iij)) ' ']);
end
disp(ss);
%BL;%这里应该把基变量记载下来
kk=1;
for iii=1:GS %区别基变量和非基变量
if all(BL~=iii)
FBL(kk)=iii;
kk=kk+1;
end
end
while (1)%这里就该是一个无限循环,不需要跳出条件,跳出在下面的return里面实现
if max(delta)<=0
if all(CB<1.04e-14) if ?]); ? num2str(BL(iij)) ss="" iij="1:temp12" for ; s="基变量有X" CB(temp17)="0;" temp17="CB==max1;">0;%找出检验数为正的项,这一段程序有问题,得不到我想要的东西
temp1=A(:,deltaj);%找出检验数为正项对应的向量
temp2=max(temp1);%找出检验数为正项对应的向量的每一列当中最大项
if any(temp2<0)
disp('无界解');
JI=0;
opt=0;
return;
else
[deltak,k]=max(delta);
aik1=A(:,k);%储存A
%temp3=A(:,k)<0;
% temp5=A(:,k);
% A(:,k)(temp3)=max1;%将负数转化为正数,以便下一步最小值判断不要出错
% A(:,k)
%用下面这个循环实现这个功能
temp3=size(A(:,k));
for iii=1:temp3
if A(iii,k)<0
A(iii,k)=min1;
end
end
[theta,l]=min(b'./A(:,k));%l就是序号
A(:,k)=aik1;
%迭代运算
CB(l)=C(k);%换基 这边就有问题了,替换时候原来的变量没有保留
BL(l)=k;%保留下面需要的变量 下面这段有问题,是我的思路没想清晰的原因
tempbl=b(l);%保留b(l)以供下面计算
tempA=A(l,:);%保留A(l,:)供下面计算
b(l)=b(l)/A(l,k);
tempALK=A(l,k);%保留A(l,k)
A(l,:)=A(l,:)/A(l,k);
for ii=1:length(A(:,1))
if ii~=l
b(ii)=b(ii)-A(ii,k)*tempbl/tempALK;
A(ii,:)=A(ii,:)-A(ii,k)*tempA/tempALK;
end
end
end
end
input('enter键显示下一个单纯形表');
delta=C-CB*A;
disp(C);
disp(A);
disp(delta);
ss='';
for iij=1:temp12
ss=strcat(ss,[s num2str(BL(iij))]);%显示基变量
end
disp(ss);
end