动态规划例子

动态规划例子

ID:69443481

大小:201.00 KB

页数:14页

时间:2021-11-04

动态规划例子_第1页
动态规划例子_第2页
动态规划例子_第3页
动态规划例子_第4页
动态规划例子_第5页
动态规划例子_第6页
动态规划例子_第7页
动态规划例子_第8页
动态规划例子_第9页
动态规划例子_第10页
资源描述:

《动态规划例子》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、.-有8万元的投资可以投给3个过目,每个工程在不同筒子数额下〔以万元为单位〕的利润如下表投资额盈利工程012345678工程105154080909598100工程20515406070737475工程30426404550515253请安排投资方案,使总的利润最大。写出你所设的状态变量、决策变量、状态转移方程与递推关系式和手工求解的详细步骤及构造。求解:状态变量:xk表示留给工程k..n的投资额,其中n为工程总个数,k=1..n.决策变量:uk表示投给工程k的投资额.允许决策集合:状态转移方程:递推关系式:其中,表示工程k的投资额为uk时的盈利.

2、针对此题,n=3,xk最大取8手工详解过程:1.初始化k=3-.word.zl.-x3012345678f3(x3)04264045505152531.k=2-.word.zl.-x2012345678f2(x2)0526406070861001101.k=1x1012345678f1(x1)0526408090106120140最终结果:给工程1投资4万元,工程2投资4万元,工程3不投资,将获得最大利润140万元. python实现自顶向下,自底向上常用的算法设计思想主要有动态规划、贪婪法、随机化算法、回溯法等等,这些思想有重叠的局部,当面对一个

3、问题的时候,从这几个思路入手往往都能得到一个还不错的答案。本来想把动态规划单独拿出来写三篇文章呢,后来发现自己学疏才浅,实在是只能讲一些皮毛,更深入的东西尝试构思了几次,也没有什么进展,打算每种设计思想就写一篇吧。动态规划〔DynamicProgramming〕是一种非常有用的用来解决复杂问题的算法,它通过把复杂问题分解为简单的子问题的方式来获得最优解。一、自顶向下和自底向上-.word.zl.-总体上来说,我们可以把动态规划的解法分为自顶向下和自底向上两种方式。一个问题如果可以使用动态规划来解决,那么它必须具有“最优子构造〞,简单来说就是,如果该

4、问题可以被分解为多个子问题,并且这些子问题有最优解,那这个问题才可以使用动态规划。自顶向下〔Top-Down〕自顶向下的方式其实就是使用递归来求解子问题,最终解只需要调用递归式,子问题逐步往下层递归的求解。我们可以使用缓存把每次求解出来的子问题缓存起来,下次调用的时候就不必再递归计算了。举例著名的斐波那契数列的计算:#!/usr/bin/envpython#coding:utf-8deffib(number):ifnumber==0ornumber==1:return1else:returnfib(number-1)+fib(number-2)if

5、__name__=='__main__':printfib(35)-.word.zl.-有一点开发经历的人就能看出,fib(number-1)和fib(number-2)会导致我们产生大量的重复计算,以上程序执行了14s才出结果,现在,我们把每次计算出来的结果保存下来,下一次需要计算的时候直接取缓存,看看结果:#!/usr/bin/envpython#coding:utf-8cache={}deffib(number):ifnumberincache:returncache[number]ifnumber==0ornumber==1:return1

6、else:cache[number]=fib(number-1)+fib(number-2)returncache[number]if__name__=='__main__':printfib(35)消耗时间为0m0.053s效果提升非常明显。自底向上〔Bottom-Up〕自底向上是另一种求解动态规划问题的方法,它不使用递归式,而是直接使用循环来计算所有可能的结果,往上层逐渐累加子问题的解。-.word.zl.-我们在求解子问题的最优解的同时,也相当于是在求解整个问题的最优解。其中最难的局部是找到求解最终问题的递归关系式,或者说状态转移方程。这里举

7、一个01背包问题的例子:你现在想买一大堆算法书,需要很多钱,所以你打算去抢一个商店,这个商店一共有n个商品。问题在于,你只能最多拿Wkg的东西。wi和vi分别表示第i个商品的重量和价值。我们的目标就是在能拿的下的情况下,获得最大价值,求解哪些物品可以放进背包。对于每一个商品你有两个选择:拿或者不拿。首先我们要做的就是要找到“子问题〞是什么,我们发现,每次背包新装进一个物品,就可以把剩余的承重能力作为一个新的背包来求解,一直递推到承重为0的背包问题:作为一个聪明的贼,你用 m[i,w]表示偷到商品的总价值,其中i表示一共多少个商品,w表示总重量,所以

8、求解m[i,w]就是我们的子问题,那么你看到某一个商品i的时候,如何决定是不是要装进背包,有以下几点考虑:1.该物品的重量

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。