www45nnncom 动态规划算法 介绍与分析
www45nnncom 动态规划算法 介绍与分析
一、基本概念
决策过程遵循动态规划原则,即每一步的选择都基于当前所处的状态,并随之触发状态的转变。随着决策的连续进行,状态不断演变,从而形成一系列决策序列。正因如此,这一涉及多个阶段、以最优化为目标的问题解决方法,被称作动态规划。
二、基本思想与策略
基本思想与分治法相仿,它同样涉及将待解问题拆分成若干个子问题或阶段,然后依次对这些子阶段进行求解。在前一子问题的解决过程中,其结果为后续子问题的求解提供了关键信息。在解决每个子问题时,我们会列出所有可能的局部解,并从中挑选出那些有潜力达到最优解的局部解www45nnncom 动态规划算法 介绍与分析,其余的则予以舍弃。通过这种方式,我们逐步解决各个子问题,直至最后一个子问题的解决即为原始问题的答案。
动态规划所处理的问题往往存在重叠的子问题,为了降低重复计算的成本,我们会对每个子问题仅求解一次,并将它们在各个阶段的不同状态记录在一个二维数组之中。
与分治法存在显著不同之处在于,那些适宜采用动态规划方法解决的问题,在经过分解后,其产生的子问题通常并非彼此独立;换言之,后续子阶段的求解往往依赖于前一个子阶段的解决方案,以此为基础进行深入探究。
三、适用的情况
通常,适用于动态规划方法解决的问题需具备以下三个特征:首先,它应遵循最优化原则,即问题的最优解由其子问题的最优解构成,这意味着问题具备最优子结构;其次,它应具备无后效性,即一旦某个阶段的状态确定,后续的决策将不再受该状态的影响,换言之www45nnncom 动态规划算法 介绍与分析,后续的过程不会对之前的状态产生影响,而仅与当前状态相关联。存在相互关联的子问题:这些子问题并非彼此独立,某个子问题在后续的决策阶段可能会被反复引用。这一特性并非动态规划方法所必需,但若缺失此特性www45nnncom,与其它算法相较,动态规划算法将失去其独特的优势。
四、求解的基本步骤
动态规划主要解决的是一种涉及多个阶段决策的问题,这类问题通常从初始状态出发,通过选择中间阶段的决策,最终达到结束状态。这些决策共同构成了一个决策序列,并确定了实现整个过程的特定活动路径——通常是指寻找最优的活动路径。具体如图所示。动态规划的设计遵循一定的模式,通常包括以下几个步骤。
初始状态→│决策1│→│决策2│→…→│决策n│→结束状态
图1 动态规划决策过程示意图
在问题分析中,首先需依据问题的时空属性,将其细分为不同的时期或区域。在实施这一步骤时,务必确保分出的各个阶段能够按照一定的顺序排列,若不然,求解过程将变得不可行。接着www45nnncom,需明确每个阶段的具体状态,并选取相应的状态变量来描述问题在各个阶段所呈现的客观状况。同时,所选择的状态变量应具备无后效性原则。决策一旦确定,便可以着手撰写状态转移方程;决策与状态转移之间存在内在的关联,状态转移即是依据前一阶段的状态和所做决策来推导出当前阶段的状态。因此,一旦决策明确,状态转移方程也就随之生成。然而,实际情况往往与此相反,我们通常是通过分析相邻两个阶段状态间的联系来确立决策策略和状态转移方程。在确定边界条件时,需注意所提供的状态转换公式属于一种递推形式,因此必须设定一个明确的递推结束条件或者边界条件。
通常情况下,一旦明确了问题解决的各个阶段、所处状态以及状态转变的决策,便能够构建出状态转移方程(同时包括边界条件)。在实际操作过程中,我们可以遵循以下简化的步骤来进行设计:,
(1)分析最优解的性质,并刻画其结构特征。
(2)递归的定义最优解。
采用自下而上或自上而下的记忆化策略(即备忘录法),计算得到最佳数值。
(4)根据计算最优值时得到的信息,构造问题的最优解
五、算法实现的说明
动态规划的难点主要集中在理论层面的构思,具体来说,就是确定那四个关键步骤。一旦这些步骤被明确,后续的实现过程便会变得相对容易。
使用动态规划求解问题,最重要的就是确定动态规划三要素:
(1)问题的阶段
(2)每个阶段的状态
(3)从前一个阶段转化到后一个阶段之间的递推关系。
递推关系需从较小的子问题出发,逐步过渡至更复杂的问题,从这一视角来看,动态规划常常通过递归程序得以实现,尽管其与递归程序存在一定差异。然而,递推方法能够有效利用已解决的子问题结果,从而减少不必要的重复计算,这使得动态规划在处理大规模问题时,相较于递归程序展现出无法比拟的优越性,正是这一特性构成了动态规划算法的核心精髓。
明确了动态规划的三个关键要素后,整个求解步骤便可以通过一个最优决策表来详述。该决策表呈现为一张二维表格,其行对应决策的不同阶段,列则代表问题的各种状态。表格中需填写的数据通常反映了问题在特定阶段和状态下所达到的最优结果,例如最短路径、最长公共子序列或最大价值等。填充表格的过程遵循递推关系,从第一行第一列开始,按照行优先或列优先的顺序逐一填写。最终www45nnncom,通过分析整个表格中的数据,通过简单的选择或计算,可以得出问题的最优解。
函数f(n,m)的值等于取f(n-1,m)和f(n-1,m-w[n])加上P(n,m)中的最大值。
六、动态规划算法基本框架
for(j=1; j<=m; j=j+1) // 第一个阶段
xn[j] = 初始值;
for(i=n-1; i>=1; i=i-1)// 其他n-1个阶段
在循环中,j的初始值为1,且在j大于等于函数f(i)返回的值时,j的值每次递增1,其中f(i)是一个与i值相关的表达式。
t等于通过子问题的最优解来计算整个问题的最优解的方法,即g(x1[j1:j2])。
print(x1[j1]);
for(i=2; i<=n-1; i=i+1)
{
t = t-xi-1[ji];
for(j=1; j>=f(i); j=j+1)
if(t=xi[ji])
break;
}
七、动态规划算法典型例子
1、斐波那契数列
数学上,斐波那契数列是以递归的方法来定义:
以文字表述,斐波那契数列是从0和1起始,后续的斐波那契数则是通过将前两个数相加得到。
使用递归的方式
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else{
返回求解斐波那契数列的第n-1项与第n-2项的和。
}
动态规划
if(n==0) {
return 0;
}else if(n == 1){
return 1;
}else{
int result[] = new int[n+1];
result[0] = 0;
result[1] = 1;
for(int i=2;i<=n;i++){
result[i] = result[i-1] + result[i-2];
}
return result[n];
}
类似的问题包括:跳跃楼梯问题:每次只能迈上一个或两个台阶,达到第n级楼梯有几种不同的跳法。
台阶跳跃问题中,初始值设定为f(0)等于1,f(1)同样等于1,而f(2)的值为2。
斐波那契数列的初始值为:f(0)等于0,f(1)等于1,f(2)同样等于1。
斐波那契数列的构成规则为f(n+1)等于f(n)与f(n-1)之和,即f(n+1) = f(n) + f(n-1),而要计算数列的第n项,我们可以采用以下几种方法:
1. 递归法:
计算f(n)问题时,我们将其分解为f(n-1)和f(n-2)两个子问题的求解,并通过递归方式求解,直至达到f(0)和f(1)这两个终止条件。
不足之处在于,存在大量的重复递归计算,比如在计算 f(n)f(n)f(n) 和 f(n−1)f(n - 1)f(n−1) 时,都需先求出 f(n−2)f(n - 2)f(n−2) 的结果。
2. 记忆化递归法:
递归法作为基础,我们构建了一个长度为n的数组,该数组用于在递归过程中保存从f(0)到f(n)的数值。当再次遇到某个数值时,可以直接从数组中获取,这样做有效避免了重复的递归计算。
不足之处在于,采用记忆化存储的数组形式,将不可避免地占用与原数组大小相同的额外空间,即O(N)的空间复杂度。
3. 动态规划:
原理在于运用斐波那契数列的特性,即转移方程 f(n+1) 等于 f(n) 加上 f(n-1)。
从计算效率、空间复杂度上看,动态规划是本题的最佳解法。
参考资料:
该链接指向的网页是steven_oyj在2010年5月22日发表的一篇文章,文章内容详尽地探讨了相关主题。
- 随机文章
- 热门文章
- 热评文章