运筹学实验报告文档格式.docx
《运筹学实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《运筹学实验报告文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
最优解时x=[].
minf:
输出线性规划问题的最优值,当线性规划问题没有可行解时minf=[],
当线性规划问题有可行解无最优解时minf=-Inf。
flag:
线性规划问题的求解结果标志值,当线性规划问题有最优解时flag=1,
当线性规划问题有可行解无最优解时flag=0,当线性规划问题没有可行解时flag=-1.
cpt:
输出最优解对应的单纯性表,当线性规划问题没有可行解或有可
行解无最优解时cpt=[].
三、Linp函数
%此函数是使用两阶段算法求解线性规划问题
function[x,minf,flag,cpt]=linp(A,b,c);
fori=1:
p%判断b是否<
将b转换成大于0;
ifb(i)<
A(i,:
)=-1*A(i,:
);
b(i)=-1*b(i);
end
end
%返回值:
x,第一张单纯形表,基,标志参数A,c,b
%********第一张单纯形表的初始化
[m,n]=size(A);
%获得矩阵A的维数
[p,q]=size(b);
dcxb=zeros(m+2,m+n+1);
%确定第一张单纯形表的大小
dcxb(1,:
)=[-c,zeros(1,m+1)];
%¸
给表的第一行赋值
dcxb(2,:
)=[zeros(1,n),-1*ones(1,m),0];
给表的第二行赋值
dcxb([3:
m+2],:
)=[A,eye(m,m),b];
%添A和b到表中
jxl=[n+1:
n+m];
fori=3:
m+2
)=dcxb(2,:
)+dcxb(i,:
dxcb(2,:
)=dxcb1(2,:
)+dxcb1(i,:
dxcb;
%************辅助问题换基迭代**********************
dyl=find(dcxb(2,[1:
m+n])>
0);
while~isempty(dyl)
firstnum=dyl
(1);
dll=dcxb([3:
m+2],firstnum);
youduanb=dcxb([3:
m+2],m+n+1);
look=find(dll>
ifisempty(look)
dcxb(2,firstnum)=0;
else
min=Inf;
fori=3:
ifdll(i-2)>
0&
youduanb(i-2)/dll(i-2)<
min
min=youduanb(i-2)/dll(i-2);
line1=i;
dcxb(line1,:
)=dcxb(line1,:
)/dcxb(line1,firstnum);
fori=1:
m+2
ifi~=line1
dcxb(i,:
)=dcxb(i,:
)+(-1*dcxb(i,firstnum)*dcxb(line1,:
));
jxl(line1-2)=firstnum;
dyl=find(dcxb(2,[1:
dcxb
ifdcxb(2,m+n+1)>
fprintf('
g>
0,´
此问题没有可行解'
x=[];
minf=inf;
cpt=[];
flag=-1;
return
look1=find(jxl>
n);
ifdcxb(2,m+n+1)==0%等于0,判断基变量中是否有人工变量;
if~isempty(look1)%´
存在时进行处理
while~isempty(look1)
line2=look1
(1)+2;
chdy0=find(dcxb(line2,[1:
n])~=0);
ifisempty(chdy0)%´
存在人工变量都为零的那一行,去掉该行
dcxb(line2,:
)=[];
look1
(1)=[];
jxl(line2-2)=[];
else%否则进行换基迭代
secondnum=chdy0
(1);
)=dcxb(line2,:
)/dcxb(line2,secondnum);
jxl(line2-2)=secondnum;
ifi~=line2
)+(-1*dcxb(i,secondnum)*dcxb(line2,:
end;
%去掉人工变量,得到单纯性的第一张表
dcxb(:
[n+1:
n+m])=[];
%有可行解,判断z
dcxb2=dcxb;
look2=find(dcxb2(1,[1:
n])>
while~isempty(look2)
thirdnum=look2
(1);
duilie=dcxb2([2:
m+1],thirdnum);
youduanb1=dcxb2([2:
m+1],n+1);
look3=find(duilie>
ifisempty(look3)
´
此问题有可行解,但没有最优解'
x=zeros(n,1);
[mi,n1]=size(jxl);
n1
x(jxl(i))=dcxb2(i+1,n+1);
可行解为'
x
minf=-Inf
cpt=[]
flag=0
min1=Inf;
m
ifduilie(i)>
youduanb1(i)/duilie(i)<
min1%找最小比值
min1=youduanb1(i)/duilie(i);
line=i+1;
%记录行数
dcxb2(line,:
)=dcxb2(line,:
)/dcxb2(line,thirdnum);
m+1
ifi~=line
dcxb2(i,:
)=dcxb2(i,:
)+(-1*dcxb2(i,thirdnum)*dcxb2(line,:
jxl(line-1)=thirdnum;
dcxb2
look2=find(dcxb2(1,[1:
minf=dcxb2(1,n+1);
x=zeros(n,1);
[p,q]=size(jxl);
fprintf('
\最优解已找到n'
q
最优可行解为:
'
x
最优值为:
minf
cpt=dcxb2;
最优解对应的单纯形表为:
cpt
flag=1
return
例题1.
A=[1/211/2-2/3;
3/203/40];
b=[2;
3];
c=[4030];
运行结果:
>
[x,minf,flag,cpt]=linp(A,b,c)
请一次输入系数矩阵A;
输入右端向量b;
输入所求问题的向量c
dcxb=
-4.00000-3.00000000
2.00001.00001.2500-0.6667005.0000
0.50001.00000.5000-0.66671.000002.0000
1.500000.7500001.00003.0000
00-1.0000002.66678.0000
01.00000.2500-0.66670-1.33331.0000
01.00000.2500-0.66671.0000-0.33331.0000
1.000000.5000000.66672.0000
0000-1.0000-1.00000
最优解已找到!
x=
2
1
0
minf=
8
cpt=
00-1.000008.0000
01.00000.2500-0.66671.0000
1.000000.500002.0000
flag=
ans=
例题2
A=[1/211/2-2/3;
3/203/40;
3-604];
3;
0];
运行结果
Columns1through6
-4.00000-3.0000000
5.0000-5.00001.25003.333300
0.50001.00000.5000-0.66671.00000
1.500000.7500001.0000
3.0000-6.000004.000000
Columns7through8
00
05.0000
02.0000
03.0000
1.00000
0-8.0000-3.00005.333300
05.00001.2500-3.333300
02.00000.5000-1.33331.00000
03.00000.7500-2.000001.0000
1.0000-2.000001.333300
Columns7through