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)=1≤k≤Nmin[Di−1,k+d(Pi−1,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)=Pi−1,j∗=arg1≤k≤Nmin[Di−1,k+d(Pi−1,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,1,P2,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,2,P2,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,3,P2,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,1,P2,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,2,P2,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,3,P2,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,1,P2,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,2,P2,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,3,P2,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,1,P3,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,2,P3,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,3,P3,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,1,P3,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,2,P3,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,3,P3,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,1,P3,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,2,P3,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,3,P3,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,1,E)=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,2,E)=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,3,E)=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.
参考
- 吴军. 数学之美(第二版). 人民邮电出版社.
- 李航. 统计学习方法. 清华大学出版社.