1、运筹学与最优化MATLAB编程课程报告新基于MATLAB编程语言采用大M法求解线性规划问题关键词:线性规划 单纯形法 大M法 MATLAB编程语言1.引言伴随着计算机技术的高速发展,最优化理论与方法取得了巨大的进步,并日益受到重视,而解决实际最优化问题的软件也得到了飞速发展,其中MATLAB这个强大的计算平台,既可以利用MATLAB优化工具箱(OptimizationToolbox)中的函数,又可以通过对算法编程实现相应的最优化计算,是目前最流行的计算软件之一。2.摘要本程序是采用运筹学中的求解线性规划的大M法来解现实问题,并采用MATLAB编程语言。本文通过投资问题的实例分析了投资项目和各项
2、目收益率确定的情况下,并结合公司实际,如何合理的分配利用,最终确定使得该公司收益最大的投资方案。说明了线性规划在现代企业投资管理中的应用,对企业的投资管理决策提供了支持。但是本程序只实现了线性规划的部分功能,所以有待进一步完善。3.算法说明3.1算法原理单纯形法的基本思路是将可行域中某个基可行解转换到一个新的可行解,同时使得目标函数值有所改进。而大M法则是通过将人工变量加入到原约束方程组中作为虚拟变量,并使得这些虚拟变量从基变量中被置换出来。为此只需假定人工变量在目标函数中的系数为M(M0,是个充分大的数),这样,对于求极大值问题,只要在基本可行解中,还有人工变量是基变量,且取值不为0,则目标
3、函数就不可能达到最大值;对于极小值问题而言,人工变量在目标函数中的系数取+M,这种方法称为大M法。Ax=0的步骤如下:Ax=0式 11.首先将线性规划问题minf=cx,s.t.=转化为如下问题:Ax+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-Ck0),其中b=Xb,用Pk替换PBs,得到新的变量矩阵B,再转2
4、计算。3.3算法的MATLAB实现大M法求解线性规划的算法与单纯形法求解线性规划的算法相同,函数名称均为CmpSimpleMthd,函数的定义以及函数的调用均以M文件的形式存储。3.4 算法的实现流程4应用实例投资问题某公司有一批资金用于4个工程项目的投资,其投资各项目时所得的净收益(投入资金各百分比)如下表: 工程项目ABCD收益(%)1510812由于某种原因,决定用于项目A的投资不大于其他各项投资之和,而用于项目B和C的投资要大于项目D的投资。试确定使该公司收益最大的投资分配方案。 建立数学模型: 设x1、 x2 、x3 、x4分别代表用于项目A、B、C、D的投资百分数。 max f=0
5、.15x1+0.1x2+0.08 x3+0.12 x4 s.t x1-x2- x3- x40 x2+ x3- x40 x1+x2+x3+ x4=1 xj0 j=1,2,3,4将其转换为采用大M求解新型规划问题的标准形式: min z=-0.15x1-0.1x2-0.08 x3-0.12 x4+M(x5+x6+x7) 引入人工变量x5、x6、x7s.t x1-x2- x3- x4+x50 -x2- x3+ x4+x60 x1+x2+x3+ x4+x7=1 xj0 j=1,2,3,4,5,6,7函数调用程序为:A=1 -1 -1 -1 1 0 0;0 -1 -1 1 0 1 0;1 1 1 1 0
6、 0 1;b=0;0;1;c=-0.15 -0.1 -0.08 -0.12 1000 1000 1000;x,minf=CmpSimpleMthd(A,c,b,5 6 7)结果为:x =0.5000 0.2500 0 0.2500 0 0 0minf = -0.1300即4个项目的投资百分数分别为50%,25%,0, 25%时可使该公司获得最大的收益,其最大收益可到达13%。过程正常收敛。5.目的及意义(1)熟练掌握matlab程序的基本操作(2)为数学建模打好基础,提高自己的编程能力。(3)学会解决实际问题中的最优化问题,为企业管理决策提供支持。(4)通过大M法用简单的编程求解现实中的问题。
7、6程序结果分析6.1 本程序设计优点采用大M法求解线性规划的优点是以MATLAB 7.0为编程平台,程序设计比较简单,基本上是原来的单纯形法,只需将目标函数稍加处理(即引入M0,将目标函数改写为如式 2),就可按原单纯形法的步骤进行迭代。6.2 本程序设计缺点本程序设计时只涉及了求极小值的方法,所以在求解极大值问题时需要先将模型转化为求最小值的模型;而且在用大M法求解线性规划时也需先把一般形式化为标准形式;在计算时要给M赋予一个适当的定值(特别是在编程时),但究竟应该取多大,事先无法估计,过大的话容易引起计算误差。6.3 算法需改进之处应该设计一种既能求解极大值又能求解极小值的算法,而不需来回
8、转换,本程序的设计也未考虑当原问题无界时这种情况,所以有待进一步完善。6.4 算法对比效果算法改进后,会使得本程序设计的功能更强大,更完善,大大简化繁琐的转换过程。7.总结与心得体会通过对本次课程报告的编写,大大加强了自己的实践动手能力与MATLAB编程能力,实现了理论与实际的紧密结合,同时也提高了自己解决实际问题的能力,为以后的编程打下了基础。由于接触MATLAB编程语言的时间还比较短,所以对它掌握的还不是特别的熟练,以至于在算法的编程实现过程中会出现种种问题。本次最大的收获就是学会了MATLAB的基本操作及基本编程,遇到问题首先要自己认真思考,提高自己的思维创新能力,需要更加的努力才能真正
9、的把MATLAB学好,学会理论联系实际。8.参考文献1运筹学的原理和方法(第二版)/邓成梁 主编.武汉:华中科技大学出版社,2002年1月2MATLAB语言高级编程/张德丰等编著,北京:机械工业出版社,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=s
10、z(2);n=sz(1);xx=1:nVia;nobase=zeros(1,1);m=1;if c=0 vr=find(c=0,1,last); rgv=inv(A(:,(nVia-n+1):nVia)*b; if rgv=0 x=zeros(1,vr); minf=0; else disp(the best answer do not exist!); x=nan; minf=nan; return; endend for i=1:nVia if(isempty(find(basevector=xx(i),1)%获取非基变量下标 nobase(m)=i; m=m+1; else endend
11、bCon=1;M=0;while bCon nB=A(:,nobase);%非基变量矩阵 ncb=c(nobase);%非基变量系数 B=A(:,basevector);%基变量矩阵 cb=c(basevector);%基变量系数 xb=inv(B)*b; f=cb*xb; w=cb*inv(B); for i=1:length(nobase)%判别 sigma(i)=w*nB(:,i)-ncb(i); end maxs,ind=max(sigma);%ind为进基变量下标 if maxs=0 minf=cb*xb; vr=find(c=0,1,last); for i=1:vr ele=fi
12、nd(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); if y0 bz=xb(j)/y(j); if bzminb 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(can not find the best answer!); x=nan; minf=nan; return; endend
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1