单纯形法的matlab编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单纯形法的matlab实现
首先输入三个值系数矩阵A目标函数系数行向量C
列向量b
根据大M法进行扩列A,C,b.使得行数不变,列数增加M 进行的到基向量的坐标,非基变量的坐Cb,Cn,Xb,Xn,此时的值便是典式,不在需要进行进一步化简,只需求解检
验变量delta的值
迭代过程输入上一步得到A,C,b,Cb,Cn,Xb,Xn,输
出值为最优解为X,得到目标函数的最优解Z的值
迭代循化用while循环当找到解时结束循环break
或者当发现循化结果没有最优解时跳出循环,这里涉及两
个判断,两个判断量初始值都可以写在循环外,两者的值
共同决定循环的执行与否
循化最开始进行判断初始可行解是否为最最优解,若
是直接跳出循化,若上面的判断不成立,接下来进行下一
个判断,若不符合进行下面入基和出基变量的选值入基和出基变量的循化是两次循化,第一次找到k的值,第二次根据上一次的k找r的值注意因为值有约束,而且是找函数最小值,需要对这个列向量进行变换一下将小于等于0的都变成无穷大,接下来进形下一次的循化,进而找到转轴元
将A,b,delta合成一个新的矩阵,进行旋转变化,得到值后反变回相应的值,接下来需要对Xb,Xn的值进行交换这个步骤要两个循环,第一个循化对Ark的所在行进行变化,接下来进行对整个矩阵进行行变换,包括两种情况,
两次循化嵌套分别是r==1时和r~=1的时候
建立总体X的坐标列向量发生交换时出基变量找Xb,
入基变量从X中找有先后顺序先解决Xn的变化。
在解决Xb的值直接解决基变量其他为0
A=input('输入系数矩阵\n');
b=input('输入列向量b\n');
C=input('输入目标函数行向量\n');
M=5200;
global m;
global n;
global X;
[m,n]=size(A);
I=eye(m);
A=[A,I];
Xb=[];
Xn=[];
for i=1:m
C(i+n)=-M;
Xb(i)=n+i;
end
Xb=Xb';
Cb=C(1,n+1:n+m);
for i=1:n
Xn(i)=i;
end
Xn=Xn';
X=[Xn;Xb];
[m,n]=size(A);
diedai(A,C,b,Cb,Xb);
function[Z]=diedai(A,C,b,Cb,Xb)
delta=C-Cb*A;
global m;
global n;
global X;
while1
s2=0;
s1=0;
for j=1:n
if delta(j)>0
s1=1;
for i=1:m
if A(i,j)>0
s2=1;
end
end
end
end
if s1==0
disp('目标函数最优解')
Z=Cb*b;
disp(Z)
disp('基变量为');
[Xb,index]=sort(Xb);
disp(Xb)
b=b(index);
disp('基可行解为');
disp(b)
break;
end
if s2==0
disp('目标函数无界,无最优解');
break;
end
[~,k]=max(delta);
p=A(:,k);
zhuan=[];
for i=1:m
zhuan(i)=b(i)/p(i);
if zhuan(i)<=0
zhuan(i)=inf;
end
end
[~,r]=min(zhuan);
b(m+1)=0;
Z=[A;delta];
Z=[Z,b];
z=Z;
ark=A(r,k);
for j=1:n+1
Z(r,j)=Z(r,j)/ark;
end
if r==1
for i=2:m+1
for j=1:n+1
Z(i,j)=Z(i,j)-z(i,k)*Z(r,j);
end
end
else for i=[1:r-1,r+1:m+1]
for j=1:n+1
Z(i,j)=Z(i,j)-z(i,k)*Z(r,j);
end
end
end
A=Z(1:m,1:n);
delta=Z(m+1,1:n);
b=Z(1:m,n+1);
Cb(r)=C(k);
Xb(r)=X(k);
end
end。