ACM论文张辰轩动态规划

上传人:新** 文档编号:470024399 上传时间:2023-05-26 格式:DOC 页数:9 大小:175KB
返回 下载 相关 举报
ACM论文张辰轩动态规划_第1页
第1页 / 共9页
ACM论文张辰轩动态规划_第2页
第2页 / 共9页
ACM论文张辰轩动态规划_第3页
第3页 / 共9页
ACM论文张辰轩动态规划_第4页
第4页 / 共9页
ACM论文张辰轩动态规划_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《ACM论文张辰轩动态规划》由会员分享,可在线阅读,更多相关《ACM论文张辰轩动态规划(9页珍藏版)》请在金锄头文库上搜索。

1、 动态规划【目录】一。引言二。动态规划的基本思想三。动态规划算法的基本步骤四。动态规划的适用条件五。动态规划的实例分析六。动态规划的技巧阶段的划分和状态的表示七。动态规划实现中的问题八。动态规划与其他算法的比较九。动态规划的理论模型一。引言动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法动态规划。1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。动态规划问

2、世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。二。动态规划的基本思想一般来说,只要问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解(即满足最优子化原理),则可以考虑用动态规划解决。动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为

3、更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。由此可知,动态规划法与分治法和贪心法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。其中贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。因此贪心法自顶向下,一步一步地作出贪心选择;而分治法中的各个子问题是独立的 (即不包含公共的子子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。但不足的是,如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解;如果各子问题是不独立的,则分治法

4、要做许多不必要的工作,重复地解公共的子问题。解决上述问题的办法是利用动态规划。该方法主要应用于最优化问题,这类问题会有多种可能的解,每个解都有一个值,而动态规划找出其中最优(最大或最小)值的解。若存在若干个取最优值的解的话,它只取其中的一个。在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问题不独立,(亦即各子问题可包含公共的子子问题)也允许其通过自身子问题的解作出选择,该方法对每一个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。因此,动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复

5、。动态规划法的关键就在于,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。三。动态规划算法的基本步骤设计一个标准的动态规划算法,通常可按以下几个步骤进行:1。划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。注意这若干个阶段一定要是有序的或者是可排序的(即无后向性),否则问题就无法用动态规划求解。2。选择状态:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。确定决策并写出状态转移方程:之所以把这两步放在一起,是因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导

6、出本阶段的状态。所以,如果我们确定了决策,状态转移方程也就写出来了。但事实上,我们常常是反过来做,根据相邻两段的各状态之间的关系来确定决策。3。写出规划方程(包括边界条件):动态规划的基本方程是规划方程的通用形式化表达式。一般说来,只要阶段、状态、决策和状态转移确定了,这一步还是比较简单的。动态规划的主要难点在于理论上的设计,一旦设计完成,实现部分就会非常简单。根据动态规划的基本方程可以直接递归计算最优值,但是一般将其改为递推计算,实现的大体上的框架如下:标准动态规划的基本框架对fn+1(xn+1)初始化; 处理边界条件for k n downto 1 do for 每一个xkXk do fo

7、r 每一个ukUk(xk) do fk(xk) 一个极值 或 xk+1 Tk(xk,uk) 状态转移方程 t (fk+1(xk+1), vk(xk,uk) 基本方程(9)式 if t比fk(xk)更优 then fk(xk) t 计算fk(xk)的最优值t 一个极值 或for 每一个x1X1 do if f1(x1)比t更优 then t f1(x1) 按照10式求出最优指标输出t;但是,实际应用当中经常不显式地按照上面步骤设计动态规划,而是按以下几个步骤进行:1。分析最优解的性质,并刻划其结构特征。2。递归地定义最优值。3。以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。4。

8、根据计算最优值时得到的信息,构造一个最优解。步骤(1)-(3)是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4)可以省略,若需要求出问题的一个最优解,则必须执行步骤(4)。此时,在步骤(3)中计算最优值时,通常需记录更多的信息,以便在步骤(4)中,根据所记录的信息,快速地构造出一个最优解。四。动态规划的适用条件任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效性。1.最优化原理(最优子结构性质)最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言

9、,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。例如图2中,若路线I和J是A到C的最优路径,则根据最优化原理,路线J必是从B到C的最优路线。这可用反证法证明:假设有另一路径J是B到C的最优路径,则A到C的路线取I和J比I和J更优,矛盾。从而证明J必是B到C的最优路径。最优化原理是动态规划的基础,任何问题,如果失去了最优化原理的支持,就不可能用动态规划方法计算。动态规划的最优化理在其指标函数的可分离性和单调性中得到体现。根据最优化原理导出的动态规划基本方程是解决一切动态规划问题的基本方法。2.无后向性将各阶段按照一定的次

10、序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。有些问题乍一看好像有后向性,但如果按照某种合理的方式重新划分阶段,就可以发现其本质上是无后向性的,所以关键是阶段的合理划分,这一点将在动态规划的技巧中详细阐述。3.子问题的重叠性动态规划可以将原来具有指数级复杂度的搜索算法改进成具有多项式时间的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大

11、于其它的算法。以Bitonic旅行路线问题为例,这个问题也可以用搜索算法来解决。动态规划的时间复杂度为O(n2),搜索算法的时间复杂度为O(n!) ,但从空间复杂度来看,动态规划算法为O(n2),而搜索算法为O(n),搜索算法反而优于动态规划算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间。设原问题的规模为n,容易看出,当子问题树中的子问题总数是n的超多项式函数,而不同的子问题数只是n的多项式函数时,动态规划法显得特别有意义,此时动态规划法具有线性时间复杂性。所以,能够用动态规划解决的问题还有一个显著特征:子问题的重叠性。这个性质并

12、不是动态规划适用的必要条件,但是如果该性质无法满足,动态规划算法同其他算法相比就不具备优势。五。动态规划的实例分析魔法课问题哈里波特终于离开了可怕的舅舅家,来到了Hogwarts的魔法学校学习魔法。魔法的世界是多么的神奇,小哈利对一切都充满了好奇。他想尽可能多的学习魔法。现在的问题是有些魔法课的时间有冲突,哈利无法在一天内上所有的魔法课。所以需要你写一个程序来帮助哈里波特制定一个学习计划,来安排第一天的学习,使得他能尽可能地上更多的魔法课。注意,上课的时间是不能改变的。而且上课的时候不能迟到也不能早退,否则魔法老师会对哈利产生不满。可以假设从一个教室到另一个教室的时间短得忽略不计。另外,在Ho

13、gwarts的魔法世界里,是不使用24小时制的计时方法的,它只是简单的使用一个整数来表示当时的时间。输入:每个测试数据开头是一个整数n(1=n=1000),表示魔法课的总数。接下来n行,每行包括两个正整数s、t,分别表示该魔法课的上课时间和下课时间。其中st。输出:对于每个测试数据,在单独一行内输出哈利所能上的最多魔法课数。样例:输入:31152191517输出:2代码:1. #include2. 3. usingnamespacestd;4. #defineN10105. 6. intlessonN2;/记录开课时间与下课时间7. intnumN;/记录上第N堂课的话可上的最大课程8. 9. intmain()10. 11. intn;12. inti,j;13. cinn;14. for(i=1;ilessoni0lessoni1;/输入开课时间与课程结束时间16. memset(num,0,sizeof(num);17. numn=1;/第一阶段,首先上最后一堂课的话,最大上课数为118. intmax1;19. for(i=n-1;i=1;i-)/从后往前遍历20. 21. max1=0;22. for(j=i+1;j=n;j+)/遍历从i+1堂课到最后一场课(动态规划,求解局部最优)23.

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号