330 likes | 511 Views
第 5 章 最短路问题 (Shortest Path Problem). 网 络 优 化. Network Optimization http://www.csiam.edu.cn/netopt. 清华大学课号: 70420133. 清华大学数学科学系 谢金星 办公室:理科楼 2206# (电话:62787812) Email:jxie@math.tsinghua.edu.cn http://faculty.math.tsinghua.edu.cn/~jxie/courses/netopt. 最短路问题 的例子和意义. S. T.
E N D
第5章 最短路问题(Shortest Path Problem) 网络优化 Network Optimization http://www.csiam.edu.cn/netopt 清华大学课号:70420133 清华大学数学科学系谢金星 办公室:理科楼2206# (电话:62787812) Email:jxie@math.tsinghua.edu.cn http://faculty.math.tsinghua.edu.cn/~jxie/courses/netopt
最短路问题的例子和意义 S T • 许多实际问题都可以转化为最短路问题 • 其有效算法经常在其它网络优化问题中作为子算法调用
假设费用均非负,则在最优解中 ,即 可以证明:一定存在满足条件 的最优解. 可以只考虑 最短路问题的例子 - 单产品、无能力限制的批量问题 例5.1 (Single-level Uncapacitated Lotsizing) 某工厂生产某种产品用以满足市场需求,且已知在时段t中的市场需求为dt . 在某时段t, 如果开工生产, 则生产开工所需的生产准备费为st , 单件产品的生产费为ct .在某时段t期末, 如果有产品库存, 单件产品的库存费为ht . 假设初始库存为0, 不考虑能力限制, 工厂应如何安排生产, 可以保证按时满足生产, 且使总费用最小? (Wagner – Whitin,1958) 假设在时段t, 产品的生产量为xt , 期末产品的库存为It (I0 =0); 用二进制变量yt表示在时段t工厂是否进行生产准备.
w12 w23 w34 w11 w22 w33 w44 1 3 2 4 5 w24 w13 w14 单产品、无能力限制的批量问题 记wij为第i时段生产量为 时所导致的费用(包括生产准备费、生产费和库存费), 即 其中 网络:从所有节点i到j (> i)连一条弧, 弧上的权为wi,j-1 , 如T=4时:
6 B D 6 5 4 (开始) A 4 F (结束) 7 5 1 C E 3 例5.3 计划评审技术, 即PERT(Project Evaluation & Review Technique), 又称网络计划技术或统筹法) 大型复杂工程项目(Project)往往被分成许多子项目,子项目之间有一定的先后顺序(偏序)要求, 每一子项目需要一定的时间完成. PERT网络的每条弧表示一个子项目,如果以弧长表示每一子项目需要的时间,则最早完工时间对应于网络中的最长路 (关键路线). 工程上所谓的关键路线法(CPM: Critical Path Method)基本上也是计划评审技术的一部分. 项目网络不含圈, 其最长路问题和最短路问题都是可解的.
最短路问题 s t 给定有向网络N,弧(i,j)对应的权又称为弧长(或费用). 对于其中的两个顶点s,t,以s为起点和t为终点的有向路称为s-t有向路,其所经过的所有弧上的权(或弧长、费用)之和称为该有向路的权(或弧长、费用). 所有s-t有向路中权(或弧长、费用)最小的一条称为s-t最短路. 对于有向网络中的一个圈,定义它的权为圈上所有前向弧上的权的和, 减去圈上所有反向弧上的权. 权为正的圈称为正圈; 权为负的圈称为负圈; 权为0的圈称为零圈. 对一个有向圈,它的权就是圈上所有弧上的权的和. 本章的圈一般都是指有向圈, 我们直接将正有向圈简称为“正圈”,负有向圈简称为“负圈”,零有向圈简称为“零圈”, 而“无圈”指的是不存在有向圈.
最短路问题 –两点说明 • 最长路问题可以转化为最短路问题,把弧上的费用反号即可. • 必须指出:目前为止,一切最短路算法都只对不含负有向圈的网络有效. 对于含负有向圈的网络,最短路问题是NP困难的. • 因此,本章中除非特别说明,一律假定网络不包含负有向圈. 无向网络上的最短路问题一般可以转化为有向网络上的问题. • 如果所有弧上的权全为非负(或非正)数,只需将无向图的一条边代之以两条对称的有向弧即可. • 如果弧上的权有负有正,一般来说问题要复杂得多。
最短路问题的数学描述 xij表示弧(i,j)是否位于s-t路上:当xij =1时,表示弧(i,j)位于s-t路上,当xij =0时,表示弧(i,j)不在s-t路上. 思考:为什么xij 可以不限定为{0,1}? 关联矩阵是全么模矩阵,因此0-1变量可以松弛为区间[0,1]中的实数 不含负圈,变量直接松弛为所有非负实数
5.2.1 Bellman方程 对偶问题为 根据互补松弛条件, 当x和u分别为原问题和对偶问题的最优解时:
Bellman方程 当某弧(i,j)位于最短路上时,即变量xij>0时, 一定有 如果u为对偶问题最优解,易知u+c (c为任意实数)仍为最优解. 不妨令 us=0,则u的具体数值就可以唯一确定了. 相当于对节点j赋予的一个实数值uj(通常称为 “标号”),在us=0时表示的正好是节点s到节点j的最短路的长度. Bellman方程(最短路方程、动态规划基本方程 ) 一般情况下直接求解最短路方程是相当困难的.
最短路树(树形图) 6 B D 6 5 4 A 4 F 7 5 1 C E 3 定理5.1 对于只含正有向圈的连通有向网络,从起点s到任一顶点j都存在最短路,它们构成以起点s为根的树形图(称为最短路树(Tree of Shortest Paths)或最短路树形图(Shortest Path Arborescence)),最短路的长度可以由Bellman方程唯一确定. 前一部分实际上是Bellman最优化原理的直接结果; 后一部分中Bellman方程解的唯一性可以用反证法证明(略)
10 1 s 1 2 3 -1 最短路树(树形图) • 如果将定理中的条件“只含正有向圈”改为“不含负有向圈”: • 上述最短路仍然存在; • Bellman方程的解的唯一性可能不成立. 起点s到顶点的最短路长度分别是us=u1=0, u2=10, u3=11 但此时只要u3 =u2+1 11 (us=u1=0)就可以满足Bellman方程. 如 us=u1=0, u2=8, u3=9 等 对于一般的网络,Bellman方程只是最短路长度必须满足的必要条件,而不是充分条件; 对于只含正有向圈(或无圈)的连通有向网络,它才是充要条件.
5.2.2 无圈网络 引理5.1 (拓扑排序, Topological Ordering) 设有向图D不含有向圈,则D的顶点总可以重新编号,使得 . 最短路算法 - 如果采用邻接矩阵表示法,可首先计算各节点的入度; 然后找入度为零者编号; 去掉已编号节点及相关弧,同时修改相邻节点入度(只需扫描该去掉的节点的对应行) ; 依次类推。 如果采用邻接表表示法,可首先计算各节点的入度; 然后找入度为零者编号; 去掉已编号节点及相关弧,同时修改相邻节点入度(只需扫描该去掉的节点的出弧); 依次类推。 该算法自然可以用来判断有向图是否无圈图.
最短路算法 - 5.2.2 无圈网络 当采用递推计算求解上述方程时, 每个顶点和每条弧均被考虑一次 . 当网络是无圈时,这一最短路算法的复杂度为 这是求解最短路问题可能达到的最小的复杂度, 因为任何算法都至少必须对每条弧考虑一次
E 2 E -2 -2 1 1 5 5 A D 1 4 -1 3 3 -1 4 -1 4 1 1 B C 3 5 计算过程: =0, =min{0+1}=1, =min{0+(-1)}=-1, =min{0+5,1+(-2),-1+3}=-1, =min{-1+1, -1+4}=0. E -2 1 A D -1 1 B C 最短路算法 –例 例5.4 计算如下网络(图5.4 (a))中从节点A到所有其它节点的最短路.
5.2.3 正费用网络(Dijkstra,1959) 最短路算法 - 基本思想:对于V 中每一个顶点j,赋予两个数值(通常称为“标号”): 一个是距离标号uj,记录的是从起点到该顶点的最短路长度的上界; 另一个是前趋标号pred(j),记录的是当起点s到该顶点j 的一条路长取到该上界时,该条路中顶点j 前面的那个直接前趋(节点). 算法通过不断修改这些标号,进行迭代计算. 当算法结束时,距离标号表示的是从起点到该顶点的最短路长度. 迭代进行计算的过程中,所有顶点实际上被分成了两类: 一类是离起点 s 较近的顶点,它们的距离标号表示的是从点s到该顶点的最短路长度,因此其标号不会在以后的迭代中再被改变(称为永久标号); 一类是离起点 s 较远的顶点,它们的距离标号表示的只是从点到该顶点的最短路长度的上界,因此其标号还可能会在以后的迭代中再被改变(称为临时标号).
STEP0. (初始化) 令S= ,=V, ;对V 中的顶点j(j s)令初始距离标号 . STEP2. 从 中找到距离标号最小的节点i,把它从 删除,加入S. 对于所有从i出发的弧 , 若 ,则令 . 转STEP1. 正费用网络(Dijkstra算法) STEP1. 如果S=V, 则uj为节点s到节点j的最短路路长(最短路可以通过数组pred所记录的信息反向追踪获得), 结束. 否则继续STEP2.
引理5.2 在上述Dijkstra 算法中, (1)对于S中的任一顶点j,其距离标号uj是从起点s到该顶点j 的最短路路长; (2)对于 中的任一顶点j,其距离标号uj是从起点s出发,只经过S中的顶点到达顶点j 的最短路路长. 中具有最小标号的顶点 i 可以移入S中,这不会破坏结论(1). S pred(i) i s pred(j) P2 j P1 对于 中的其它顶点k, 修改标号,不会破坏结论(2). 正费用网络(Dijkstra算法) 归纳法. 算法开始时结论成立. 设直到迭代的第k步,上述结论(1)(2)成立.
该算法的主要计算量在于STEP2循环(最多执行n次),它包括两个过程:节点寻找过程(从 中找到距离标号最小的节点i)和距离修改过程(修改与节点i相邻的节点的距离标号). 对于距离修改过程,注意到一个顶点只有当它与顶点i相邻时,其标号才可能变更,才需要修改标号. 每次循环所需要修改标号的顶点个数最多为 这一过程的整体效应相当于对每条弧进行一次检查,所以该过程的总计算复杂度为O(m). 对于稠密网络,这是求解最短路问题可能达到的最小的复杂度,因为任何算法都至少必须对每条弧考虑一次. 对于稀疏网络,利用各种形式的堆(Heap),其复杂度可以降为 或 等 Dijkstra算法 - 计算复杂性分析 对于节点寻找过程,第一次循环时需要n次比较操作,第二次循环时需要n-1次比较操作,…,依次类推. 因此,节点寻找过程的复杂度为 综上所述,该算法的复杂度为
标号算法(Labeling Algorithm) 标号算法:目的就是在算法结束时将所有临时标号转变为永久标号. 无圈网络的最短路算法,也可以看成是一种标号算法. 标号设定算法(Label-Setting Algorithm) :在通过迭代过程对标号进行逐步修正的过程中,每次迭代将一个顶点从临时标号集合中移入永久标号集合中. 一般只能用来求解无圈网络和正费用网络的最短路问题. 标号修正算法(Label-Correcting Algorithm):每次迭代时并不一定将任何顶点标号从临时标号转变为永久标号,只是对临时标号进行一次修正,所有顶点标号仍然都是临时标号; 只有在所有迭代终止时,所有顶点标号同时转变为永久标号. 标号设定算法可以看成是标号修正算法的特例,因为在算法终止之前,任何永久标号都可以看成是一种特殊的临时标号. 对于一般费用网络的最短路问题采用.
5.3.1 Bellman - Ford算法(Ford,1956) 引理5.3 在(5.11)~(5.13)中, 临时标号 是从起点 s =1到顶点 j 且所经过的弧数不超过 k 条时的最短路路长. 一般费用网络:标号修正算法(逐次逼近法,Successive Approximation) 计算从起点到所有其它顶点的最短路: 相当于迭代法解Bellman方程 归纳法 k=1显然成立. 假设对k成立,下面考虑k+1的情况. • 从起点 s =1到顶点j 且所经过的弧数不超过k+1条时的最短路有两种可能: • 只含有不超过k条弧; • 含有k+1条弧。
如果迭代不收敛,即存在某个节点 j 使得 < ,则说明网络本来就含有负有向圈. • 因此本算法也可以用于判断网络是否含有负有向圈,复杂度为O(mn). Bellman - Ford算法的复杂度 • 对于不含负有向圈的网络,最短路中弧的条数不超过n-1条. • 算法一定在n-1步迭代后收敛 算法的主要工作量是(5.13)式的循环迭代,对给定的 k 和 j ,只需检查节点 j 的所有入弧即可. 所以,对给定的k,正好需要对网络中的每条弧检查一次. 因此,算法的总复杂度为O(mn).
2 2 2 3 2 2 3 5 -4 4 -4 4 1 1 3 3 3 1 5 1 5 Bellman-Ford算法 (例)
5.3.2 一般的标号修正算法 基本思想:逐步逼近,迭代求解最短路方程 STEP0: 令距离标号us=0, 前趋标号pred(s)=0;对所有其它节点j令uj为无穷大. STEP1: 如果对所有的弧(i,j)有uj ui+ wij,则结束, uj就是从起点s到节点j的最短路长,最短路可以通过前趋标号(pred)获得. 否则进行下一步. • 整数权,每次迭代使得一个节点的距离标号至少减少1 • 对每个节点的距离标号的修正次数不超过2nC次 • 总迭代次数不会超过2n2C 次 • 每次迭代都对所有弧进行检查和判断,需要m次操作(不指明具体寻找弧的方法时) 算法的总复杂度为O( mn2C).
Bellman-Ford算法是(一般)标号修正算法的特例 在一般标号修正算法中,可以首先对所有弧给定一个顺序,然后依次检查每条弧(i,j)并且在必要时对uj进行修正(减少);当所有弧均被检查一遍以后,再从第一条弧开始下一遍检查. 经过k遍检查以后,节点j所获得的距离标号uj表示从起点s=1到顶点j 且所经过的弧数不超过k条时的最短路路长. 这正是Bellman-Ford算法
改进的(一般)标号修正算法 基本思想:用链表记录可能满足uj> ui + wij的弧的起点 STEP0: 令LIST={s},距离标号us=0, 前趋标号pred(s)=0;对所有其它节点j令uj为无穷大。 STEP1. 如果LIST= ,则结束, uj 就是从起点s到节点j的最短路长,最短路可以通过前趋标号(pred)回溯获得. 否则进行下一步. STEP2:从LIST中删去一个节点i, 对从i出发的每条弧(i,j)判断是否满足 uj> ui + wij.如果是,则令uj= ui + wij, pred(j)=i, 并令LIST=LIST{j}. 当从i出发的所有弧都检查完以后,转STEP1. 这一算法的总复杂度为
5.3.3 Floyd-Warshall算法(1962) 引理5.4 在(5.14)~(5.16)中, 临时标号 是不通过k,k+1,…,n 节点(i,j 除外)时从节点i到节点j的最短路路长. 计算网络中所有节点之间的最短路: • Bellman-Ford:O(nmn) = O(mn2) • Floyd-Warshall算法基本思想:逐步逼近,迭代求解最短路方程: O(n3) 归纳法 k=1显然成立. 假设对k成立,下面考虑k+1的情况. 从起点i到j 且不通过k+1,…, n 节点的最短路有两种可能: (1)不经过k节点 ; (2)经过k节点 。
如果迭代不收敛,即存在节点 i,j 使得 < ,则说明网络本来就含有负有向圈. • 在某次迭代k发现某个节点i使得 <0, 则说明网络本来就含有负有向圈. Floyd-Warshall算法的复杂度 • 对于不含负有向圈的网络,最短路中弧的条数不超过n-1条. • 算法一定在n步迭代后收敛 算法的主要工作量是(5.16)式的循环迭代(三重循环),算法的总复杂度为O(n3). • 因此本算法也可以用于判断网络是否含有负有向圈,复杂度为O(n3).
STEP0: k=0. 对于所有节点i和j: 令 , , ( ,若节点i和j之间没有弧, 认为 ) . STEP1: k=k+1. 对于所有节点i和j: 若 , 令 , ; 否则令 , . Floyd-Warshall算法的具体实现 由于要记录所有节点之间最短路的信息, 所以这里我们要用一个二维数组P; 可以依据二维数组P, 采用“正向追踪”的方式得到最短路. STEP2:如果k=n, 结束; 否则转STEP1.
4 1 2 -3 -3 6 5 -7 3 10 4 3 6 Floyd-Warshall算法的例
终点 1 2 3 4 Floyd-Warshall算法的例 起点 1 (1,2) (1,3) (1,3), (3,4) 2 (2,1) (2,3) (2,3), (3,4) 3 (3,4),(4,2),(2,1) (3,4),(4,2) (3,4) 4 (4,2),(2,1) (4,2) (4,2)(2,3)
布 置 作 业 目的 掌握最短路的基本算法及复杂性分析 思考 1 ; (不交) 《网络优化》第140-143页 2;13;14;16 内容 内容