- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Tutorial5DynamicProgramming(动态规划)(一)Review比较基本的
Tutorial 5
Dynamic Programming: (动态规划)
(一)Review
比较基本的算法设计思想里,动态规划是比较难于理解,难于抽象的一种,但是却又十分重要。动态规划的实质是分治思想和解决冗余,因此它与分治法和贪心法类似,它们都是将问题的实例分解为更小的、相似的子问题,但是动态规划又有自己的特点。(1)贪心法的当前选择可能要依赖于已经作出的选择,但不依赖于还未做出的选择和子问题,因此它的特征是由顶向下,一步一步地做出贪心选择,但不足的是,如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解。相比而言,动态规划则可以处理不具有贪心实质的问题。
(2)分治法解决问题时,由于子问题的数目往往是问题规模的指数函数,因此对时间的消耗太大。动态规划的思想在于,如果各个子问题不是独立的,不同的子问题的个数只是多项式量级,如果我们能够保存已经解决的子问题的答案,而在需要的时候再找出已求得的答案,这样就可以避免大量的重复计算。由此而来的基本思路是,用一个表记录所有已解决的子问题的答案,不管该问题以后是否被用到,只要它被计算过,就将其结果填入表中。
(3) 动态规划的思想比较感性的说,其实是对贪心算法和分治法的一种折衷,它所解决的问题往往不具有可爱的贪心实质,但是各个子问题又不是完全零散的,这时候我们用一定的空间来换取时间,就可以提高解题的效率。
(1) The 0/1 knapsack problem
0-1 背包问题
问题描述:给定n种物品和一个背包,物品I的重量是Wi,其价值为Vi,背包的容量为c,问如何选择装入背包的物品,使得装入背包的物品的总价值最大?
形式化描述:给定c求一个n元1-0向量Xi(每种物品要么装要么不装) ????????????Wi?Xi(i从1到n连乘累加,Xi=0或1)〈=c ????????????Vi?Xi(i从1到n连乘累加,Xi=0或1)?达到最大
(2) Chain Matrix Multiplication
矩阵乘法问题:
给定n个矩阵{A1,A2,…An},其中Ai与A i+1是可乘的,i=1,2…,n-1。考察这n个矩阵的连乘积A1A2…An。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q矩阵,B是一个q×r矩阵,则其乘积C=AB是一个p×r矩阵,需要pqr次数乘。 由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。例如,设3个矩阵{A1,A2,A3}的维数分别为10×100,100×5,和5×50。若按加括号方式((A1A2)A3)计算,3个矩阵连乘积需要的数乘次数为10×100×5+10×5×50=7500。若按加括号方式(A1(A2A3))计算,3个矩阵连乘积总共需要10×5×50+10×100×50=75000次数乘。由此可见,在计算矩阵连乘积时,加括号方式,即计算次序对计算量有很大影响。 矩阵连乘积的最优计算次序问题,即对于给定的相继n个矩阵{A1,A2,…An}(其中矩阵Ai的维数为pi-1×p,i=1,2,…,n),确定计算矩阵连乘积A1,A2,…An的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
(3) All-Pairs Shortest Paths
最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括:
? 确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。
? 确定终点的最短路径问题 - 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
? 确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。
? 全局最短路径问题 - 求图中所有的最短路径。
用于解决最短路径问题的算法被称做“最短路径算法”, 有时被简称作“路径算法”。 最常用的路径算法有:
? Dijkstra算法
? A*算法
? Bellman-Ford算法
? Floyd-Warshall算法
? Johnson算法
? Bi-Direction BFS算法
Folyd-Warshall弗洛伊德动态规划算法(点击链接,查看该算法讲义):
设Di,j,k为从i到j的只以(1..k)集合中的节点为中间结点的最短路径的长度。
1. 若最短路径经过点k,则Di,j,k = Di,k,k ? 1 + Dk,j,k ? 1;
2. 若最短路径不经过点k,则Di,j,k = Di,j,k ? 1。
因此,Di,j,k = min(Di,k,k ? 1 + Dk,j,k ? 1,Di,j
文档评论(0)