版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
算法设计与分析王红梅第二版动态规划详解演示文稿现在是1页\一共有110页\编辑于星期日(优选)算法设计与分析王红梅第二版动态规划现在是2页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming3本章要点
6.1概述
6.2图问题中的动态规划法6.3组合问题中的动态规划法6.4查找问题中的动态规划法现在是3页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming46.1概述动态规划?在1950年代由美国数学家贝尔曼为研究最优控制问题而提出的概念。它是一种求解多阶段决策最优化问题的工具。与分治法的关系动态规划法也将待求解问题分解成若干子问题,但各问题间往往不是独立的。分治法对子问题的重叠部分要被重复计算多次。动态规划法将每个子问题只求解一次并保存在表中,下次查表获得解,免去重复计算。现在是4页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming5
最优化问题?有n个输入,它的解由这n个输入的一个子集组成,这个子集必须满足某些事先给定的条件,这些条件称为约束条件,满足约束条件的解称为问题的可行解。满足约束条件的可行解可能不只一个,为了衡量这些可行解的优劣,事先给出一定的标准,这些标准通常以函数的形式给出,这些标准函数称为目标函数,使目标函数取得极值(极大或极小)的可行解称为最优解,这类问题就称为最优化问题。
6.1.1多阶段决策过程现在是5页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming6最优化问题约束条件可行解输出子集目标函数最优解最优化问题思想问题输入集合I={i1i2…in}现在是6页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming7例:0/1背包问题物品i或者被装入背包(xi=1),或者不被装入背后(xi=0)。有如下约束条件和目标函数:
(式6.1)(式6.2)
最优化问题于是问题归结为寻找一个满足式(6.1)的约束条件,并使式(6.2)的目标函数达到最大的解向量X=(x1,x2,…,xn)现在是7页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming8最优性原理
对于一个具有n个输入的最优化问题,其求解过程往往可以划分为若干个阶段,每一阶段的决策仅依赖于前一阶段的状态,由决策所采取的动作使状态发生转移,成为下一阶段决策的依据;从而,一个决策序列在不断变化的状态中产生。这个决策序列产生的过程称为多阶段决策过程。
AP1P2P7
动态规划的决策过程BCDEP3P4P5P6初始状态最终状态现在是8页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming9
多阶段决策过程满足最优性原理(OptimalPrinciple):无论决策过程的初始状态和初始决策是什么,其余的决策都必须相对于初始决策所产生的当前状态,构成一个最优决策序列。各子问题的解只与它前面的子问题的解相关,而且各子问题的解都是相对于当前状态的最优解,整个问题的最优解是由各个子问题的最优解构成。如果一个问题满足最优性原理通常称此问题具有最优子结构性质。
最优性原理
现在是9页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming10动态规划法的设计思想
动态规划法将待求解问题分解成若干个相互重叠的子问题,每个子问题对应决策过程的一个阶段,一般来说,子问题的重叠关系表现在对给定问题求解的递推关系(也就是动态规划函数)中,将子问题的解求解一次并填入表中,当需要再次求解此子问题时,可以通过查表获得该子问题的解而不用再次求解,从而避免了大量重复计算。现在是10页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming11
原问题的解
原问题……
填表子问题1子问题2子问题n动态规划法的求解过程动态规划法的设计思想
现在是11页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming12求解过程动态规划法设计算法一般分成三个阶段:分段:将原问题分解为若干个相互重叠的子问题;分析:分析问题是否满足最优性原理,找出动态规划函数的递推式;求解:利用递推式自底向上计算,实现动态规划过程。动态规划法的设计思想
现在是12页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming13n=5时分治法计算斐波那契数的过程
F(5)F(4)F(3)F(3)F(2)F(2)F(1)F(2)F(1)F(1)F(0)F(1)F(0)F(1)F(0)例:计算斐波那契数分治法求解重复计算动态规划法的设计思想
现在是13页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming1401234567890112358132134动态规划法求解斐波那契数F(9)的填表过程:
注意到,计算F(n)是以计算它的两个重叠子问题
F(n-1)和F(n-2)的形式来表达的,所以,可以设计一张表填入n+1个F(n)的值。
填表法动态规划法的设计思想
现在是14页\一共有110页\编辑于星期日一个简单的例子——数塔问题问题描述:从数塔的顶层出发,在每一个结点可以选择向左走或向右走,一直走到最底层,要求找出一条路径,使得路径上的数值和最大。81239156810512910184162023/4/24第6章动态规划法Page15现在是15页\一共有110页\编辑于星期日数塔问题——想法81239156810512910184162023/4/24第6章动态规划法Page16[想法]从顶层出发下一层选择取决于两个4层数塔的最大数值和。现在是16页\一共有110页\编辑于星期日求解初始子问题:底层的每个数字可看作1层数塔,则最大数值和就是其自身;再求解下一阶段的子问题:第4层的决策是在底层决策的基础上进行求解,可以看作4个2层数塔,对每个数塔进行求解;再求解下一阶段的子问题:第3层的决策是在第4层决策的基础上进行求解,可以看作3个2层的数塔,对每个数塔进行求解;以此类推,直到最后一个阶段:第1层的决策结果就是数塔问题的整体最优解。数塔问题——想法2023/4/24第6章动态规划法Page17现在是17页\一共有110页\编辑于星期日1.初始化数组maxAdd的最后一行为数塔的底层数据:
for(j=0;j<n;j++)
maxAdd[n-1][j]=d[n-1][j];2.从第n-1层开始直到第1层对下二维数组maxAdd[i][j]执行下述操作:
2.1maxAdd[i][j]=d[i][j]+max{maxAdd[i+1][j],maxAdd[i+1][j+1]};
2.2如果选择下标j的元素,则path[i][j]=j,否则path[i][j]=j+1;3.输出最大数值和maxAdd[0][0];4.根据path数组确定每一层决策的列下标,输出路径信息;数塔问题——算法2023/4/24第6章动态规划法Page18现在是18页\一共有110页\编辑于星期日数塔问题——算法2023/4/24第6章动态规划法Page19[算法分析]步骤1的时间代价是O(n),步骤2进行填表工作,需填写n-1行,由于数组maxAdd是下三角矩阵,第i行只需填写i个元素,故步骤2的时间代价是O(n2)。由于数组path已经记载每个决策的列下标,步骤4只需输出每行的决策结果,时间代价是O(n)。所以算法的时间复杂性是O(n2)。现在是19页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming20那些问题可以用动态规划法求解?能用动态规划法求解问题所具有的特征能够分解为相互重叠的若干子问题;满足最优性原理(也称最优子结构性质):该问题的最优解中包含着其子问题的最优解。分析问题是否满足最优性原理的方法(是用反证法)先假设由问题的最优解导出的子问题的解不是最优的;然后再证明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。动态规划法的设计思想
现在是20页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming21本章要点
6.1概述6.2图问题中的动态规划法6.3组合问题中的动态规划法6.4查找问题中的动态规划法现在是21页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming226.2图问题中的动态规划法
6.2.3TSP问题
6.2.1多段图的最短路径问题6.2.2多源点最短路径问题
现在是22页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming23多段图的最短路径问题
多段图的最短路径问题?设图G=(V,E)是一个带权有向连通图,如果把顶点集合V划分成k个互不相交的子集Vi(2≤k,1≤i≤k),使得E中的任何一条边(u,v),必有u∈Vi,v∈Vi+m(1≤i<k,
1<m),则称图G为多段图,称s∈V1为源点,t∈Vk为终点。多段图的最短路径问题:是求从源点到终点的最小代价路径。
现在是23页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming242120345678949387684756866537
一个多段图划分顶点子集:将顶点划分为k个互不相交的子集,所以,多段图划分为k段,每一段包含顶点的一个子集。顶点编号:将顶点集合V中的所有顶点按照段的顺序进行编号,子集中的顶点互不邻接,段内顶点间相互顺序无关紧要。设顶点数为n,源点s的编号为0,终点t的编号为n-1,对E中的任何一条边(u,v),顶点u的编号小于顶点v的编号。多段图的最短路径问题
现在是24页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming25下图是多段图吗?多段图的最短路径问题
现在是25页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming26
设s,s1,s2,…,sp,t是从s到t的一条最短路径,从源点s开始,设从s到下一段的顶点s1已经求出,则问题转化为求从s1到t的最短路径,显然s1,s2,…,sp,t一定构成一条从s1到t的最短路径,如若不然,设s1,r1,r2,…,rq,t是一条从s1到t的最短路径,则s,s1,r1,r2,…,rq,t将是一条从s到t的路径且比s,s1,s2,…,sp,t的路径长度要短,从而导致矛盾。所以,多段图的最短路径问题满足最优性原理。
证明多段图问题满足最优性原理多段图的最短路径问题
现在是26页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming27多段图的决策过程:多段图的边(u,v),用cuv表边的权值,从源点s到终点t的最短路径记为d(s,t),则从源点0到终点9的最短路径d(0,9)由下式确定:d(0,9)=min{c01+d(1,9),c02+d(2,9),c03+d(3,9)}上面是最后阶段的决策,它又依赖于d(1,9)、d(2,9)和d(3,9),其中:d(1,9)=min{c14+d(4,9),c15+d(5,9)}d(2,9)=min{c24+d(4,9),c25+d(5,9),c26+d(6,9)}d(3,9)=min{c35+d(5,9),c36+d(6,9)}
这一阶段的决策又依赖于d(4,9)、d(5,9)和d(6,9):多段图的最短路径问题
现在是27页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming28d(4,9)=min{c47+d(7,9),c48+d(8,9)}d(5,9)=min{c57+d(7,9),c58+d(8,9)}d(6,9)=min{c67+d(7,9),c68+d(8,9)}这一阶段的决策依赖d(7,9)和d(8,9)
,而d(7,9)和d(8,9)可以直接获得:d(7,9)=c79=7(7→9)d(8,9)=c89=3(8→9)再向前推导,有:d(6,9)=min{c67+d(7,9),c68+d(8,9)}=min{6+7,5+3}=8(6→8)d(5,9)=min{c57+d(7,9),c58+d(8,9)}=min{8+7,6+3}=9(5→8)d(4,9)=min{c47+d(7,9),c48+d(8,9)}=min{5+7,6+3}=9(4→8)多段图的最短路径问题
现在是28页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming29d(3,9)=min{c35+d(5,9),c36+d(6,9)}=min{4+9,7+8}=13(3→5)d(2,9)=min{c24+d(4,9),c25+d(5,9),c26+d(6,9)}=min{6+9,7+9,8+8}=15(2→4)d(1,9)=min{c14+d(4,9),c15+d(5,9)}=min{9+9,8+9}=17(1→5)d(0,9)=min{c01+d(1,9),c02+d(2,9),c03+d(3,9)}=min{4+17,2+15,3+13}=16(0→3)最后,得到最短路径为0→3→5→8→9,长度为16。
多段图的最短路径问题
现在是29页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming30多段图的最短路径问题的填表过程:前提条件设数组cost[n]:
作为存储子问题解的表格,cost[i]表示从顶点i到终点t的最短路径或最小花费;设数组path[n]:path[i]存放从顶点i到终点t的最小花费路径上顶点i的下一个顶点编号设数组route[i]:用于存放最短路径顶点子集填表过程第一阶段,确定第k-1段的所有顶点到达终点t的花费最小的通路;第二阶段,用第一阶段的信息,确定第k-2段的所有顶点到达终点t的花费最小的通路;如此依次进行,直到最后确定源点s到达终点t的花费最小的通路;多段图的最短路径问题
现在是30页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming31最后,从源点s的path信息中,确定它的前方顶点编号p1,从p1的path信息中,确定p1的前方顶点编号p2,如此递推,直到终点t。动态规划函数为:
cost[i]=min{cij+cost[j]}(i≤j≤n,且顶点j,i是邻接点)(式6.7)path[i]=取min{cij+cost[j]}的
j
(式6.8)多段图的最短路径问题
现在是31页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming32步骤:对所有的i,0≤i<n
,把cost[i]
初始化为最大值∞,path[i]
初始化为-1;cost[n-1]
初始化为0(如n=10,则cost[9]=0);令i=n-2;根据(6.7)式和(6.8)式计算cost[i]
和path[i]
;i=i-1,若i≥0,转3;否则,转5;令i=0,route[i]=0;如果route[i]=n-1,算法结束;否则,转7;i=i+1,route[i]=path[route[i-1]];转6多段图的最短路径问题
现在是32页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming33例:
求解下图所示的最短路径问题多段图的最短路径问题
2120345678949387684756866537现在是33页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming34多段图的最短路径问题
i=n-2=8i=i-1=7>0,继续计算现在是34页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming35多段图的最短路径问题
:最短路径现在是35页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming36多段图的最短路径问题
:计算最短路径顶点集route[n]i=0i=i+1Ifroute[i]<n-1Route[i]=n-1=9,算法结束最后,得到最短的路径为0,3,5,8,9,费用是16。现在是36页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming37多段图的最短路径问题
顶点i0123456789Cost[i]∞∞∞∞∞∞∞∞∞0Path[i]-1-1-1-1-1-1-1-1-1-1Route[i]0顶点i0123456789Cost[i]16171513998730Path[i]354588899-1Route[i]0现在是37页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming38多段图的最短路径问题
顶点i0123456789Cost[i]16171513998730Path[i]354588899-1Route[i]0顶点i0123456789Cost[i]16171513998730Path[i]354588899-1Route[i]03589route[i]=path[route[i-1]]现在是38页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming39算法6.2——多段图的最短路径
1.初始化:数组cost[n]初始化为最大值,数组path[n]初始化为-1,数组元素route[0]=0;
2.for(i=n-2;i>=0;i--)2.1对顶点i的每一个邻接点j,根据式6.7计算cost[i];2.2根据式6.8计算path[i];3.输出最短路径长度cost[0];4.计算route[i],
并输出最短路径经过的顶点:
4.1i=0:4.2循环直到route[i]=n-1
输出route[i]=path[route[i-1]];伪代码多段图的最短路径问题
现在是39页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming40算法6.2主要由三部分组成:第一部分是初始化部分,其时间性能为O(n);第二部分是依次计算各个顶点到终点的最短路径,由两层嵌套的循环组成,外层循环执行n-1次,内层循环对所有出边进行计算,并且在所有循环中,每条出边只计算一次。假定图的边数为m,则这部分的时间性能是O(m);第三部分是输出最短路径经过的顶点,设多段图划分为k段,其时间性能是O(k)。如忽略第一部分,算法6.2的时间复杂性为O(m+k)。多段图的最短路径问题
现在是40页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming416.2.2多源点最短路径问题
[问题]给定带权有向图G=(V,E),对任意顶点vi和vj(i≠j),求顶点vi和vj的最短路径长度。[想法]设d(vi,vj,V)是从顶点vi到vj经过顶点集合V的最短路径长度初始子问题:d(vi,vj,{}),即vi到vj弧,若不存在则为∞下个子问题:d(vi,vj,{v0}),取vi,vj和vi,v0,vj较短者下个子问题:d(vi,vj,{v0,v1}),取d(vi,vj,{v0})和vi,…,v1,…,vj较短者……d(vi,vj,{v0,…,vk})=min{d(vi,vj,{v0,…,vk-1}),d(vi,vk,{v0,…,vk-1})+d(vk,vj,{v0,…,vk-1})}现在是41页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming426.2.2多源点最短路径问题
动态规划函数(0≤i,j≤n-1): d(vi,vj,{})=cij d(vi,vj,{v0,…,vk})=min{d(vi,vj,{v0,…,vk-1}), d(vi,vk,{v0,…,vk-1})+d(vk,vj,{v0,…,vk-1})}现在是42页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming436.2.2多源点最短路径问题
现在是43页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming446.2.2多源点最短路径问题
[算法实现]设图G=(V,E)中顶点的编号为{0,1,…,n-1},有向边上的权值存储在代价矩阵arc[n][n]中,数组dist[n][n]存放在迭代过程中求得的最短路径长度,初始为图的邻接矩阵,在迭代过程中,根据如下递推关系式进行迭代:dist-1[i][j]=arc[i][j]distk[i][j]=min{distk-1[i][j],distk-1[i][k]+distk-1[k][j]}0≤k≤n-1distk[i][j]是从顶点vi到vj经过顶点集合{v0,…,vk}的最短路径长度现在是44页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming456.2.2多源点最短路径问题
constintn=10;voidfloyd(intarc[n][n],intdist[n][n]){ inti,j,k; for(i=0;i<n;i++) //初始化矩阵dist for(j=0;j<n;j++) dist[i][j]=arc[i][j]; for(k=0;k<n;k++) //进行n次迭代 for(i=0;i<n;i++) for(j=0;j<n;j++) if(dist[i][k]+dist[k][j]<dist[i][j]) dist[i][j]=dist[i][k]+dist[k][j];}现在是45页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming466.2.2多源点最短路径问题
[算法分析]Floyd算法的基本语句是比较操作dist[i][k]+dist[k][j]<dist[i][j],设图中有n个顶点,三层嵌套的循环实现对二维数组dist迭代n次,其时间复杂性是O(n3)。现在是46页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming47TSP问题
TSP问题是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短,也就是在有向带权图G=<V,E>中,寻找路径最短的哈密尔问题。
设4个城市间的距离可以用代价矩阵来表示。C=∞3675∞2364∞2375∞
带权图的代价矩阵=Cij12341234现在是47页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming48
设s,s1,s2,…,sp,s是从s出发的一条路径长度最短的简单回路,假设从s到下一个城市s1已经求出,则问题转化为求从s1到s的最短路径,显然s1,s2,…,sp,s一定构成一条从s1到s的最短路径。如若不然,设s1,r1,r2,…,rq,
s是一条从s1到s的最短路径且经过n-1个不同城市,则s,s1,r1,r2,…,rq,s将是一条从s出发的路径长度最短的简单回路且比s,s1,s2,…,sp,s要短,从而导致矛盾。所以,TSP问题满足最优性原理。首先证明TSP问题满足最优性原理:TSP问题
现在是48页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming49解TSP问题的过程描述如下:设从i出发,V’=V-{i}令d(i,V’):表示从顶点i
出发,经过V’中各个顶点一次且仅一次,最终回到顶点i的最短路径长度。d(k,{}):从顶点k出发,回到i点的最短路径长度d(k,V’-{k}):从k出发,经过V’-{k}的点,回到i的最短路径长度则TSP的动态规划函数为:
d(i,V-{i})=d(i,V’)=
min{cik+d(k,V’-{k})}
(k∈V’)
(式6.5)
d(k,{})=cki(k≠i)
(式6.6)TSP问题
从城市0出发经城市1、2、3然后回到城市0的最短路径长度是:d(0,{1,2,3})=min{c01+d(1,{2,3}),c02+d(2,{1,3}),c03+d(3,{1,3})}现在是49页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming50上式是最初阶段的决策,而:
d(1,{2,3})=min{c12+d(2,{3}),c13+d(3,{2})}d(2,{1,3})=min{c21+d(1,{3}),c23+d(3,{1})}d(3,{1,2})=min{c31+d(1,{2}),c32+d(2,{1})}这一阶段的决策又依赖于下面的计算结果:d(2,{3})=c23+d(3,φ)d(3,{2})=c32+d(2,φ)d(1,{3})=c13+d(3,φ)d(3,{1})=c31+d(1,φ)d(1,{2})=c12+d(2,φ)d(2,{3})=c21+d(1,φ)
而上式中的d(i,φ)可以直接获得:d(1,φ)=c10=5(1→0)d(2,φ})=c20=6(2→0)d(3,φ)=c30=3(3→0)TSP问题
现在是50页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming51有了这些结果,再向前计算,有:TSP问题
再向前倒推,有:1234562→33→21→33→11→22→1现在是51页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming52TSP问题
2→13→21→20→1最后:
所以,从0出发的TSP问题最短路径长度为10,其路径:01230
87109现在是52页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming53假设
n个顶点用0~n-1的数字编号,首先生成所有的顶点子集存放数组V[2n-1]中,当n=4时,从V[1]={1},…,
V[1,2,3]},设数组d[n][2n-1]存放迭代结果,其中d[i][j]表示从顶点i经过子集V[j]中的顶点一次且仅一次,最后回到出发点0的最短路径长度。根据:d(i,φ)=ci0(i≠j)
初始化d[i][0]:ji{}{1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}0
15
26
33
动态规划法求解TSP的填表过程TSP问题
现在是53页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming54ji{}{1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}0
1015
86
7
269
5
10
331211
14
TSP问题
带权图的代价矩阵11057d(1,{2,3})=min{c12+d(2,{3}),c13+d(3,{2})}d(0,{1,2,3})=min{c01+d(1,{2,3}),c02+d(2,{1,3}),c03+d(3,{1,2})}d(2,{1,3})=min{c21+d(1,{3}),c23+d(3,{1})}d(3,{1,2})=min{c31+d(1,{2}),c32+d(2,{1})}现在是54页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming55算法6.3——TSP问题
1.for(i=1;i<n;i++)//初始化第0列
d[i][0]=c[i][0];
2.for(j=1;j<2n-1;j++)//n个顶点的子集for(i=1;i<n;i++)//依次进行第i次迭代
if(子集V[j]中不包含i)
对V[j]中的每个元素k,计算d[i][j]=min(c[i][k]+d[k][V[j]-k在数组V 中的下标]);3.对V[2n-1]中的每一个元素k,计算d[0][2n-1]=min(c[0][k]+d[k][V[2n-1]-k在数
组V中的下标]);4.输出最短路径长度d[0][2n-1-1];伪代码
设顶点之间的代价存放在数组c[n][n]中,动态规划法求解TSP问题的算法如下:
TSP问题
现在是55页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming56复杂性分析令Ni是计算从顶点i出发,返回顶点所需计算的形式为d(k,V’-{k})的个数。开始计算d(i,V-{i})时,集合V-{i}中有n-1个城市。以后,在计算d(k,V’-{k})时,集合V’-{k}的城市数目,在不同的决策阶段,分别为n-1,…,1。在整个计算中,需要计算大小为j的不同城市集合的个数为,。因此,总个数为:TSP问题
,
现在是56页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming57当V’-{k}集合中的城市个数为j时,为计算d(k,V’-{k})
,需j次加法,
j-1次比较。从i城市出发,经其它城市再回到i,总的运算时间为:TSP问题
,
由二项式定理:令x=y=1,可得:现在是57页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming58
显然,算法6.3的时间复杂性为
。蛮力法的时间复杂性是O(n!)的排列问题。结论:与蛮力法相比,动态规划法求解TSP问题将排列问题转化为组合问题,从而降低了算法的时间复杂性,但它仍需要指数时间。
TSP问题
则TSP问题总的花费代价T为:现在是58页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming59本章要点
6.1概述6.2图问题中的动态规划法6.3组合问题中的动态规划法6.4查找问题中的动态规划法现在是59页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming606.3组合问题中的动态规划法
6.3.1最长递增子序列问题
6.3.2最长公共子序列问题6.3.30/1背包问题
现在是60页\一共有110页\编辑于星期日问题描述:在数字序列A={a1,a2,…,an}中按递增下标序列(i1,i2,…,ik)(1≤i1<i2<…<ik≤n)顺序选出一个子序列B,如果子序列B中的数字都是严格递增的,则子序列B称为序列A的递增子序列。最长递增子序列问题就是要找出序列A的一个最长的递增子序列。6.3.1最长递增子序列问题2023/4/24第6章动态规划法Page61现在是61页\一共有110页\编辑于星期日最长递增子序列问题——想法设序列A={a1,a2,…,an}最长递增子序列是B={b1,b2,…,bm}最长递增子序列问题满足最优性原理。设序列A的最长递增子序列的第1个数字是b1,且b1=ai,则问题转化为求{ai,…,an}的最长递增子序列,显然,{b1,b2,…,bm}一定是{ai,…,an}的最长递增子序列,如若不然,设{b1,c1,…,ck}是序列{ai,…,an}的长度大于m的最长递增子序列,则{b1,c1,…,ck}将是序列{a1,a2,…,an}的长度大m的最长递增子序列,从而与设计矛盾,得证。2023/4/24第6章动态规划法Page62现在是62页\一共有110页\编辑于星期日最长递增子序列问题——想法如何定义子问题?设L(n)为数字序列A={a1,a2,…,an}的最长递增子序列的长度,显然,初始子问题是{a1},即L(1)=1。考虑原问题的一部分,设L(i)为子序列A={a1,a2,…,ai}的最长递增子序列的长度,则满足如下递推式:
1i=1或不存在aj<ai(1≤j<i)max{L(j)+1}对于所有的aj<ai(1≤j<i)L(i)=2023/4/24第6章动态规划法Page63现在是63页\一共有110页\编辑于星期日对于序列A={5,2,8,6,3,6,9,7},用动态规划法求解最长递增子序列。首先计算初始子问题,可以直接获得:L(1)=1({5})然后依次求解下一个阶段的子问题,有:L(2)=1({2})L(3)=max{L(1)+1,L(2)+1}=2({5,8},{2,8})L(4)=max{L(1)+1,L(2)+1}=2({5,6},{2,6})L(5)=L(2)+1=2({2,3})L(6)=max{L(1)+1,L(2)+1,L(5)+1)}=3({2,3,6})L(7)=max{L(1)+1,L(2)+1,L(3)+1,L(4)+1,L(5)+1,L(6)+1}=4({2,3,6,9})L(8)=max{L(1)+1,L(2)+1,L(4)+1,L(5)+1,L(6)+1}=4({2,3,6,7})序列A的最长递增子序列的长度为4,有两个最长递增子序列,分别是{2,3,6,9}和{2,3,6,7})。最长递增子序列问题——实例2023/4/24第6章动态规划法Page64现在是64页\一共有110页\编辑于星期日i12345678ai52863697L(i)11222344Bi{5}{2}{5,8},{2,8}{5,6},{2,6}{2,3}{2,3,6}{2,3,6,9}{2,3,6,7}最长递增子序列问题——实例(填表)2023/4/24第6章动态规划法Page65现在是65页\一共有110页\编辑于星期日设序列A存储在数组a[n]中,数组L[n]存储最长递增子序列的长度,其中L[i]表示元素序列a[0]~a[i]的最长递增子序列的长度,二维数组x[n][n]存储对应的最长递增子序列,其中x[i][n]存储a[0]~a[i]的最长递增子序列,注意到数组下标均从0开始,给出用C++语言描述的算法。最长递增子序列问题——算法2023/4/24第6章动态规划法Page66现在是66页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming67intincreaseOrder(inta[],intn){inti,j,k,index;intL[10],x[10][10];for(i=0;i<n;i++){ //初始化L[i]=1;x[i][0]=a[i];}for(i=1;i<n;i++){ //依次计算a[0]~a[i]的最长递增子序列intmax=1;for(j=i-1;j>=0;j--){if((a[j]<a[i])&&(max<L[j]+1)){ //对所有的aj<ai max=L[j]+1;L[j]=max; for(k=0;k<max-1;k++)x[i][k]=x[j][k];//将j对应的子序列复制到i x[i][max-1]=a[i]; //将ai接到前面的子序列最后
}
}
}最长递增子序列问题——算法现在是67页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming68for(index=0,i=1;i<n;i++) //求所有递增子序列的最大长度 if(L[index]<L[i])index=i;cout<<“最长递增子序列是:”;for(i=0;i<L[index];i++) //输出最长递增子序列 cout<<x[index][i]<<““;returnL[index]; //返回最长递增子序列的长度}[算法分析]设序列A的长度为n,算法依次对每一个序列元素进行计算,在求解L[i]时需要考察a[0]~a[i-1]是否小于a[i],因此其时间复杂性为O(n2)。最长递增子序列问题——算法现在是68页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming696.3组合问题中的动态规划法
6.3.1最长递增子序列问题
6.3.2最长公共子序列问题6.3.30/1背包问题
现在是69页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming70最长公共子序列问题
子序列?
对给定序列
X=(x1,x2,…,xm)
和另一序列Z=(z1,z2,…,zk),当且仅当X存在一个严格递增下标序列(i1,i2,…,ik),对所有的j=1,2,…,k,有zj=xij(1≤ij≤m),则称Z是X的子序列。如,对于序列X=(a,b,c,b,d,a,b),序列(b,c,d,b)是X的一个长度为4的子序列,相应的递增下标序列为(2,3,5,7)公共子序列?给定两个序列X=(x1,x2,…,xm)和Y=(y1,y2,…yn),当另一个序列Z
既是X
子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。
现在是70页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming71例A:∑={x,y,z}
,X=xyzyxzxzxxx
是X的长度为3的子序列。子序列中的字符,相应于X的下标是1,5,7xzyzx是X的长度为5的子序列。子序列中的字符,相应于X的下标是1,3,4,6,7例B:X=xyzyxzxz,
Y=xzyxxyzxxxx是长度为3的公共子序列;xzyz是长度为4的公共子序列;xzyxxz是长度为6的公共子序列例C:
X=abcbdb,Y=acbbabdbbacb是长度为3的公共子序列abbdb是长度为5的公共子序列最长公共子序列问题
现在是71页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming72最长公共子序列问题?就是在序列x
和y的公共子序列中,查找长度最长的公共子序列。穷举法求解思想
对x的所有子序列,检查它是否也是y的子序列,从而确定它是否为x和y的公共子序列,并在检查过程中记录最长的公共子序列。x的所有子序列都检查后即可求出x和y的最长公共子序列最长公共子序列问题
现在是72页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming73最长公共子序列问题符合最优性原理:设序列X={x1,x2,…,xm}和Y={y1,y2,…,
yn}的最长公共子序列为Z={z1,z2,…,zk},记Xk为序列X中前k个连续字符组成的子序列,Yk为序列Y中前k个连续字符组成的子序列,Zk为序列Z中前k个连续字符组成的子序列,显然有下式成立:最长公共子序列问题
现在是73页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming74最长公共子序列问题(1)若xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列;(2)若xm≠yn
且zk≠xm,则Zk
是Xm-1和Y的最长公共子序列;(3)若xm≠yn
且zk≠yn,则Zk
是X和Yn-1的最长公共子序列。可见,两个序列的最长公共子序列包含了这两个序列的前缀序列的最长公共子序列。因此,该问题满足最优性原理。现在是74页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming75最长公共子序列的的搜索过程设有序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},则递推方式计算如下:xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm即可得到X和Y的最长公共子序列;xm≠yn时,必须求解两个子问题:找出Xm-1和Y
的最长公共子序列以及Xm和Yn-1的最长公共子序列,这两个公共子序列中的较长者即为X和Y的最长公共子序列Z;设L[i][j]:记为子序列Xi和Yj的最长公共子序列的长度,可用递推公式计算如下:最长公共子序列问题
现在是75页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming76L[0][0]=L[i][0]=L[0][j]=0(1≤i≤m,1≤j≤n,0代表空序列)(式6.14) (式6.15)最长公共子序列的长度计算
最长公共子序列的搜索计算过程可分为m+1个阶段:第0阶段,按照式6.14初始化公共子序列长度数组L第0行、第0列为0;最长公共子序列问题
现在是76页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming77第1阶段,按照式6.15计算X1
和Yj
的最长公共子序列长度L[1][j](1≤j≤n);//计算第1行第2阶段,按照式6.15计算X2
和Yj的最长公共子序列长度L[2][j](1≤j≤n);//计算第2行依此类推,最后在第m
阶段,计算Xm
和Yj
的最长公共子序列长度L[m][j](1≤j≤n),则L[m][n]
就是序列Xm和Yn的最长公共子序列的长度。最长公共子序列问题
现在是77页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming78
最长公共子序列的S矩阵的计算
为了得到序列Xm和Yn
具体的最长公共子序列,设二维表S[m+1][n+1],其中S[i][j]表示在计算L[i][j]的过程中的搜索状态,并且有:
(式6.16)若S[i][j]=1,表明ai=bj,则下一次沿对角线方向搜索S[i-1][j-1];若S[i][j]=2,表明ai≠bj且L[i][j-1]≥L[i-1][j],则下一次沿水平方向搜索S[i][j-1];若S[i][j]=3,表明ai≠bj且L[i][j-1]<L[i-1][j],则下一次沿直方向搜索S[i-1][j]
最长公共子序列问题
现在是78页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming79(a)长度矩阵L(b)状态矩阵S01234567890123456789000000000000000000000101111111111012221222220112222222203211212113012222222230312222222401233333334033112121150123333444503332221226012344445560331122211例:序列X=(a,b,c,b,d,b),Y=(a,c,b,b,a,b,d,b,b),建立两个(m+1)×(n+1)的二维表L和表S,分别存放搜索过程中得到的子序列的长度和状态。最长公共子序列问题
acbbabdbb
ab
cbdb
L[4][1]<L[3][2]L[2][1]=>L[1][2]现在是79页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming80最长公共子序列问题
L几个元素的计算实例:L[1][1]=?因为:x1=y1,所示:L[1][1]=L[0][0]+1=1L[1][2]=?因为:x1<>y2,所示:L[1][2]=max{L[1][1],L[0][2]}=1……L[6][9]=?因为:x6=y9,所示:L[6][9]=L[5][8]+1
现在是80页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming81最长公共子序列问题
S几个元素的计算实例:S[6][9]=?因为:x6=y9,所示:S[6][9]=1S[4][7]=?因为:x4<>y7,且L[4][6]=1<L[3][7]=2,所示:S[4][7]=3……左边上面现在是81页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming82算法6.4——最长公共子序列问题
intCommonOrder(intm,intn,intx[],inty[],intz[]){
for(j=0;j<=n;j++)//初始化第0行
L[0][j]=0;for(i=0;j<=m;i++)//初始化第0列
L[i][0]=0;
for(i=1;i<=m;i++)for(j=1;j<=n;j++)if(x[i]==y[j]){L[i][j]=L[i-1][j-1]+1;S[i][j]=1;}elseif(L[i][j-1]>=L[i-1][j]){L[i][j]=L[i][j-1];S[i][j]=2;}else{L[i][j]=L[i-1][j];S[i][j]=3;}i=m;j=n;k=L[m][n];for(;i>0&&j>0;){if(S[i][j]==1){z[k]=x[i];k--;i--;j--;}//沿对角线搜索
elseif(S[i][j]==2)j--;//沿水平搜索
elsei--;//沿垂直搜索
}returnL[m][n];}C++描述现在是82页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming83时间复杂度分析在算法6.4中,第一个for循环的时间性能是O(n);第二个for循环的时间性能是O(m);第三个循环是两层嵌套的for循环,其时间性能是O(m×n);第四个for循环的时间性能是O(k),而k≤min{m,n};所以,算法7.4的时间复杂性是O(m×n)。最长公共子序列问题
现在是83页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming840/1背包问题
在0/1背包问题中,物品i或者被装入背包,或者不被装入背包,设xi表示物品i装入背包的情况,则当xi=0时,表示物品i没有被装入背包,xi=1时,表示物品i被装入背包。根据问题的要求,有如下约束条件和目标函数:
(式6.9)(式6.10)问题归结为寻找一个满足约束条件式6.9,并使目标函数式6.10达到最大的解向量X=(x1,x2,…,xn)。现在是84页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming85证明0/1背包问题满足最优性原理设(x1,x2,…,xn)是所给0/1背包问题的一个最优解,则(x2,…,xn)是下面一个子问题的最优解:如若不然,设(y2,…,yn)是上述子问题的一个最优解,则0/1背包问题
现在是85页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming86因此,
这说明(x1,y2,…,yn)是所给0/1背包问题比(x1,x2,…,xn)更优的解,从而导致矛盾。0/1背包问题可以看作是决策一个序列
(x1,x2,…,xn)对任一变量xi的决策是决定xi=1还是xi=0。在对xi-1决策后,已确定了(x1,…,xi-1),在决策xi时,问题处于下列两种状态之一:
0/1背包问题
现在是86页\一共有110页\编辑于星期日2023/4/24Chapter6DynamicProgramming87(1)背包容量不足以装入物品i,则xi=0,背包不增加价值;(2)背包容量可以装入物品i,则xi=1,背包的价值增加了vi。这两种情况下背包价值的最大者应该是对xi决策后的背包价值。令V(i,j):表示前i
个物品中能够装入容量为j(1≤j≤C)的背包获得的最大价值,则可以得到如下动态规划函数:
V(i,0)=V(0,j)=0
(式6.11)(式6.12)0/1背包问题
不装入装入现在是87页\一共有110页\编辑于星期日2023/4/24Ch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川省绵阳市平武县2024-2025学年七年级上学期1月期末考试道德与法治试卷(含答案)
- 湖南省株洲市2025届高三年级教学质量统一检测数学试题(含答案)
- 重大版小学英语(2012版)三年级下册期末试卷(含答案含听力原文无音频)
- 2024高端红酒进口及分销业务承包合同
- 2024施工建筑垃圾外运及环保处理一体化项目管理合同3篇
- 2024环保设备采购及运行维护合同
- 2024年运输服务合同详细条款
- 2024版住宅区前期物业管理服务协议范本版B版
- 2025年度GRC防火板采购合同模板3篇
- 2024石子销售合同范例:违约责任、争议解决
- 民用无人驾驶航空器产品标识要求
- 2024年医院产科工作计划例文(4篇)
- 2024-2025学年九年级英语上学期期末真题复习 专题09 单词拼写(安徽专用)
- 无创通气基本模式
- 江西省赣州市寻乌县2023-2024学年八年级上学期期末检测数学试卷(含解析)
- 《临床放射生物学》课件
- 肠造口还纳术手术配合
- 2024年中考语文试题分类汇编:诗词鉴赏(学生版)
- 科学计算语言Julia及MWORKS实践 课件 3-MWORKS简介
- 2024年10月自考04532财务会计专题试题及答案含解析
- 医院行政人员礼仪培训
评论
0/150
提交评论