动态规划(dynamic programming)

1、动态规划是通过组合字问题的解而解决整个问题的。

2、它与分治法的区别:

    分治法是将问题分解为一些独立的子问题,递归的求解各个子问题,然后合并子问题的解而得到源问题的解。

    而动态规划适合用于子问题不是独立的情况,也就是各个子问题包含公共的子子问题。在这种情况下,若采用分治的的思想则会做许多不必要的工作。动态规划会对每个子子问题之求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。

3、设计步骤:(应用于最优化问题)

    1):描述最优解的结构。

    2):递归定义最优解的值。

    3):按自底向上的方式计算最优解的值

    4):由计算出的结果构造一个最优解

eg:装配线调度:汽车公司在生产汽车的时候,有两条转配线,如图。汽车地盘在进入每一条装配线后,在每条先上安装完各个部件后离开。每一条装配线上有n个装配站,编号问j = 1,2,,,n。将装配线i(i为1或者2)的第j个装配站表示为S(i,j)。第j站的功能相同,比如S(1,3)与S(2,3).然而每个站上的装配时间是不相同的。我们把装配站S(i,j)上的时间记为a(i,j)。一个汽车底盘在进入和离开装配线i的时候都需要花费时间,地盘进入装配线i的时间为ei;装配完离开装配线的时间为xi,从一个装配线移走的时间为t(i,j);

  一旦一个地盘进入一条装配线后,它只会经过该条装配线。在相同的装配线中,从一个装配站到下一个装配站所花的时间可以忽略。偶尔会来一个特别急得订单,客户要求尽可能快的制造这些汽车。会转移到别的装配线上,这时会有进入和离开的时间。

  步骤一:通过工厂最快路线的结构

    动态规划的第一个步骤是描述最优解的结构的特征

    首先,假设通过装备站S(1,j)的最快路线通过了装配站S(1,j-1)。关键的一点是地盘必定利用了最快的路线从开始点到装配站S(2,j-1)。

    对于装配线调度问题,一个问题的(找出通过装配站S(i,j)的最快路线)最优解包含的子问题(找出通过S(i,j-1)或S(2,j-1)的最快路线)的一个最优解。我们称这个性质为最优子结构,这是是否可以应用动态规划方法的标志之一。

    我们可以利用最优子结构的最优解来构造源问题的一个最优解。对于装配线调度问题的推理如下:

    观察一条通过装匹配站S(1,j)的最快路线,会发现必定是经过装配线1或2上的装配站j-1.因此,通过装配站S(1,j)的最快路线只能是一下二者之一;

      a、通过装配站S(1,j-1)的最快路线,然后直接通过装配站S(1,j)。

      b、通过装配站S(2,j-1)的最快路线,从装配线2移动到装配线1,然后通过装配站S(1,j)。

    利用对称的推理思想,通过装配站S(2,j)的最快路线也和上边一样。

    为了解决这个问题,及寻找通过任一条装配线上的装配站j的最快路线,我们解决他的子问题,即寻找通过两条线配线上的装配站j-1的最快路线。

    所以,对于装配线调度问题,通过建立子问题的最优解,就可以建立源问题某个势力的一个最优解

  步骤二:一个递归的解

    在动态规划的方法中,第二个步骤是利用子问题的最优解来递归定义一个最优解的值。对于装配线的调度问题,我们选择在两条装配线上通过装配线j的最快路线的问题来作为子问题,j = 1,2,。。。。,n。另f[j]表示一个地盘从起点到装配站最快可能时间。

    要对进行推理是很简单的,因为不管是哪一条我们都可以直达,所以:

    接下来我们就要计算,加入我们要计算,则有;

    

    对应的的装配线2:

    

    合并上述公式可以得到:

    

    我们继续定义内放置装配线的编号(1或2),其中的装配站j-1被通过装配站的S(1,j)的最快路线所使用。

  步骤三:计算最快时间

    此时,我们可以更具上边的公式写出一个递归算法来计算通过工厂的最快路线还是比较简单的。但是这种递归算发会出现一个问题,更具最后的递归式,我们会得到他的执行时间是有关于n的指数形式。

    如果在递归的方式中以不同的顺序来计算的值,可以做的更好,通过递增的方式来计算,可以在O(n)时间内计算出通过工厂的最快路线。

  

  

原文地址:https://www.cnblogs.com/weiliuyby/p/8446560.html

时间: 2024-10-12 01:58:59

动态规划(dynamic programming)的相关文章

算法应用公式(二)动态规划 Dynamic Programming

动态规划在计算机中是一个比较玄学的算法,有的人可能看很久都很疑惑这到底是怎么回事,但是一旦理解了,上手就非常容易了. 算法描述 (以下内容来自百度百科)动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimali

动态规划 Dynamic Programming

March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 前言 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的

优化问题 Optimization Problems & 动态规划 Dynamic Programming

2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题(亦译为受约束的最优化问题)是一类数学最优化问题,它由目标函数以及与目标函数中的变量相关的约束条件两部分组成,优化过程则为在约束条件下最优化(最大化或最小化)目标函数. 经典的优化问题: 最短路问题 旅行商问题(TSP) 装箱问题 调度问题 背包问题 了解并熟练掌握这些经典的优化问题会对以后遇到的新的

动态规划-Dynamic Programming(DP)

动态规划 动态规划方法心得 ? 动态规划是一般的面试.笔试中的高频算法题,熟练掌握必要的.动态规划的中心思想是在解决当前问题时,可以由之前已经计算所得的结果并结合现在的限制条件递推出结果.由于此前的计算结果已经保留下来,所以极大的缩短了时间复杂度. ? 解决动态规划问题的关键是找出状态表达式,即如何由之前的结果推导出现在的结果.另外,有的问题有很多限制条件增加问题的难度,需要剥丝抽茧,将问题解决.在找到状态表达式后,分为三步解决问题: 一. 定义内存空间,用来保存每步结果,并根据题目初始化,有些

Dynamic programming:from novice to advanced【动态规划】

动态规划:从新手到专家 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 前言 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的一些理解.水平有限,还望指摘.

笔试算法题(44):动态规划(Dynamic Programming)

议题:动态规划(Dynamic Programming) 分析: DP主要用于解决包含重叠子问题(Overlapping Subproblems)的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存最简单子问题的解,然后逐步合并成为原问题的解,由于需 要查询子问题的解,所以需要一个表格记录子问题的解:DP仅适用于最优子结构问题(Optimal Substructure),也就是局部最优解相当于(或者近似于)全局最优解: 对于原问题而言,当递归地自顶向下对问题进行求解时,每次产生的

Dynamic Programming 动态规划

Dynamic Programming DP 的历史渊源: Richard E. Bellman (1920-1984) Richard Bellman received the IEEE Medal of Honor, 1979. "Bellman . . . explained that he invented the name 'dynamid programming' to hide the fact that he was doing mathe-matical research at

以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划主要用于解决包含重叠子问题的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存重复子问题的解,然后逐步合并成为原问题的解.动态规划的关键是用记忆法储存重复问题的答案,避免重复求解,以空间换取时间. 用动态规划解决的经典问题有:最短路径(shortest path),0-1背包问题(K

动态规划算法(Dynamic Programming,简称 DP)

动态规划算法(Dynamic Programming,简称 DP)似乎是一种很高深莫测的算法,你会在一些面试或算法书籍的高级技巧部分看到相关内容,什么状态转移方程,重叠子问题,最优子结构等高大上的词汇也可能让你望而却步. 而且,当你去看用动态规划解决某个问题的代码时,你会觉得这样解决问题竟然如此巧妙,但却难以理解,你可能惊讶于人家是怎么想到这种解法的. 实际上,动态规划是一种常见的「算法设计技巧」,并没有什么高深莫测,至于各种高大上的术语,那是吓唬别人用的,只要你亲自体验几把,这些名词的含义其实

Dynamic Programming | Set 3 (Longest Increasing Subsequence)

在 Dynamic Programming | Set 1 (Overlapping Subproblems Property) 和 Dynamic Programming | Set 2 (Optimal Substructure Property) 中我们已经讨论了重叠子问题和最优子结构性质,现在我们来看一个可以使用动态规划来解决的问题:最长上升子序列(Longest Increasing Subsequence(LIS)). 最长上升子序列问题,致力于在一个给定的序列中找到一个最长的子序列