运筹学与最优化MATLAB编程课程报告新.docx

上传人:b****8 文档编号:10454211 上传时间:2023-02-11 格式:DOCX 页数:11 大小:92.19KB
下载 相关 举报
运筹学与最优化MATLAB编程课程报告新.docx_第1页
第1页 / 共11页
运筹学与最优化MATLAB编程课程报告新.docx_第2页
第2页 / 共11页
运筹学与最优化MATLAB编程课程报告新.docx_第3页
第3页 / 共11页
运筹学与最优化MATLAB编程课程报告新.docx_第4页
第4页 / 共11页
运筹学与最优化MATLAB编程课程报告新.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

运筹学与最优化MATLAB编程课程报告新.docx

《运筹学与最优化MATLAB编程课程报告新.docx》由会员分享,可在线阅读,更多相关《运筹学与最优化MATLAB编程课程报告新.docx(11页珍藏版)》请在冰豆网上搜索。

运筹学与最优化MATLAB编程课程报告新.docx

运筹学与最优化MATLAB编程课程报告新

基于MATLAB编程语言采用大M法求解线性规划问题

关键词:

线性规划单纯形法大M法MATLAB编程语言

1.引言

伴随着计算机技术的高速发展,最优化理论与方法取得了巨大的进步,并日益受到重视,而解决实际最优化问题的软件也得到了飞速发展,其中MATLAB这个强大的计算平台,既可以利用MATLAB优化工具箱(OptimizationToolbox)中的函数,又可以通过对算法编程实现相应的最优化计算,是目前最流行的计算软件之一。

2.摘要

本程序是采用运筹学中的求解线性规划的大M法来解现实问题,并采用MATLAB编程语言。

本文通过投资问题的实例分析了投资项目和各项目收益率确定的情况下,并结合公司实际,如何合理的分配利用,最终确定使得该公司收益最大的投资方案。

说明了线性规划在现代企业投资管理中的应用,对企业的投资管理决策提供了支持。

但是本程序只实现了线性规划的部分功能,所以有待进一步完善。

3.算法说明

3.1算法原理

单纯形法的基本思路是将可行域中某个基可行解转换到一个新的可行解,同时使得目标函数值有所改进。

而大M法则是通过将人工变量加入到原约束方程组中作为虚拟变量,并使得这些虚拟变量从基变量中被置换出来。

为此只需假定人工变量在目标函数中的系数为—M(M>0,是个充分大的数),这样,对于求极大值问题,只要在基本可行解中,还有人工变量是基变量,且取值不为0,则目标函数就不可能达到最大值;对于极小值问题而言,人工变量在目标函数中的系数取+M,这种方法称为大M法。

Ax<=b

3.2算法步骤

用大M法求解下列线性规划问题minf=cx,s.t.=

x>=0

的步骤如下:

Ax<=b

x>=0

式1

1.首先将线性规划问题minf=cx,s.t.=

转化为如下问题:

Ax+y<=b

Minf=cx+MeTy,s.t.=

x,y>=0

式2

2.确定初始基变量矩阵B,求解方程

3.令xN=0,计算f=cBxB其中xB、xN分别代表基变量和非基变量的值,cB表示基变量在目标函数中的系数;

4.求解方程wB=CB,对于所有非基变量计算判别数Zj-Cj=wPj-Cj,其中Pj为非基变量在约束系数距震中相对应的列,令Zk-Ck=max(Zj-Cj),如果Zk-Ck<=0,则停止计算,输出最优解,否则转入4;

5.求解方程Byk=Pk,若yk的每个分量均不大于0,则问题不存在最优解,否则转5;

6.令Bs’/ysk=min(Bi’/yik|yik>0),其中b’=Xb,用Pk替换PBs,得到新的变量矩阵B,再转2计算。

3.3算法的MATLAB实现

大M法求解线性规划的算法与单纯形法求解线性规划的算法相同,函数名称均为CmpSimpleMthd,函数的定义以及函数的调用均以M文件的形式存储。

3.4算法的实现流程

4.应用实例

投资问题

某公司有一批资金用于4个工程项目的投资,其投资各项目时所得的净收益(投入资金各百分比)如下表:

工程项目

A

B

C

D

收益(%)

15

10

8

12

由于某种原因,决定用于项目A的投资不大于其他各项投资之和,而用于项目B和C的投资要大于项目D的投资。

试确定使该公司收益最大的投资分配方案。

建立数学模型:

设x1、x2、x3、x4分别代表用于项目A、B、C、D的投资百分数。

maxf=0.15x1+0.1x2+0.08x3+0.12x4

s.tx1-x2-x3-x4≤0

x2+x3-x4≥0

x1+x2+x3+x4=1

xj≥0j=1,2,3,4

将其转换为采用大M求解新型规划问题的标准形式:

minz=-0.15x1-0.1x2-0.08x3-0.12x4+M(x5+x6+x7)

引入人工变量x5、x6、x7

s.tx1-x2-x3-x4+x5≤0

-x2-x3+x4+x6≤0

x1+x2+x3+x4+x7=1

xj≥0j=1,2,3,4,5,6,7

函数调用程序为:

A=[1-1-1-1100;0-1-11010;1111001];

b=[0;0;1];

c=[-0.15-0.1-0.08-0.12100010001000];

[x,minf]=CmpSimpleMthd(A,c,b,[567])

结果为:

x=0.50000.250000.2500000

minf=-0.1300

即4个项目的投资百分数分别为50%,25%,0,25%时可使该公司获得最大的收益,其最大收益可到达13%。

过程正常收敛。

5.目的及意义

(1)熟练掌握matlab程序的基本操作

(2)为数学建模打好基础,提高自己的编程能力。

(3)学会解决实际问题中的最优化问题,为企业管理决策提供支持。

(4)通过大M法用简单的编程求解现实中的问题。

6.程序结果分析

6.1本程序设计优点

采用大M法求解线性规划的优点是以MATLAB7.0为编程平台,程序设计比较简单,基本上是原来的单纯形法,只需将目标函数稍加处理(即引入M>0,将目标函数改写为如式2),就可按原单纯形法的步骤进行迭代。

6.2本程序设计缺点

本程序设计时只涉及了求极小值的方法,所以在求解极大值问题时需要先将模型转化为求最小值的模型;而且在用大M法求解线性规划时也需先把一般形式化为标准形式;在计算时要给M赋予一个适当的定值(特别是在编程时),但究竟应该取多大,事先无法估计,过大的话容易引起计算误差。

6.3算法需改进之处

应该设计一种既能求解极大值又能求解极小值的算法,而不需来回转换,本程序的设计也未考虑当原问题无界时这种情况,所以有待进一步完善。

6.4算法对比效果

算法改进后,会使得本程序设计的功能更强大,更完善,大大简化繁琐的转换过程。

7.总结与心得体会

通过对本次课程报告的编写,大大加强了自己的实践动手能力与MATLAB编程能力,实现了理论与实际的紧密结合,同时也提高了自己解决实际问题的能力,为以后的编程打下了基础。

由于接触MATLAB编程语言的时间还比较短,所以对它掌握的还不是特别的熟练,以至于在算法的编程实现过程中会出现种种问题。

本次最大的收获就是学会了MATLAB的基本操作及基本编程,遇到问题首先要自己认真思考,提高自己的思维创新能力,需要更加的努力才能真正的把MATLAB学好,学会理论联系实际。

8.参考文献

[1]运筹学的原理和方法(第二版)/邓成梁主编.—武汉:

华中科技大学出版社,2002年1月

[2]MATLAB语言高级编程/张德丰等编著,—北京:

机械工业出版社,2010年1月

[3]精通MATLAB最优化计算/龚纯,王正林编著,—北京:

电子工业出版社,2009年4月

9.附件(程序代码)

function[x,minf]=CmpSimpleMthd(A,c,b,basevector)

%约束矩阵:

A%

%目标函数系数向量:

c%

%约束右端向量:

b%

%初始基向量:

basevector%

%目标函数取最小值时的自变量值:

x%

%目标函数的最小值:

minf%

sz=size(A);

nVia=sz

(2);

n=sz

(1);

xx=1:

nVia;

nobase=zeros(1,1);

m=1;

ifc>=0

vr=find(c~=0,1,'last');

rgv=inv(A(:

(nVia-n+1):

nVia))*b;

ifrgv>=0

x=zeros(1,vr);

minf=0;

else

disp('thebestanswerdonotexist!

');

x=nan;

minf=nan;

return;

end

end

fori=1:

nVia

if(isempty(find(basevector==xx(i),1)))%获取非基变量下标

nobase(m)=i;

m=m+1;

else

end

end

bCon=1;

M=0;

whilebCon

nB=A(:

nobase);%非基变量矩阵

ncb=c(nobase);%非基变量系数

B=A(:

basevector);%基变量矩阵

cb=c(basevector);%基变量系数

xb=inv(B)*b;

f=cb*xb;

w=cb*inv(B);

fori=1:

length(nobase)%判别

sigma(i)=w*nB(:

i)-ncb(i);

end

[maxs,ind]=max(sigma);%ind为进基变量下标

ifmaxs<=0

minf=cb*xb;

vr=find(c~=0,1,'last');

fori=1:

vr

ele=find(basevector==i,1);

if(isempty(ele))

x(i)=0;

else

x(i)=xb(ele);

end

end

bCon=0;

else

y=inv(B)*A(:

nobase(ind));

ify<=0%不存在最优解

disp('thebestanswerdonotexist!

');

x=nan;

minf=nan;

return;

else%寻找出基变量

minb=inf;

chagB=0;%chaB为出基变量下标

forj=1:

length(y)

ify(j)>0

bz=xb(j)/y(j);

ifbz

minb=bz;

chagB=j;

end

end

end

tmp=basevector(chagB);%更新基矩阵和非基矩阵

basevector(chagB)=nobase(ind);

nobase(ind)=tmp;

end

end

M=M+1;

if(M==10000000)%迭代步数限制

disp('cannotfindthebestanswer!

');

x=nan;

minf=nan;

return;

end

end

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1