《MATLAB在水资源动态规划中的运用与改进.docx》由会员分享,可在线阅读,更多相关《MATLAB在水资源动态规划中的运用与改进.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、MATLAB在水资源动态规划中的运用与改进 【摘 要】水资源是人类赖以生存的珍贵资源,搞好水资源优化配置对实现水资源的可持续利用尤为重要。本文结合一个实例,具体介绍了用MATLAB解决水资源动态规划的思路与方法,同时与传统的逆序法对比,突出了MATLAB的优越性。并且,参照了之前学者所编写的程序,给出了自己的程序优化方案,使程序运行速度、可读性等方面得到了提高。 【关键词】动态规划;水资源优化配置;MATLAB 0.引言 动态规划是解决多阶段决策过程最优化问题的一种方法,该方法是由美国数学家贝尔曼等人在20世纪50年头提出。他们针对多阶段决策问题的特点,提出了解决这类问题的最优化原理,并胜利解
2、决了生产管理、资源安排等方面的很多实际问题,从而建立了运筹学的分支动态规划1。MATLAB是一个功能强大的用于矩阵运算的数值计算软件,是决策系统优化计算和设计的有力工具,将MATLAB运用到动态规划中可以达到计算简便的目的2。现在利用MATLAB解决动态规划问题的程序不少,但是,如何充分利用MATLAB的特点来优化程序的确一个值得深思的问题。 1.MATLAB程序设计 MATLAB有2种工作方式:一是交互式的吩咐工作方式,干脆在Command Window中输入指令求解。另一种是M脚本文件的工作方式,这种工作方式用来解决指令较多和所用指令结构较为困难的问题3。 由于动态规划问题的特别性,其涉及
3、的实际问题均须要反复的计算求解,所以在运用MATLAB语言编程中采纳最多的是循环结构。MATLAB供应了2种实现循环结构的语句for语句和while语句4。 2.应用实例 有一引水渠,其设计最大流量为6m3/s,为甲、乙、丙、丁4个地区供水。据统计,在给四个地区供水时,不同的供水量产生的效益见表1。那么,如何安排供水量可以使产生的总效益最大。 表1 供水量与增产效益的关系 2.1逆序法计算 采纳逆序法表格计算,可以得到最优安排方案有3个,分别是,最大效益为19万元。 2.2 MATLAB编程计算 2.2.1思路分析 由于本例较为简洁,所以不采纳M脚本文件的工作方式,干脆在Command Win
4、dow中输入指令即可。 Step1.输入参数 建立A、B、C、D 4个数组,分别来储存供应甲、乙、丙、丁4个地区不同水量时产生的效益。考虑到在动态规划时,某个城市的供水量可以为0,对应的效益也为0,所以A、B、C、D四个数组都应当加入一个元素0。这里采纳单下标表示法,分别用i、j、k、 l表示数组A、B、C、D中元素的下标。A=2,表示当i=3时,A中元素为2,即向A供水2m3/s。Step2.找出全部可行解,储存其安排方法和对应的效益,要找出全部的可行解,最简便的的方法是采纳循环结构枚举。 确定循环条件: 循环的限制条件应当是最大设计流量。由于最大设计流量是6 m3/s,现在随意假设一例安排
5、方法以确定循环条件。假设全部的水量全部供应了丁,即l=7,那么此时可有i=j=k=1,得i+j+k+l=10。由于无论是那种安排方法都要满意最大设计流量的限制,所以i+j+k+l=10即为循环条件。由于循环次数是已知的,所以采纳for语句循环。 储存安排方法: 建立一个二维数组E,采纳全下标的方法将安排方法存入其中,每一行为一种安排方式。 储存效益: 建立一个数组d,常用单下标的方式将全部安排方法对应的效益存入其中。 Step3.确定最大效益的值 全部方案的效益都存储在数组d中,所以传统的方法就是采纳循环结构遍历数组d中的全部元素以找到最大值。但是在编程中应当尽量避开运用循环结构。因为在循环结
6、构中,要反复进行存储变量间的“存放”操作和算符调用操作,消耗计算时间。MATLAB中为用户供应了大量的现成函数,尽可能多的采纳现成函数编程可以使所编程序更牢靠、更快速、可读性更好6。 采纳循环结构确定最大效益 程序如下: MAX=d; for n=1:length if dMAX MAX=d; end end 采纳max函数确定最大效益 由于max求的是数组X中各列的最大值,所以应当先对数组d转置。 程序如下: MAX=max 可以清晰的看到,采纳matlab中现成的max函数比用循环结构更好,不仅使程序的输入得到了简化,同时也使程序的可读性更好。 Step4.确定最大效益所对应的安排方法 数
7、组E中的横坐标和数组d中的下标是一一对应的,即数组E中横坐标为a的行产生的总效益储存在数组d中下标为a的元素中。所以可以采纳循环遍历的方法,找到数组d中全部值等于MAX的元素的下标n,在把数组E中对应的第n行输出,即可得到最优安排方法。当然,我们也可以利用matlab中现成的函数find来代替这个循环结构。 采纳循环结构确定最大值 程序如下: for n=1:length if d=MAX E-1 end end 采纳find函数确定最大值 程序如下: n=find; E-1 2.2.2完整MATLAB程序 为了突出MTALAB语言编程在动态规划中的优越性,这里分别在程序的开头和结尾加入tic
8、和ti=toc,以记录下程序运行须要的时间。但应当留意的是,ti的值受到电脑配置、matlab版本和该程序是否首次运行等因素的影响。 优化后的完整程序如下: clear all tic m=1; A=0 3 5.5 7.5 9 10 10; B=0 3 6 8 9.5 10.5 11; C=0 4 6.5 8.5 9 9 9; D=0 3.5 6 7.5 8.5 9 9; for i=1:7 for j=1:7 for k=1:7 for l=1:7 if i+j+k+l=10 d=A+B+C+D; E=i; E=j; E=k; E=l; m=m+1; end end end end end
9、MAX=max n=find; E-1 ti=toc 按回车后可以得到以下结果: MAX = 19 ans = 1 2 1 2 1 2 2 1 2 2 1 1 ti = 0.0255 运行结果表示有三个最优水资源安排方案,即、,最大效益为19万元,程序运行时间为0.0255 s。 2.2.3小结 从本例可以看出,运用MATLAB解决动态规划问题比逆序法更具有可操作性。因为实际工作中要解决的问题往往比本例困难得多,运用MATLAB编程可以避开繁琐的人工计算。同时,相比之前学者的程序而言,优化后的程序尽量回避了循环结构,充分利用了MATLAB中现成的函数,不仅使程序可读性更好,输入更简便,还大大提
10、高了程序运行速度。经笔者测试,若是采纳没有优化的方案编程,程序运行时间为0.0401s,相比之下,优化后的程序运行速度提高了36%,程序代码也由原来的36行削减到了27行。在实际工作的运用中,特殊是在困难的实例中,这种优点将得到更大的体现。 3.结语 本文结合一简洁实例,具体说明白MATLAB编程的思路与方法,并给出了程序优化方案。从本例的计算结果可以看出,运用MAYLAB编程解决动态规划问题是实际可行的,而优化后的程序在运算速度、可读性等方面都有提高,这为解决实际工作中的动态规划问题供应了新的思路。但是,如何利用MATLAB的向量化计算特点来做到更深层次的优化还值得更多的思索与探讨。 科 【
11、参考文献】 1孙赵杰.运筹学M.北京:机械工业出版社,2022. 2赵云,王希云.基于MATLAB的动态规划常用算法的实现J.太原师范高校学报,2022,7:26-30. 3刘卫国.科学计算与MATLAB语言M.北京:中国铁道出版社,2000. 4楼顺天.MATLAB程序与语言M.西安:西安电子科技高校出版社,19101. 5左兼金.水利水电施工组织管理与系统分析M.北京:水利水电出版社,11013. 6张志涌,杨祖樱.MATLAB教程R2022aM.北京:北京航空航天高校出版社,2022,129. 第9页 共9页第 9 页 共 9 页第 9 页 共 9 页第 9 页 共 9 页第 9 页 共 9 页第 9 页 共 9 页第 9 页 共 9 页第 9 页 共 9 页第 9 页 共 9 页第 9 页 共 9 页第 9 页 共 9 页