动态规划求解最短路径问题:枚举法、逐段累加法、动态规划法对比理解

说明:自己在学习动态规划的过程中,碰到求解最短路径问题的实例,而理解了动态规划之后,再理解实例中的逐段累加法可能会让人难以理解。这篇文章主要是对比枚举法、逐段累加法、动态规划法求解最短路径问题的思路以及加法次数

问题:两点之间连线上的数字表示距离,求由A到G的最短路径(问题很常见,不过多描述了)

(图片来源:《运筹学·第三版》清华大学出版社)

为了说明的方便,这里删去图上的EFG节点,只保留A到D节点

这里,从A到D一共有2*3*2 = 12条路径,下面是加法运算次数对比:

 

法一. 普通计算,枚举法
思路:每条路径是单独计算的,例如:A到B1到C1到D1这条路径,先计算AB1 + B1C1,之后,AB1 + B1C1的和与C1D1相加。

一共12条路径,每条路径上有2次
12*2 = 24次
分别是
AB1 + B1C1 与 AB1C1长度 + C1D1
AB1 + B1C1 与 AB1C1长度 + C1D2
AB1 + B1C2 与 AB1C2长度 + C2D1
AB1 + B1C2 与 AB1C2长度 + C2D2
AB1 + B1C3 与 AB1C3长度 + C3D2
AB1 + B1C3 与 AB1C3长度 + C3D3
AB2 + B2C2 与 AB2C2长度 + C2D1
AB2 + B2C2 与 AB2C2长度 + C2D2
AB2 + B2C3 与 AB2C3长度 + C3D2
AB2 + B2C3 与 AB2C3长度 + C3D3
AB2 + B2C4 与 AB2C4长度 + C4D2
AB2 + B2C4 与 AB2C4长度 + C4D3

 

法二. 逐段累加法(当理解了动态规划之后,可能会觉得逐段累加不好理解)
思路:先计算所有的A到C的路径长度,并保存,再计算所有的A到D的路径长度,而A到D的路径中包含了一部分已经计算且保存了的A到C的路径,那么这部分就直接调用保存的结果而无需再次计算(以此类推,如果是ABCDE,先计算所有的A到C的路径长度,再计算所有的A到D的路径长度,再计算所有的A到E的路径长度,这就是逐段累加的含义

先计算A到C,6条路径,每条路径1次加法,一共6次加法
AB1 + B1C1
AB1 + B1C2
AB1 + B1C3
AB2 + B2C1
AB2 + B2C2
AB2 + B2C3
并且这六个结果都保存

再计算A到D,12条路径,每条路径都分为A到C与C到D两部分来看,A到C的路径长度已经计算过且保存了结果,所以对于每条路径来说,只需计算这条路所经过的A到C的路径长度 + 这条路径所经过的CD长度。每条路径都只有1次加法,一共12次加法
分别是
AB1C1长度 + C1D1
AB1C1长度 + C1D2
AB1C2长度 + C2D1
AB1C2长度 + C2D2
AB1C3长度 + C3D2
AB1C3长度 + C3D3
AB2C2长度 + C2D1
AB2C2长度 + C2D2
AB2C3长度 + C3D2
AB2C3长度 + C3D3
AB2C4长度 + C4D2
AB2C4长度 + C4D3

6 + 12 = 18次

可以看出,逐段累加方法相对于枚举法的优势在于,保存所有的逐段累加的计算结果,供之后的计算直接调用

 

法三. 动态规划法
思路:逆向寻找最短路径,为了和上面两种方法对比,这里以D为起点,A为终点先计算所有的C到A的路径长度,并保存,而且选出所有的C到A的最短路径长度,再计算所有的D到A的路径长度,而D到A的路径中包含了一部分已经计算、保存且选出的C到A的最短路径,那么这部分就直接调用保存的结果而无需再次计算(以此类推,如果是ABCDE,先计算所有的C到A的路径长度,选出所有的C到A的最短路径长度,再计算所有的D到A的路径长度,选出所有的D到A的最短路径长度,再计算所有的E到A的路径长度)

先计算C到A,6条路径,每条路径1次加法,一共6次加法
AB1 + B1C1
AB1 + B1C2
AB1 + B1C3
AB2 + B2C1
AB2 + B2C2
AB2 + B2C3
并且这六个结果都保存,且选出
C1到A的最短路径长度,AB1C1
C2到A的最短路径长度,AB1C2
C3到A的最短路径长度,AB2C3
C4到A的最短路径长度,AB2C4

再计算D到A,每条D到A的路径都分为D到C与C到A两部分来看,C到A的路径长度已经计算过且保存了结果,且选出了最短路径,所以不必考虑每条C到A的路径,只用考虑C到A的最短路径,而D到C有8条路径,可以认为当从D到达C时直接选用C到A的最短路径到达A。所以,实际上D到A只需要考虑8条路径,对于这8条路径中的每条路径来说,需要计算的是这条路所经过的DC长度 + C到A的最短路径长度。每条路径都只有1次加法,一共8次加法
分别是
AB1C1长度 + C1D1
AB1C1长度 + C1D2
AB1C2长度 + C2D1
AB2C2长度 + C2D2
AB2C3长度 + C3D2
AB2C3长度 + C3D3
AB2C4长度 + C4D2
AB2C4长度 + C4D3

6 + 8 = 14次

可以看出,动态规划相对于逐段累加方法的优势在于,计算D到A的最短路径时,直接取用C到A的最短路径,而不是考虑C到A的全部路径
 

三种方法结合起来对比

 

枚举法

逐段累加法

动态规划法

加法次数

24

18

14

具体加法

AB1 + B1C1

AB1 + B1C1

AB1 + B1C2

AB1 + B1C2

AB1 + B1C3

AB1 + B1C3

AB2 + B2C2

AB2 + B2C2

AB2 + B2C3

AB2 + B2C3

AB2 + B2C4

AB2 + B2C4

AB1C1长度 + C1D1

AB1C1长度 + C1D2

AB1C2长度 + C2D1

AB1C2长度 + C2D2

AB1C3长度 + C3D2

AB1C3长度 + C3D3

AB2C2长度 + C2D1

AB2C2长度 + C2D2

AB2C3长度 + C3D2

AB2C3长度 + C3D3

AB2C4长度 + C4D2

AB2C4长度 + C4D3

AB1 + B1C1

AB1 + B1C1(省掉)

AB1 + B1C2

AB1 + B1C2(省掉)

AB1 + B1C3

AB1 + B1C3(省掉)

AB2 + B2C2

AB2 + B2C2(省掉)

AB2 + B2C3

AB2 + B2C3(省掉)

AB2 + B2C4

AB2 + B2C4(省掉)

AB1C1长度 + C1D1

AB1C1长度 + C1D2

AB1C2长度 + C2D1

AB1C2长度 + C2D2

AB1C3长度 + C3D2

AB1C3长度 + C3D3

AB2C2长度 + C2D1

AB2C2长度 + C2D2

AB2C3长度 + C3D2

AB2C3长度 + C3D3

AB2C4长度 + C4D2

AB2C4长度 + C4D3

AB1 + B1C1

AB1 + B1C1(省掉)

AB1 + B1C2

AB1 + B1C2(省掉)

AB1 + B1C3

AB1 + B1C3(省掉)

AB2 + B2C2

AB2 + B2C2(省掉)

AB2 + B2C3

AB2 + B2C3(省掉)

AB2 + B2C4

AB2 + B2C4(省掉)

AB1C1长度 + C1D1

AB1C1长度 + C1D2

AB1C2长度 + C2D1

AB1C2长度 + C2D2

AB1C3长度 + C3D2(省掉)

AB1C3长度 + C3D3(省掉)

AB2C2长度 + C2D1(省掉)

AB2C2长度 + C2D2(省掉)

AB2C3长度 + C3D2

AB2C3长度 + C3D3

AB2C4长度 + C4D2

AB2C4长度 + C4D3

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值