主题:求关于单纯形方面的程序!!
smqhld001
[专家分:0] 发布于 2007-09-09 14:19:00
求关于单纯形方面的程序!!小弟跪谢[em2]
回复列表 (共2个回复)
沙发
Guassfans [专家分:4090] 发布于 2007-09-11 22:46:00
以前用VB做过一个:
[url=http://blog.programfan.com/article.asp?id=25296]HERE[/url]
板凳
mikle [专家分:390] 发布于 2007-09-14 09:44:00
[转]
这是这几天来看线性规划的成果,程序比较粗糙,欢迎大家给出意见。
另外:此程序是我的原创,欢迎大家复制拷贝,无任何版权问题,但请在使用后说明出处,谢谢。
例:max 2*x1+3*x2
s.t. x1+2*x2<=8
4*x1<=16
4*x2<=12
x1,x2>=0
加入松驰变量,化为标准型,得到
A=[1 2 1 0 0 8;4 0 0 1 0 16;0 4 0 0 1 12;2 3 0 0 0 0];
N=[3 4 5];
然后执行 [sol,val,kk]=ssimplex(A,N)就可以了。
注:基变量对应的基矩阵一定是单位阵。(这一局限将在后面的升级是改善)
% 求解标准型线性规划:max c*x;s.t. A*x=b;x>=0
% 本函数中的A是单纯初始表,包括:最后一行是初始的检验数,最后一列是资源向量b
% N是初始的基变量的下标
%输出变量sol是最优解
%输出变量val是最优值,kk是迭代次数
function [sol,val,kk]=ssimplex(A,N)
[mA,nA]=size(A);
kk=0; % 迭代次数
flag=1;
while flag
kk=kk+1;
if A(mA,:)<=0 % 已找到最优解
flag=0;
sol=zeros(1,nA-1);
for i=1:mA-1
sol(N(i))=A(i,nA);
end
val=-A(mA,nA);
else
for i=1:nA-1
if A(mA,i)>0&A(1:mA-1,i)<=0 % 问题有无界解
disp('have infinite solution!');
flag=0;
break;
end
end
if flag % 还不是最优表,进行转轴运算
temp=0;
for i=1:nA-1
if A(mA,i)>temp
temp=A(mA,i);
inb=i; % 进基变量的下标
end
end
sita=zeros(1,mA-1);
for i=1:mA-1
if A(i,inb)>0
sita(i)=A(i,nA)/A(i,inb);
end
end
temp=inf;
for i=1:mA-1
if sita(i)>0&sita(i)<temp
temp=sita(i);
outb=i; % 出基变量下标
end
end
% 以下更新N
for i=1:mA-1
if i==outb
N(i)=inb;
end
end
% 以下进行转轴运算
A(outb,:)=A(outb,:)/A(outb,inb);
for i=1:mA
if i~=outb
A(i,:)=A(i,:)-A(outb,:)*A(i,inb);
end
end
end
end
end
我来回复