维特比算法

1. 概述

  维特比算法是安德鲁.维特比(Andrew Viterbi)于1967年为解决通信领域中的解码问题而提出的,它同样广泛用于解决自然语言处理中的解码问题,隐马尔可夫模型的解码是其中典型的代表。无论是通信中的解码问题还是自然语言处理中的解码问题,本质上都是要在一个篱笆网络中寻找得到一条最优路径。
  所谓篱笆网络,指的是单向无环图,呈层级连接,各层节点数可以不同。如图是一个篱笆网络,连线上的数字是节点间概念上的距离(如间距、代价、概率等),现要找到一条从起始点到终点的最优路径。
在这里插入图片描述
  在实际问题中,节点数和层数往往是大量的,因而采取遍历所有的路径计算其距离进行比较的方式是不可行的。维特比算法正是通过动态规划的方式高效求得这条最优路径。


2.算法原理

  该问题具有这样一个特性,对于最优(如最短距离)的路径,任意一段子路径一定是该段两端点间所有可达路径中最优的,如若不然,将该段中更优的子路径接到两端点便构成了另一个整体最优路径,这是矛盾的。或者说,最优路径中,从起始点到由近及远的任一点的子路径,一定是该段所有可达路径中最优的。也即,整体最优,局部一定最优
在这里插入图片描述
  该特性也就是说,对每个节点而言,如果最优路径经过这一点,则一定是经过从起始点到这点的这段最优路径。那么,只要从头开始,由局部向整体推进,渐次地找到起始点到当前点的最优路径,算至终点便得到了整体最优路径。这样的方式叫做动态规划,是维特比算法的基本思想。

维特比算法求解篱笆网络最短路径的过程为:
  从第一层开始,对每一层的每一个节点,计算出起始点到它的最短距离,并记录下相应最短路径下它的前一个节点,逐层递推,算至终止点时便得到了整体最短距离,再依照节点记录下的前置节点进行回溯,就得到了最短路径的序列。对第 i i i层第 j j j个节点 P i , j P_{i,j} Pi,j,假设起始点到它的最短距离为 D ( P i , j ) D\left( P_{i,j} \right) D(Pi,j),相应最短路径下它的前一个节点为 P r e ( P i , j ) Pre\left( P_{i,j} \right) Pre(Pi,j),则

D ( P i , j ) = min ⁡ 1 ≤ k ≤ N [ D i − 1 , k + d ( P i − 1 , k , P i , j ) ] D\left( P_{i,j} \right)=\min_{1\leq k \leq N}{\left[ D_{i-1,k}+d(P_{i-1,k},P_{i,j}) \right]} D(Pi,j)=1kNmin[Di1,k+d(Pi1,k,Pi,j)]
也就是,对前一层的所有节点,计算每一个节点的记录的最短距离D与它到当前节点的距离d的和,取其中最小的那个值(其中, d ( A , B ) d(A,B) d(A,B)表示A,B两节点间的距离。).

P r e ( P i , j ) = P i − 1 , j ∗ = a r g min ⁡ 1 ≤ k ≤ N [ D i − 1 , k + d ( P i − 1 , k , P i , j ) ] Pre\left( P_{i,j} \right)=P_{i-1,j\ast}=arg\min_{1\leq k \leq N}{\left[ D_{i-1,k}+d(P_{i-1,k},P_{i,j}) \right]} Pre(Pi,j)=Pi1,j=arg1kNmin[Di1,k+d(Pi1,k,Pi,j)]
也就是,满足距离最短的那条路径上在前一层的节点.


3.示例

  在如下网络中,连线上的数字是节点间的距离,求S点到E点的最短距离和与之对应的路径。
在这里插入图片描述
第一层:
对节点 P 1 , 1 P_{1,1} P1,1
起始点到它只有一条路径,最短距离 D ( P 1 , 1 ) = 2 D(P_{1,1})=2 D(P1,1)=2,前一个节点 P r e ( P 1 , 1 ) = S Pre(P_{1,1}) = S Pre(P1,1)=S

对节点 P 1 , 2 P_{1,2} P1,2
起始点到它只有一条路径,最短距离 D ( P 1 , 2 ) = 1 D(P_{1,2}) = 1 D(P1,2)=1,前一个节点 P r e ( P 1 , 2 ) = S Pre(P_{1,2}) = S Pre(P1,2)=S

对节点 P 1 , 3 P_{1,3} P1,3
起始点到它只有一条路径,最短距离 D ( P 1 , 3 ) = 3 D(P_{1,3}) = 3 D(P1,3)=3,前一个节点 P r e ( P 1 , 3 ) = S Pre(P_{1,3}) = S Pre(P1,3)=S
在这里插入图片描述
第二层:
对节点 P 2 , 1 P_{2,1} P2,1
D ( P 1 , 1 ) + d ( P 1 , 1 , P 2 , 1 ) = 2 + 3 = 5 D(P_{1,1}) + d(P_{1,1},P_{2,1}) = 2 + 3 = 5 D(P1,1)+d(P1,1P2,1)=2+3=5
D ( P 1 , 2 ) + d ( P 1 , 2 , P 2 , 1 ) = 1 + 2 = 3 D(P_{1,2}) + d(P_{1,2},P_{2,1}) = 1 + 2 = 3 D(P1,2)+d(P1,2P2,1)=1+2=3
D ( P 1 , 3 ) + d ( P 1 , 3 , P 2 , 1 ) = 3 + 9 = 12 D(P_{1,3}) + d(P_{1,3},P_{2,1}) = 3 + 9 = 12 D(P1,3)+d(P1,3P2,1)=3+9=12
最短距离 D ( P 2 , 1 ) = m i n { 5 , 3 , 12 } = 3 D(P_{2,1}) = min\left\{ 5,3,12 \right\} = 3 D(P2,1)=min{5,3,12}=3,前一个节点 P r e ( P 2 , 1 ) = P 1 , 2 Pre(P_{2,1}) = P_{1,2} Pre(P2,1)=P1,2 ;

对节点 P 2 , 2 P_{2,2} P2,2
D ( P 1 , 1 ) + d ( P 1 , 1 , P 2 , 2 ) = 2 + 6 = 8 D(P_{1,1}) + d(P_{1,1},P_{2,2}) = 2 + 6 = 8 D(P1,1)+d(P1,1P2,2)=2+6=8
D ( P 1 , 2 ) + d ( P 1 , 2 , P 2 , 2 ) = 1 + 5 = 6 D(P_{1,2}) + d(P_{1,2},P_{2,2}) = 1 + 5 = 6 D(P1,2)+d(P1,2P2,2)=1+5=6
D ( P 1 , 3 ) + d ( P 1 , 3 , P 2 , 2 ) = 3 + 2 = 5 D(P_{1,3}) + d(P_{1,3},P_{2,2}) = 3 + 2 = 5 D(P1,3)+d(P1,3P2,2)=3+2=5
最短距离 D ( P 2 , 2 ) = m i n { 8 , 6 , 5 } = 5 D(P_{2,2}) = min\left\{ 8,6,5 \right\} = 5 D(P2,2)=min{8,6,5}=5,前一个节点 P r e ( P 2 , 2 ) = P 1 , 3 Pre(P_{2,2}) = P_{1,3} Pre(P2,2)=P1,3 ;

对节点 P 2 , 3 P_{2,3} P2,3
D ( P 1 , 1 ) + d ( P 1 , 1 , P 2 , 3 ) = 2 + 4 = 6 D(P_{1,1}) + d(P_{1,1},P_{2,3}) = 2 + 4 = 6 D(P1,1)+d(P1,1P2,3)=2+4=6
D ( P 1 , 2 ) + d ( P 1 , 2 , P 2 , 3 ) = 1 + 7 = 8 D(P_{1,2}) + d(P_{1,2},P_{2,3}) = 1 + 7 = 8 D(P1,2)+d(P1,2P2,3)=1+7=8
D ( P 1 , 3 ) + d ( P 1 , 3 , P 2 , 3 ) = 3 + 6 = 9 D(P_{1,3}) + d(P_{1,3},P_{2,3}) = 3 + 6 = 9 D(P1,3)+d(P1,3P2,3)=3+6=9
最短距离 D ( P 2 , 3 ) = m i n { 6 , 8 , 9 } = 6 D(P_{2,3}) = min\left\{ 6,8,9 \right\} = 6 D(P2,3)=min{6,8,9}=6,前一个节点 P r e ( P 2 , 3 ) = P 1 , 1 Pre(P_{2,3}) = P_{1,1} Pre(P2,3)=P1,1 ;
在这里插入图片描述
第三层:
对节点 P 3 , 1 P_{3,1} P3,1
D ( P 2 , 1 ) + d ( P 2 , 1 , P 3 , 1 ) = 3 + 9 = 12 D(P_{2,1}) + d(P_{2,1},P_{3,1}) = 3 + 9 = 12 D(P2,1)+d(P2,1P3,1)=3+9=12
D ( P 2 , 2 ) + d ( P 2 , 2 , P 3 , 1 ) = 5 + 2 = 7 D(P_{2,2}) + d(P_{2,2},P_{3,1}) = 5 + 2 = 7 D(P2,2)+d(P2,2P3,1)=5+2=7
D ( P 2 , 3 ) + d ( P 2 , 3 , P 3 , 1 ) = 6 + 6 = 12 D(P_{2,3}) + d(P_{2,3},P_{3,1}) = 6 + 6 = 12 D(P2,3)+d(P2,3P3,1)=6+6=12
最短距离 D ( P 3 , 1 ) = m i n { 12 , 7 , 12 } = 7 D(P_{3,1}) = min\left\{ 12,7,12 \right\} = 7 D(P3,1)=min{12,7,12}=7,前一个节点 P r e ( P 3 , 1 ) = P 2 , 2 Pre(P_{3,1}) = P_{2,2} Pre(P3,1)=P2,2;

对节点 P 3 , 2 P_{3,2} P3,2
D ( P 2 , 1 ) + d ( P 2 , 1 , P 3 , 2 ) = 3 + 3 = 6 D(P_{2,1}) + d(P_{2,1},P_{3,2}) = 3 + 3 = 6 D(P2,1)+d(P2,1P3,2)=3+3=6
D ( P 2 , 2 ) + d ( P 2 , 2 , P 3 , 2 ) = 5 + 6 = 11 D(P_{2,2}) + d(P_{2,2},P_{3,2}) = 5 + 6 = 11 D(P2,2)+d(P2,2P3,2)=5+6=11
D ( P 2 , 3 ) + d ( P 2 , 3 , P 3 , 2 ) = 6 + 3 = 9 D(P_{2,3}) + d(P_{2,3},P_{3,2}) = 6 + 3 = 9 D(P2,3)+d(P2,3P3,2)=6+3=9
最短距离 D ( P 3 , 2 ) = m i n { 6 , 11 , 9 } = 6 D(P_{3,2}) = min\left\{ 6,11,9 \right\} = 6 D(P3,2)=min{6,11,9}=6,前一个节点 P r e ( P 3 , 2 ) = P 2 , 1 Pre(P_{3,2}) = P_{2,1} Pre(P3,2)=P2,1;

对节点 P 3 , 3 P_{3,3} P3,3
D ( P 2 , 1 ) + d ( P 2 , 1 , P 3 , 3 ) = 3 + 8 = 11 D(P_{2,1}) + d(P_{2,1},P_{3,3}) = 3 + 8 = 11 D(P2,1)+d(P2,1P3,3)=3+8=11
D ( P 2 , 2 ) + d ( P 2 , 2 , P 3 , 3 ) = 5 + 7 = 12 D(P_{2,2}) + d(P_{2,2},P_{3,3}) = 5 + 7 = 12 D(P2,2)+d(P2,2P3,3)=5+7=12
D ( P 2 , 3 ) + d ( P 2 , 3 , P 3 , 3 ) = 6 + 4 = 10 D(P_{2,3}) + d(P_{2,3},P_{3,3}) = 6 + 4 = 10 D(P2,3)+d(P2,3P3,3)=6+4=10
最短距离 D ( P 3 , 3 ) = m i n { 11 , 12 , 10 } = 10 D(P_{3,3}) = min\left\{ 11,12,10 \right\} = 10 D(P3,3)=min{11,12,10}=10,前一个节点 P r e ( P 3 , 3 ) = P 2 , 3 Pre(P_{3,3}) = P_{2,3} Pre(P3,3)=P2,3;
在这里插入图片描述
第四层(终点):
对节点 E E E
D ( P 3 , 1 ) + d ( P 3 , 1 , E ) = 7 + 3 = 10 D(P_{3,1}) + d(P_{3,1},E) = 7 + 3 = 10 D(P3,1)+d(P3,1E)=7+3=10
D ( P 3 , 2 ) + d ( P 3 , 2 , E ) = 6 + 7 = 13 D(P_{3,2}) + d(P_{3,2},E) = 6 + 7 = 13 D(P3,2)+d(P3,2E)=6+7=13
D ( P 3 , 3 ) + d ( P 3 , 3 , E ) = 10 + 6 = 16 D(P_{3,3}) + d(P_{3,3},E) = 10 + 6 = 16 D(P3,3)+d(P3,3E)=10+6=16
最短距离 D ( E ) = m i n { 10 , 13 , 16 } = 10 D(E) = min\left\{ 10,13,16 \right\} = 10 D(E)=min{10,13,16}=10,前一个节点 P r e ( E ) = P 3 , 1 Pre(E) = P_{3,1} Pre(E)=P3,1;
在这里插入图片描述
P r e ( E ) = P 3 , 1 Pre(E) = P_{3,1} Pre(E)=P3,1 P r e ( P 3 , 1 ) = P 2 , 2 Pre(P_{3,1}) = P_{2,2} Pre(P3,1)=P2,2 P r e ( P 2 , 2 ) = P 1 , 3 Pre(P_{2,2}) = P_{1,3} Pre(P2,2)=P1,3 P r e ( P 1 , 3 ) = S Pre(P_{1,3}) = S Pre(P1,3)=S
故最短距离为10,与之对应的路径为( S S S P 1 , 3 P_{1,3} P1,3 P 2 , 2 P_{2,2} P2,2 P 3 , 1 P_{3,1} P3,1 E E E).

End.


参考

  1. 吴军. 数学之美(第二版). 人民邮电出版社.
  2. 李航. 统计学习方法. 清华大学出版社.
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

禺垣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值