Algorithm--动态规划

版权声明:转载请注明出处 https://blog.csdn.net/weixin_42683993/article/details/89283752

一. 基本概念

  • 动态规划是运筹学中用于求解决策过程中的最优化数学方法。作为算法设计策略, 动态规划经常常使用于解决最优化问题,这些问题多表现为多阶段决策

  • 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了实用的信息(不独立)。

  • 在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其它局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

  • 因为动态规划解决的问题多数有重叠子问题这个特点。为降低反复计算。对每个子问题仅仅解一次,将其不同阶段的不同状态保存在一个二维数组中。

  • 动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。

二. 适用的情况

能用动态规划求解的问题的一般要具有3个性质:

  • 最优化原理:假设问题的最优解所包括的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
  • 无后效性:即某阶段状态一旦确定。就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响曾经的状态。仅仅与当前状态有关;
  • 有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到(该性质并非动态规划适用的必要条件,可是假设没有这条性质。动态规划算法同其它算法相比就不具备优势)。

三、求解的基本步骤

  • 动态规划所处理的问题是一个多阶段决策问题。一般由初始状态開始。通过对中间阶段决策的选择,达到结束状态。动态规划的设计都有着一定的模式。一般要经历下面几个步骤:
    初始状态→│决策1│→│决策2│→…→│决策n│→结束状态
  • (1)划分阶段:依照问题的时间或空间特征。把问题分为若干个阶段。在划分阶段时。注意划分后的阶段一定要是有序的或者是可排序的。否则问题就无法求解。
    (2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。
    (3)确定决策并写出状态转移方程:由于决策和状态转移有着天然的联系,状态转移就是依据上一阶段的状态和决策来导出本阶段的状态。所以假设确定了决策。状态转移方程也就可写出。但其实经常是反过来做。依据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。
    (4)寻找边界条件:给出的状态转移方程是一个递推式。须要一个递推的终止条件或边界条件。
  • 实际应用中能够按下面几个简化的步骤进行设计:
    (1)分析最优解的性质。并刻画其结构特征。
    (2)递归的定义最优解。
    (3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值。
    (4)依据计算最优值时得到的信息,构造问题的最优解。

四、算法实现的说明

  • 使用动态规划求解问题,最重要的就是确定动态规划三要素:问题的阶段、每一个阶段的状态、从前一个阶段转化到后一个阶段之间的递推关系。
  • 递推关系必须是从次小的问题開始到较大的问题之间的转化,从这个角度来说,动态规划往往能够用递归程序来实现,只是由于递推能够充分利用前面保存的子问题的解来降低反复计算,所以对于大规模问题来说。有递归不可比拟的优势。这也是动态规划算法的核心之处。
  • 由此可知,动态规划法与分治法和贪心法类似,
    相同点:将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。贪心法:当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。因此贪心法自顶向下,一步一步地作出贪心选择;如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解。
    分治法:各个子问题是独立的 (即不包含公共的子子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。但不足的是,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。

猜你喜欢

转载自blog.csdn.net/weixin_42683993/article/details/89283752