动态规划法2020/6/182of158方法概述:发展及研究内容动态规划(dynamicprogramming)是运筹学的一个分支,20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistepdecisionprocess)的优化问题时,提出了著名的最优化原理(principleofoptimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、资源分配、设备更新等问题,用动态规划比用其它方法求解更为方便。2020/6/183of158方法概述:发展及研究内容虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),可以人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。2020/6/184of158方法概述:基本思想动态规划的思想实质是分治思想和解决冗余。与分治法类似的是,将原问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,经分解的子问题往往不是互相独立的。若用分治法来解,有些共同部分(子问题或子子问题)被重复计算了很多次。如果能够保存已解决的子问题的答案,在需要时再查找,这样就可以避免重复计算、节省时间。动态规划法用一个表来记录所有已解的子问题的答案。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表方式。2020/6/185of158方法概述:求解步骤1、找出最优解的性质,并刻画其结构特征;2、递归地定义最优值(写出动态规划方程);3、以自底向上的方式计算出最优值;4、根据计算最优值时记录的信息,构造最优解。注:-步骤1-3是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤4可以省略;-若需要求出问题的一个最优解,则必须执行步骤4,步骤3中记录的信息是构造最优解的基础2020/6/186of158方法概述:适用条件动态规划法的有效性依赖于问题本身所具有的两个重要性质最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。2020/6/187of158方法概述:最优性原理及举例Bellman给出这个原理作为动态规划的适用条件,后来Morin在1982年证明了这只是一个充分条件而非必要条件。Bellman的原定义如下:Anoptimalpolicyhasthepropertythatwhatevertheinitialstateandinitialdecisionare,thenremainingdecisionsmustconstituteanoptimalpolicywithregardtothestateresultingfromfirstdecision.最优性原理又称为最优子结构性质:如果有一决策序列包含有非最优的决策子序列,则该决策序列一定不是最优的。即一个最优策略的子策略总是最优的。2020/6/188of158方法概述:最优性原理及举例(续)例1:设G是一个有向加权图,则G从顶点i到顶点j之间的最短路径具有最优子结构性质。证明:(反证)设i~ip~iq~j是一条最短路径,但其中子路径ip~iq~j不是最优的,假设最优的路径为ip~iq’~j则我们重新构造一条路径:i~ip~iq’~j显然该路径长度小于i~ip~iq~j,与i~ip~iq~j是顶点i到顶点j的最短路径相矛盾.所以,原问题满足最优性原理。2020/6/189of158方法概述:设计技巧动态规划的设计技巧:阶段的划分和状态的表示;在动态规划的设计过程中,阶段的划分和状态的表示是非常重要的两步,这两步会直接影响该问题的计算复杂性,有时候阶段划分或状态表示的不合理还会使得动态规划法不适用。2020/6/1810of158方法概述:存在的问题空间溢出的问题,是动态规划解决问题时一个普遍遇到的问题;动态规划需要很大的空间以存储中间产生的结果,这样可以使包含同一个子问题的所有问题共用一个子问题解,从而体现动态规划的优越性,但这是以牺牲空间为代价的,为了有效地访问已有结果,数据也不易压缩存储,因而空间矛盾是比较突出的。2020/6/1811of158例1:多段图的最短路问题多段图:设G=V,E是一个有向连通图,其中|V|=n,|E|=m,V有划分{V1,V2,···,Vk},这里V1={s},s称为源点,Vk={t},t称为终点,其中k≥2。对于每条有向边u,v∈E都存在Vi∈V,使得u∈Vi和v∈Vi+1,其中1≤ik且每条边u,v均附有代价C(u,v),则称G是一个k段图。2020/6/1812of158123456789101112s97324212711118654356425V1V2V3V4V5t2020/6/1813of158最短路:从源点s到终点t的整条路上的代价之和为最小。•每个子集Vi构成图中的一段。由于E的约束,每条从s到t的路径都是从第一段开始,然后顺次经过第2段,第3段,···,最后在第k段终止。对于每条从s到t的路径,可以把它看成在k-2个阶段中做出的某个决策序列的相应结果。2020/6/1814of158假设s,v2,v3,···,vk-1,t是一条从s到t的最短路径,还假定从源点s(初始状态)开始,已做出了到结点v2的决策(初始决策),因此v2就是初始决策所产生的状态。如果把v2看成是原问题的一个子问题的初始状态,解这个子问题就是找出一条由v2到t的最短路径。这条路径显然是v2,v3,···,vk-1,t,否则设v2,q3,···,qk-1,t是一条由v2到t的更短路径,则s,v2,q3,···,qk-1,t是一条比路径s,v2,v3,···,vk-1,t更短的由s到t的路径,与假设矛盾,故最优化原理成立。2020/6/1815of158cost(i,j)=min{C(j,r)+cost(i+1,r)}r∈Vi+1j,r∈EjrtViVi+1最短最短向前处理法:设P(i,j)是从Vi中的点j到t的一条最短路,cost(i,j)是这条路线的耗费。由后向前推算,得到2020/6/1816of158123456789101112s97324212711118654356425V1V2V3V4V5tcost(4,9)=4cost(i,j)=min{C(j,r)+cost(i+1,r)}cost(4,10)=2cost(4,11)=5cost(3,6)=min{6+cost(4,9),5+cost(4,10)}=min{6+4,5+2}=7从第3段的顶点6到t的最短路径是6-10-t5+22020/6/1817of158123456789101112s97324212711118654356425V1V2V3V4V5tcost(3,7)=min{4+cost(4,9),3+cost(4,10)}=min{4+4,3+2}=5•从第3段的顶点7到t的最短路径是7-10-tcost(3,8)=7•从第3段的顶点8到t的最短路径是8-10-t2020/6/1818of158123456789101112s97324212711118654356425V1V2V3V4V5tcost(2,2)=7从第2段顶点2到t的最短路是2-7-10-tcost(2,3)=9从第2段顶点3到t的最短路是3-6-10-tcost(2,4)=18从第2段顶点4到t的最短路是4-8-10-tcost(2,5)=15从第2段顶点5到t的最短路是5-8-10-tcost(1,1)=16从第1段顶点1到t的最短路径由两条:1-2-7-10-t和1-3-6-10-t2020/6/1819of158从s到t的一条最短路径的代价为16。•用D(i,j)表示使C(j,r)+cost(i+1,r)取得最小值的r,则在上述求解过程中同时得到:•D(3,6)=10,D(3,7)=10,D(3,8)=10•D(2,2)=7,D(2,3)=6,D(2,4)=8•D(2,5)=8,D(1,1)=2•设从s到t的最短路径为s,w2,w3,···,wk-1,t•则有w2=D(1,1)=2w3=D(2,D(1,1))=D(2,2)=7w4=D(3,D(2,D(1,1)))=D(3,D(2,2))=D(3,7)=10•所以这条路径是1-2-7-10-t•所以这条路径是1-2-7-10-t2020/6/1820of158•为了便于描述算法,对一个k段图的顶点,按段的顺序给它的每个顶点编号。设图中有n个顶点,则编号为1,2,···,n。首先,给s编为1号;然后给V2中的各个顶点分别编为2,3,···,|V2|+1号;以此类推,最后t编号为n。这样编号使Vi+1中的任何顶点的编号大于Vi中所有顶点的编号。•于是,可以按n-1,n-2,···,1的顺序计算出cost(i,j)和D(i,j)。算法中可以利用顺序编号的特点,而不再考虑顶点所在的段。2020/6/1821of158•设顶点的编号已知,边已知及边的代价函数C(i,j)已知。用cost[i]表示顶点i到t的最小代价,1≤i≤n。用D[i]表示从顶点i到t的最短路径上顶点i的后继顶点号,用P[i]表示最短路径经过第i级的顶点号,1≤i≤k2020/6/1822of158•求两点间最短路径的算法:ProcedureFgraph1.{fori←1toncost[i]←0;2.forj=n-1step–1to1do{3.找顶点r,使j,r∈E,且C(j,r)+cost[r]最小;4.cost[j]←C(j,r)+cost[r];5.D[j]←r;}6.P[1]←1;P[k]←n;7.forj=2tok-1doP[j]←D[P[j-1]]}O(n+|E|)2020/6/1823of158123456789101112s97324212711118654356425V1V2V3V4V5t•(从前)向后:设BPij是从源点s到Vi中顶点j的最小成本路径,bcost(i,j)是这条路径的代价•bcost(i,j)=min{bcost(i-1,r)+C(r,j)}r∈Vi-1r,j∈E2020/6/1824of158格路问题:求从起点O(0,0)到终点E(m,n)的最短路。则分别用穷举法和动态规划法的加法次数和比较次数各是多少?E(m,n)O(0,0)xy2020/6/1825of1582020/6/1826of158E(m,n)O(0,0)xymn个点2020/6/1827of158例2:货郎担问题1243105209128913156810∞1015205∞910613∞12889∞v1v2v3v4v1v2v3v42020/6/1828of158•不失一般性,考虑以结点1为起点和终点的一条哈密顿回路。每一条这样的路线都由一条边1,k和一条由结点k到结点1的路径组成,其中k∈V-{1},而这条由结点k到结点1的路径通过V-{1,k}的每个结点各一次。如果这条周游路线是最优的,则这条由结点k到结点1的路径必定是通过V-{1,k}的每个结点各一次的由k到1的最短路径。2020/6/1829of158设T(i,S)是由结点i出发,经过结点集S中每个结点各一次并回到初始结点1的一条最短路径长度,则T(1,V-{1})就是一条最优的周游路线长度。动态规划模型:T(1,V-{1})=min{d1k+T(k,V-{1,k})}2≤k≤nT(i,s)=min{dij+T(j,S-{j})}j