第八讲 动态规划与最短路径(3)_538106033
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 k n 1 k n
7
25.1 每对顶点间最短路径问题的一 个递归解
实际的最短路径权值:如果图中不包含权值为 负的回路,那么对于所有的顶点对i和j,当δ(i, j) < ∞时,存在一条从i到j的最短路径,它是简单 路径,从而至多包含n-1条边。从顶点i到顶点j 的多于n-1条边的路径其权值不可能小于从i到j 的最短路径的权值。因此,实际的最短路径权 值由下式给出:
13
25.1 自底向上计算最短路径的权值
回到顶点最短路径问题,我们是通过把最短路径 逐边延长,最终计算出最短路径权值的。设A· B 代表过程EXTEND-SHORTEST-PATHS(A, B)返 回的矩阵乘积,我们计算n-1个矩阵的序列:
L(1)
L(2) L(3)
=
= =
L(0) ·W
L(1) ·W L(2) ·W ⋮
18
25.1 改进运行时间
在第4-6行while循环的每一次迭代中,从m=1开始 计算L(2m) = (L(m))2。在每次迭代的最后,m乘以2。 最后一次迭代实际通过对某个n-1≤2m<2n-2计算 L(2m),然后计算出L(n-1) 。根据等式25.3,有L(2m) = L(n-1)。下一次执行第4行中的测试语句时,由于m 已被乘以2,所以m≥n-1,测试失败,过程返回它 计算出的最后一个矩阵。 因为⌈lg(n - 1)⌉个矩阵乘积中的每一个都需要Θ(n3) 时间,因此FASTER-ALL-PAIRS-SHORTESTPATHS的运行时间为Θ(n3lgn)。算法中不包含复 杂数据结构,因此隐含于Θ中的常数很小
6
25.1 每对顶点间最短路径问题的一 个递归解
现在设 l(m)ij 是从顶点i到顶点j的至多包含m条边的 任何路径的权值最小值。
当m=0时,从i到j存在一条不包含边的最短路径当且 仅当i=j。因此 0 若i j
l(0)ij 若 i j (m -1) 对m ≥ 1,先计算 l ij (从i到j的最短路径的权至多包
4
动态规划
设计一个动态程序算法的过程为:
刻划最优解的结构(最优子结构) 递归定义最优解的值(动态规划设计) 按自底向上的方式计算最优解的值(重叠?) 由计算出的结果构造一个最优解(可省略)
用循环填表:
表中的项:子问题的最优解 循环嵌套的层数=表格的维度(子问题分解的维度)+1( 如果做选择时需要) 循环的初始值:平凡子问题之外的最小子问题(需用递归 求解的最小子问题)。 循环增量方向:例如从左上向右下方填表,保证计算某个 子问题最优解时需要的表中的项都已求解。
等于L(n-1) 因为2 下面过程利用重复平方技术计算上述矩阵序列
lg(n 1)
lg( n1)
2 n 1 ,最终乘积 L
FASTER-ALL-PAIRS-SHORTEST-PATHS(W) 1 n ← rows[W] 2 L(1) ← W 3m←1 4 while m < n - 1 5 do L(2m) ← EXTEND-SHORTEST-PATHS(L(m), L(m)) 6 m ← 2m 7 return L(m)
解决子问题的次序
3
25. 最短路径
讨论图上每对顶点间的最短路径问题 可以通过单元最短路径算法运行|V|次来解决每 对顶点间的最短路径问题。 本节介绍两个动态规划算法,用来解决有向图 G=(V,E)(允许负边,不允许负回路)上每对顶 点间的最短路径问题。两种划分子问题的方法:
一种动态规划的每一次主循环都将引发一个与矩阵 乘法运算十分相似的操作,因此算法看上去很像是 重复的矩阵乘法。算法的运行时间为Θ(V3lgV)。 另一种动态规划算法Floyd-Warshall算法,该算法的 运行时间为Θ(V3)。
第八讲:动态规划与最短路径(3)
《算法与算法复杂性》2011年春季 赵颖
第十五章 动态规划
本章主要内容:
动态规划介绍 装配线调度问题 矩阵链相乘问题 动态规划问题关键特征 背包问题(补充) 最长公共子序列 最优二叉查找树
每对顶点间的最短路径(第25章)
2
比较
分治 把问题转化为子问题 本质是递归的 子问题是否重叠 子问题的数目 预处理 运行时间 解决最优化问题 最优子结构 贪心选择 动态规划 贪心
(i, j ) lij
( n 1)
lij
(n)
lij
( n 1)
... (25.3)
8
25.1 自底向上计算最短路径的权值
把矩阵W= (wij)作为输入,来计算一组矩阵L(1), (m) (2) ( n -1) (m) l L ,..., L ,其中对m = 1, 2,..., n - 1,有L = ij 最后矩阵L(n-1) 包含实际的最短路径权值。注意 对所有的顶点i, j∈V, l(1)ij = wij,因此L(1)=W。 算法如下页所示,给定矩阵L(m-1)和W,返回矩 阵L(m) ,也就是它把已经计算出来的最短路径 延长一条边。
22
25.2 最短路径的结构
23
25.2 最短路径的结构
我们定义一个最短路径估计的递归公式。令dij ( k ) 为从顶点i到顶点j、且满足所有中间顶点皆属于 集合{1,2,...,k}的一条最短路径的权值。当k=0时, 从顶点i到顶点j的路径中,没有编号大于0的中 间顶点;亦即,根本不存在中间顶点。这样的 (k ) 路径至多包含一条边因此 d ij =wij。根据上述讨 论,我们用下式给出一个递归式
19
25.2 Floyd-Warshall算法
本节要介绍另一个动态规划算法,用来解决有 向图G=(V,E)上每对顶点间的最短路径问题。算 法称为Floyd-Warshall算法,运行时间为Θ(V3)。 算法允许存在负值的边,但我们假设没有权值 为负的回路。
20
25.2 最短路径的结构
在Floyd-Warshall算法中,我们利用最短路径结构 中的另一个特征:该算法考虑最短路径上的中间顶 点,其中简单路径p=<v1, v2,..., vl>上的中间顶点是 除了v1和vl 以外p上的任何一个顶点,即任何属于集 合{v2, v3,..., vl-1}的顶点。 Floyd-Warshall算法主要基于以下观察:设G的顶点 为V={1, 2,..., n},对某个k考虑顶点的一个子集{1, 2,..., k}。对任意一对顶点i, j∈V,考虑从i到j且中间 顶点皆属于集合{1, 2,..., k}的所有路径。设p是其中 的一条最小权值路径。Floyd-Warshall算法利用了 路径p与i到j之间的最短路径之间的联系。这一联系 依赖于k是否是路径p的一个中间顶点:
cij aik bkj
k 1
如果对等式25.2做如下的替换
11
25.1 自底向上计算最短路径的权值
l(m-1) → w → l(m) → min → + → 则得到等式矩阵乘法运算:
a, b, c, +, ·
cij aik bkj
k 1 n
因此,如果对过程EXTEND-SHORTESTPATHS进行这样的变换,并用0(表示+)替换∞(表 示min),得到一个直接的Θ(n3)的矩阵乘法过程
21
25.2 最短路径的结构
如果k不是路径p的中间顶点,则p的所有中间顶点皆在 集合{1,2,...,k-1}中。因此从顶点i到顶点j且满足所有中 间顶点皆属于集合{1,2,...,k-1}的一条最短路径,也同样 是从i到j且满足所有中间顶点皆属于集合{1,2,...k}的一条 最短路径。 如果k是路径p的中间顶点,那么可将p分解为 p1 p2 i k j 。由引理24.1可知,p1是从i到k的一条 最短路径,且其所有中间顶点均属于集合{1,2,...,k}。因 为顶点k不是路径p1上的一个中间顶点,所以p1是从i到k 的一条最短路径,且其所有中间顶点皆属于集合 {1,2,...,k-1}。类似的, p2以是从k到j的一条最短路径, 且其所有中间顶点皆属于集合{1,2,...,k-1}
下图显示了一个图,以及由过程SLOW-ALLPAIRS-SHORTEST-PATHS计算出的矩阵L(m)
15
25.1 自底向上计算最短路径的权值
16
25.1 改进运行时间
我们的目标并不是计算出全部的L(m)矩阵,我们 仅仅需要矩阵L(n-1)。 等式25.3蕴含着对所有整数m≥n-1,有L(m) = L(n-1)。如同传统的矩阵乘法满足结合律,由 EXTEND-SHORTEST-PATHS定义的矩阵乘法 也是一样。因此,通过计算下列矩阵序列,只 需计算⌈lg(n - 1)⌉个矩阵乘积就能计算出L(n-1)
=
= =
W,
W2, W3,
L(n-1)
=
L(n-2) ·W
=Βιβλιοθήκη Baidu
Wn-1.
与前面的论证一样,矩阵L(n-1) = Wn-1包含最短路 径的权值。下面的过程在Θ(n4)时间内计算该序列。
14
25.1 自底向上计算最短路径的权值
SLOW-ALL-PAIRS-SHORTEST-PATHS(W) 1 n ← rows[W] 2 L(1) ← W 3 for m ← 2 to n - 1 4 do L(m) ← EXTEND-SHORTEST-PATHS(L(m-1), W) 5 return L(n-1)
d ij
(k )
wij ( k 1) ( k 1) ( k 1) min d , d d ij ik kj
如果k 0 如果k 1
含m-1条边),以及从i到j的最多包含m条边的路径的 最小权值(通过计算j的所有可能前趋k而得到的), 然后取二者中的最小值作为 l(m) ij 因此我们递归定义
lij ( m) min lij ( m1) , min lik ( m1) wkj min lik ( m1) wkj (25.2)
L(1) = W,
L(2)
L(4) L(8)
=
= =
W2
W4 W8
lg( n1) 2
=
= =
2 lg( n1) 1
W ·W,
W2 ·W2 W4 ·W4,
L
2
lg( n1)
W
⋮
W
W
2
lg( n1) 1
17
25.1 改进运行时间
9
25.1 自底向上计算最短路径的权值
EXTEND-SHORTEST-PATHS(L, W) 1 n ← rows[L] 2 let be an n × n matrix 3 for i ← 1 to n 4 do for j ← to n 5 do lij ' 6 for k ← 1 to n 7 do lij ' min lij ' , lik wkj 8 return L′
5
25.1 最短路径的结构
假设图以邻接矩阵W=(wij)来表示 考察从顶点i到顶点j的一条最短路径p,假设p至多 包含m条边。假设途中不存在权值为负的回路,则 m必是有限值。
如果i=j,则路径p权值为0而且没有边。 p' k , j 若顶点i和顶点j是不同顶点,则把路径p分解为i 其中路径p'至多包含m-1条边。由引理24.1,p'是从i到k 的一条最短路径,因而δ(i, j) = δ(i, k) + wkj
10
25.1 自底向上计算最短路径的权值
该过程计算出矩阵L'=(lij ' )作为返回值。对所有 的i和j计算等式25.2,用L代表L(m-1),用L'代表 L(m)算,来计算这个返回值。由于算法中存在三 个嵌套的for循环,因此运行时间为Θ(n3)。 算法和矩阵乘法运算的关系:假定我们希望计 算两个n×n的矩阵A和B的矩阵乘积C = A· B。 于是对i,j=1,2,...,n ,计算 n
12
25.1 自底向上计算最短路径的权值
MATRIX-MULTIPLY(A, B) 1 n ← rows[A] 2 let C be an n × n matrix 3 for i ← 1 to n 4 do for j ← 1 to n 5 do cij ← 0 6 for k ← 1 to n 7 do cij ← cij + aik ·bkj 8 return C
7
25.1 每对顶点间最短路径问题的一 个递归解
实际的最短路径权值:如果图中不包含权值为 负的回路,那么对于所有的顶点对i和j,当δ(i, j) < ∞时,存在一条从i到j的最短路径,它是简单 路径,从而至多包含n-1条边。从顶点i到顶点j 的多于n-1条边的路径其权值不可能小于从i到j 的最短路径的权值。因此,实际的最短路径权 值由下式给出:
13
25.1 自底向上计算最短路径的权值
回到顶点最短路径问题,我们是通过把最短路径 逐边延长,最终计算出最短路径权值的。设A· B 代表过程EXTEND-SHORTEST-PATHS(A, B)返 回的矩阵乘积,我们计算n-1个矩阵的序列:
L(1)
L(2) L(3)
=
= =
L(0) ·W
L(1) ·W L(2) ·W ⋮
18
25.1 改进运行时间
在第4-6行while循环的每一次迭代中,从m=1开始 计算L(2m) = (L(m))2。在每次迭代的最后,m乘以2。 最后一次迭代实际通过对某个n-1≤2m<2n-2计算 L(2m),然后计算出L(n-1) 。根据等式25.3,有L(2m) = L(n-1)。下一次执行第4行中的测试语句时,由于m 已被乘以2,所以m≥n-1,测试失败,过程返回它 计算出的最后一个矩阵。 因为⌈lg(n - 1)⌉个矩阵乘积中的每一个都需要Θ(n3) 时间,因此FASTER-ALL-PAIRS-SHORTESTPATHS的运行时间为Θ(n3lgn)。算法中不包含复 杂数据结构,因此隐含于Θ中的常数很小
6
25.1 每对顶点间最短路径问题的一 个递归解
现在设 l(m)ij 是从顶点i到顶点j的至多包含m条边的 任何路径的权值最小值。
当m=0时,从i到j存在一条不包含边的最短路径当且 仅当i=j。因此 0 若i j
l(0)ij 若 i j (m -1) 对m ≥ 1,先计算 l ij (从i到j的最短路径的权至多包
4
动态规划
设计一个动态程序算法的过程为:
刻划最优解的结构(最优子结构) 递归定义最优解的值(动态规划设计) 按自底向上的方式计算最优解的值(重叠?) 由计算出的结果构造一个最优解(可省略)
用循环填表:
表中的项:子问题的最优解 循环嵌套的层数=表格的维度(子问题分解的维度)+1( 如果做选择时需要) 循环的初始值:平凡子问题之外的最小子问题(需用递归 求解的最小子问题)。 循环增量方向:例如从左上向右下方填表,保证计算某个 子问题最优解时需要的表中的项都已求解。
等于L(n-1) 因为2 下面过程利用重复平方技术计算上述矩阵序列
lg(n 1)
lg( n1)
2 n 1 ,最终乘积 L
FASTER-ALL-PAIRS-SHORTEST-PATHS(W) 1 n ← rows[W] 2 L(1) ← W 3m←1 4 while m < n - 1 5 do L(2m) ← EXTEND-SHORTEST-PATHS(L(m), L(m)) 6 m ← 2m 7 return L(m)
解决子问题的次序
3
25. 最短路径
讨论图上每对顶点间的最短路径问题 可以通过单元最短路径算法运行|V|次来解决每 对顶点间的最短路径问题。 本节介绍两个动态规划算法,用来解决有向图 G=(V,E)(允许负边,不允许负回路)上每对顶 点间的最短路径问题。两种划分子问题的方法:
一种动态规划的每一次主循环都将引发一个与矩阵 乘法运算十分相似的操作,因此算法看上去很像是 重复的矩阵乘法。算法的运行时间为Θ(V3lgV)。 另一种动态规划算法Floyd-Warshall算法,该算法的 运行时间为Θ(V3)。
第八讲:动态规划与最短路径(3)
《算法与算法复杂性》2011年春季 赵颖
第十五章 动态规划
本章主要内容:
动态规划介绍 装配线调度问题 矩阵链相乘问题 动态规划问题关键特征 背包问题(补充) 最长公共子序列 最优二叉查找树
每对顶点间的最短路径(第25章)
2
比较
分治 把问题转化为子问题 本质是递归的 子问题是否重叠 子问题的数目 预处理 运行时间 解决最优化问题 最优子结构 贪心选择 动态规划 贪心
(i, j ) lij
( n 1)
lij
(n)
lij
( n 1)
... (25.3)
8
25.1 自底向上计算最短路径的权值
把矩阵W= (wij)作为输入,来计算一组矩阵L(1), (m) (2) ( n -1) (m) l L ,..., L ,其中对m = 1, 2,..., n - 1,有L = ij 最后矩阵L(n-1) 包含实际的最短路径权值。注意 对所有的顶点i, j∈V, l(1)ij = wij,因此L(1)=W。 算法如下页所示,给定矩阵L(m-1)和W,返回矩 阵L(m) ,也就是它把已经计算出来的最短路径 延长一条边。
22
25.2 最短路径的结构
23
25.2 最短路径的结构
我们定义一个最短路径估计的递归公式。令dij ( k ) 为从顶点i到顶点j、且满足所有中间顶点皆属于 集合{1,2,...,k}的一条最短路径的权值。当k=0时, 从顶点i到顶点j的路径中,没有编号大于0的中 间顶点;亦即,根本不存在中间顶点。这样的 (k ) 路径至多包含一条边因此 d ij =wij。根据上述讨 论,我们用下式给出一个递归式
19
25.2 Floyd-Warshall算法
本节要介绍另一个动态规划算法,用来解决有 向图G=(V,E)上每对顶点间的最短路径问题。算 法称为Floyd-Warshall算法,运行时间为Θ(V3)。 算法允许存在负值的边,但我们假设没有权值 为负的回路。
20
25.2 最短路径的结构
在Floyd-Warshall算法中,我们利用最短路径结构 中的另一个特征:该算法考虑最短路径上的中间顶 点,其中简单路径p=<v1, v2,..., vl>上的中间顶点是 除了v1和vl 以外p上的任何一个顶点,即任何属于集 合{v2, v3,..., vl-1}的顶点。 Floyd-Warshall算法主要基于以下观察:设G的顶点 为V={1, 2,..., n},对某个k考虑顶点的一个子集{1, 2,..., k}。对任意一对顶点i, j∈V,考虑从i到j且中间 顶点皆属于集合{1, 2,..., k}的所有路径。设p是其中 的一条最小权值路径。Floyd-Warshall算法利用了 路径p与i到j之间的最短路径之间的联系。这一联系 依赖于k是否是路径p的一个中间顶点:
cij aik bkj
k 1
如果对等式25.2做如下的替换
11
25.1 自底向上计算最短路径的权值
l(m-1) → w → l(m) → min → + → 则得到等式矩阵乘法运算:
a, b, c, +, ·
cij aik bkj
k 1 n
因此,如果对过程EXTEND-SHORTESTPATHS进行这样的变换,并用0(表示+)替换∞(表 示min),得到一个直接的Θ(n3)的矩阵乘法过程
21
25.2 最短路径的结构
如果k不是路径p的中间顶点,则p的所有中间顶点皆在 集合{1,2,...,k-1}中。因此从顶点i到顶点j且满足所有中 间顶点皆属于集合{1,2,...,k-1}的一条最短路径,也同样 是从i到j且满足所有中间顶点皆属于集合{1,2,...k}的一条 最短路径。 如果k是路径p的中间顶点,那么可将p分解为 p1 p2 i k j 。由引理24.1可知,p1是从i到k的一条 最短路径,且其所有中间顶点均属于集合{1,2,...,k}。因 为顶点k不是路径p1上的一个中间顶点,所以p1是从i到k 的一条最短路径,且其所有中间顶点皆属于集合 {1,2,...,k-1}。类似的, p2以是从k到j的一条最短路径, 且其所有中间顶点皆属于集合{1,2,...,k-1}
下图显示了一个图,以及由过程SLOW-ALLPAIRS-SHORTEST-PATHS计算出的矩阵L(m)
15
25.1 自底向上计算最短路径的权值
16
25.1 改进运行时间
我们的目标并不是计算出全部的L(m)矩阵,我们 仅仅需要矩阵L(n-1)。 等式25.3蕴含着对所有整数m≥n-1,有L(m) = L(n-1)。如同传统的矩阵乘法满足结合律,由 EXTEND-SHORTEST-PATHS定义的矩阵乘法 也是一样。因此,通过计算下列矩阵序列,只 需计算⌈lg(n - 1)⌉个矩阵乘积就能计算出L(n-1)
=
= =
W,
W2, W3,
L(n-1)
=
L(n-2) ·W
=Βιβλιοθήκη Baidu
Wn-1.
与前面的论证一样,矩阵L(n-1) = Wn-1包含最短路 径的权值。下面的过程在Θ(n4)时间内计算该序列。
14
25.1 自底向上计算最短路径的权值
SLOW-ALL-PAIRS-SHORTEST-PATHS(W) 1 n ← rows[W] 2 L(1) ← W 3 for m ← 2 to n - 1 4 do L(m) ← EXTEND-SHORTEST-PATHS(L(m-1), W) 5 return L(n-1)
d ij
(k )
wij ( k 1) ( k 1) ( k 1) min d , d d ij ik kj
如果k 0 如果k 1
含m-1条边),以及从i到j的最多包含m条边的路径的 最小权值(通过计算j的所有可能前趋k而得到的), 然后取二者中的最小值作为 l(m) ij 因此我们递归定义
lij ( m) min lij ( m1) , min lik ( m1) wkj min lik ( m1) wkj (25.2)
L(1) = W,
L(2)
L(4) L(8)
=
= =
W2
W4 W8
lg( n1) 2
=
= =
2 lg( n1) 1
W ·W,
W2 ·W2 W4 ·W4,
L
2
lg( n1)
W
⋮
W
W
2
lg( n1) 1
17
25.1 改进运行时间
9
25.1 自底向上计算最短路径的权值
EXTEND-SHORTEST-PATHS(L, W) 1 n ← rows[L] 2 let be an n × n matrix 3 for i ← 1 to n 4 do for j ← to n 5 do lij ' 6 for k ← 1 to n 7 do lij ' min lij ' , lik wkj 8 return L′
5
25.1 最短路径的结构
假设图以邻接矩阵W=(wij)来表示 考察从顶点i到顶点j的一条最短路径p,假设p至多 包含m条边。假设途中不存在权值为负的回路,则 m必是有限值。
如果i=j,则路径p权值为0而且没有边。 p' k , j 若顶点i和顶点j是不同顶点,则把路径p分解为i 其中路径p'至多包含m-1条边。由引理24.1,p'是从i到k 的一条最短路径,因而δ(i, j) = δ(i, k) + wkj
10
25.1 自底向上计算最短路径的权值
该过程计算出矩阵L'=(lij ' )作为返回值。对所有 的i和j计算等式25.2,用L代表L(m-1),用L'代表 L(m)算,来计算这个返回值。由于算法中存在三 个嵌套的for循环,因此运行时间为Θ(n3)。 算法和矩阵乘法运算的关系:假定我们希望计 算两个n×n的矩阵A和B的矩阵乘积C = A· B。 于是对i,j=1,2,...,n ,计算 n
12
25.1 自底向上计算最短路径的权值
MATRIX-MULTIPLY(A, B) 1 n ← rows[A] 2 let C be an n × n matrix 3 for i ← 1 to n 4 do for j ← 1 to n 5 do cij ← 0 6 for k ← 1 to n 7 do cij ← cij + aik ·bkj 8 return C