动态规划讲义Word格式文档下载.docx
- 文档编号:14178339
- 上传时间:2022-10-19
- 格式:DOCX
- 页数:11
- 大小:86.56KB
动态规划讲义Word格式文档下载.docx
《动态规划讲义Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《动态规划讲义Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
能采用动态规划求解的问题都需要满足一定的条件:
(1)问题中的状态必须满足最优化原理;
(2)问题中的状态必须满足无后效性。
所谓的无后效性是指:
“下一时刻的状态只与当前状态有关,而和当前状态之前的状态无关,当前的状态是对以往决策的总结”。
问题求解模式
动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。
这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。
如图所示。
动态规划的设计都有着一定的模式,一般要经历以下几个步骤:
初始状态→│决策1│→│决策2│→…→│决策n│→结束状态
(1)划分阶段:
按照问题的时间或空间特征,把问题分为若干个阶段。
在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。
(2)确定状态和状态变量:
将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。
当然,状态的选择要满足无后效性。
(3)确定决策并写出状态转移方程:
因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。
所以如果确定了决策,状态转移方程也就可写出。
但事实上常常是反过来做,根据相邻两段各状态之间的关系来确定决策。
(4)寻找边界条件:
给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。
算法实现
动态规划的主要难点在于理论上的设计,也就是上面4个步骤的确定,一旦设计完成,实现部分就会非常简单。
使用动态规划求解问题,最重要的就是确定动态规划三要素:
问题的阶段,每个阶段的状态以及从前一个阶段转化到后一个阶段之间的递推关系。
递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。
动态规划算法将问题的解决方案视为一系列决策的结果,与贪婪算法不同的是,在贪婪算法中,每采用一次贪婪准则,便做出一个不可撤回的决策;
而在动态规划算法中,还要考察每个最优决策序列中是否包含一个最优决策子序列,即问题是否具有最优子结构性质。
动态规划算法的有效性依赖于待求解问题本身具有的两个重要性质:
最优子结构性质和子问题重叠性质。
(1)最优子结构性质。
如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。
最优子结构性质为动态规划算法解决问题提供了重要线索。
(2)子问题重叠性质。
子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。
动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的解题效率。
当我们已经确定待解决的问题需要用动态规划算法求解时,通常可以按照以下步骤设计动态规划算法:
(1)分析问题的最优解,找出最优解的性质,并刻画其结构特征;
(2)递归地定义最优值;
(3)采用自底向上的方式计算问题的最优值;
(4)根据计算最优值时得到的信息,构造最优解。
1~3步是动态规划算法解决问题的基本步骤,在只需要计算最优值的问题中,完成这三个基本步骤就可以了。
如果问题需要构造最优解,还要执行第4步;
此时,在第3步通常需要记录更多的信息,以便在步骤4中,有足够的信息快速地构造出最优解。
6.1〖案例1〗拦截导弹
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。
但是这种导弹拦截系统有一个缺陷:
虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。
由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入数据为导弹依次飞来的高度,所有高度值均为不大于30000的正整数。
输出只有一行是这套系统最多能拦截的导弹数。
38920715530029917015865
6
因为只有一套导弹拦截系统,并且这套系统除了第一发炮弹能到达任意高度外,以后的每一发炮弹都不能高于前一发炮弹的高度;
所以,被拦截的导弹应该按飞来的高度组成一个非递增序列。
题目要求我们计算这套系统最多能拦截的导弹数,并依次输出被拦截导弹的高度,实际上就是要求我们在导弹依次飞来的高度序列中寻找一个最长非递增子序列。
设X={x1,x2,…,xn}为依次飞来的导弹序列,Y={y1,y2,…,yk}为问题的最优解(即X的最长非递增子序列),s为问题的状态(表示导弹拦截系统当前发送炮弹能够到达的最大高度,初值为s=∞——第一发炮弹能够到达任意的高度)。
如果y1=x1,即飞来的第一枚导弹被成功拦截。
那么,根据题意“每一发炮弹都不能高于前一发的高度”,问题的状态将由s=∞变成s≤x1(x1为第一枚导弹的高度);
在当前状态下,序列Y1={y2,…,yk}也应该是序列X1={x2,…,xn}的最长非递增子序列(大家用反证法很容易证明)。
也就是说,在当前状态s≤x1下,问题的最优解Y所包含的子问题(序列X1)的解(序列Y1)也是最优的。
这就是拦截导弹问题的最优子结构性质。
设D(i)为第i枚导弹被拦截之后,这套系统最多还能拦截的导弹数(包含被拦截的第i枚)。
我们可以设想,当系统拦截了第k枚导弹xk,而xk又是序列X={x1,x2,…,xn}中的最小值,即第k枚导弹为所有飞来的导弹中高度最低的,则有D(k)=1;
当系统拦截了最后一枚导弹xn,那么,系统最多也只能拦截这一枚导弹了,即D(n)=1;
其它情况下,也应该有D(i)≥1。
根据以上分析,可归纳出问题的动态规划递归方程为:
假设系统最多能拦截的导弹数为dmax(即问题的最优值),则
dmax
(i为被系统拦截的第一枚导弹的顺序号)
所以,要计算问题的最优值dmax,需要分别计算出D
(1)、D
(2)、……D(n)的值,然后将它们进行比较,找出其中的最大值。
根据上面分析出来的递归方程,我们完全可以设计一个递归函数,采用自顶向下的方法计算D(i)的值。
然后,对i从1到n分别调用这个递归函数,就可以计算出D
(1)、D
(2)、……D(n)。
但这样将会有大量的子问题被重复计算。
比如在调用递归函数计算D
(1)的时候,可能需要先计算D(5)的值;
之后在分别调用递归函数计算D
(2)、D(3)、D(4)的时候,都有可能需要先计算D(5)的值。
如此一来,在整个问题的求解过程中,D(5)可能会被重复计算很多次,从而造成了冗余,降低了程序的效率。
其实,通过以上分析,我们已经知道:
D(n)=1。
如果将n作为阶段对问题进行划分,根据问题的动态规划递归方程,我们可以采用自底向上的方法依次计算出D(n-1)、D(n-2)、……D
(1)的值。
这样,每个D(i)的值只计算一次,并在计算的同时把计算结果保存下来,从而避免了有些子问题被重复计算的情况发生,提高了程序的效率。
intmain(){
inth[2000],d[2000],count,c;
//h表示高度值,d表示最优值,c是能拦截得最多导弹数
count=0;
while(scanf("
%d"
h+count++)!
=EOF);
//输入高度
d[0]=h[0];
c=1;
for(i=1;
i<
count;
i++){//用动态规划计算所有最优值
for(j=c-1;
j>
=0;
j--)
if(h[i]<
=d[j])
break;
d[j+1]=h[i];
if(j==c-1)c++;
}
printf("
%d\n"
c);
}
6.2〖案例2〗公共子序列
子序列是给定序列的部分(或者没有)元素组成。
给定的序列X=<
x1,x2,...,xm>
,另一个序列Z=<
z1,z2,...,zk>
是X的子序列,如果存在严格递增X的序号序列<
i1,i2,...,ik>
,对于所有的j=1,2,...,k,
。
例如Z=<
a,b,f,c>
是X=<
a,b,c,f,b,c>
的子序列,对应在X中的序号为<
1,2,4,6>
给定两个序列X和Y,找到X和Y的最长的公共子序列的长度。
每组测试数据包含两个字符串表示给定的序列,中间用空格隔开。
对于每个测试数据,输出最长的公共子序列的长度。
abcfbcabfcab
programmingcontest
abcdmnp
4
2
动态规划求解
令X0=Ø
Xi={x1,x2,…,xi},1≤i≤m
Xm=X
Y0=Ø
Yi={y1,y2,…,yi},1≤i≤n
Yn=Y
LCS(Xi,Yj)表示(Xi,Yj)的最长公共子序列长度,则有:
一般有:
含义:
①若xm=yn=z(或xi=yj=z)则xm,yn必包含在LCS(Xm,Yn)中。
则,
LCS(Xm,Yn)=LCS(Xm-1,Yn-1)∪{z}
②若xm≠yn,则xm,yn中至少有一个不会包含在LCS(Xm,Yn)中,则,
LCS(Xm,Yn)等于LCS(Xm-1,Yn)和LCS(Xm,Yn-1)中长的一个
③若i=0或j=0,则其中一个(Xm或Yn)为空集合,此时LCS(Xm,Yn)=Ø
递推过程:
为求LCS(Xi,Yj),需要首先得到LCS(Xi-1,Yj-1)或LCS(Xi-1,Yj)和LCS(Xi,Yj-1)的值。
故递推过程如下:
从i=0或j=0算起,对所有i≤m的每个值,求j=1…n的所有可能的LCS(Xi,Yj)
例:
令X={a,b,c,f,b,c},Y={a,b,f,c,a,b}
LCS
Y
a
b
f
c
j
i
1
3
5
X
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 规划 讲义
![提示](https://static.bdocx.com/images/bang_tan.gif)