550 likes | 676 Views
第六章 图与网络分析. § 1.图的基本概念与模型. § 2.树图和图的最小部分树. § 3.最短路问题. § 4.网络的最大流. § 5.最小费用流. §1 .图的基本概念与模型. 一个 图 ( graph ) 是由一些 结点或顶点 ( nodes or vertices ) 以及连接点的 边 ( edges ) 构成。记做 G = { V , E }, 其中 V 是顶点的集合, E 是边的集合。. 给图中的点和边赋以具体的含义和权值,我们称这样的图为 网络图 (赋权图).
E N D
第六章 图与网络分析 § 1.图的基本概念与模型 § 2.树图和图的最小部分树 § 3.最短路问题 § 4.网络的最大流 § 5.最小费用流
§1.图的基本概念与模型 一个图(graph)是由一些结点或顶点( nodesor vertices )以及连接点的边(edges)构成。记做G = {V,E},其中 V 是顶点的集合,E 是边的集合。 给图中的点和边赋以具体的含义和权值,我们称这样的图为网络图(赋权图)
图中的点用v表示,边用e 表示,对每条边可用它所联结的点表示,如图,则有: e1 = [v1 , v1], e2 = [v1 , v2]或e2= [v2 , v1]
端点,关联边,相邻 若边 e 可表示为e= [vi, vj],称 vi和 vj 是边e的端点,同时称边e为点 vi和 vj 的关联边,若点 vi, vj 与同一条边关联,称点 vi和 vj 相邻;若边 ei 与 ej 有公共端点,称边 ei和 ej 相邻; 环,多重边,简单图 如果边 e的两个端点相重,称该边为环,如果两个点之间的边多于一条,称为具有多重边,对无环、无多重边的图称为简单图。
次,奇点,偶点,孤立点 与某个点相关联的边的数目,称为该点的次(或度、线度),记作d(v)。次为奇数的点称为奇点,次为偶数的点称为偶点,次为零的点称为孤立点,次为一的点称为悬挂点,悬挂点所关联的边称为悬挂边。 如图: 奇点为 v5 , v3 偶点为 v1 , v2 , v4 孤立点为 v6 悬挂点为 v5 悬挂边为 e8
链,圈,路,回路,连通图 图中有些点和边的交替序列 μ={v0 , e1 , v1 , e2 , … , ek,vk},若其各边 e1 , e2 , … , ek各不相同,且任意 vi,t-1 , vit (2 ≤ t ≤ k)都相邻,称 μ 为链,如果链中所有的顶点 v0 , v1 , … , vk也不相同,这样的链称为路,起点和终点重合的链称为圈,起点和终点重合的路称为回路,若在一个图中,每一对顶点之间至少存在一条链,称这样的图为连通图,否则称该图为不连通的。
完全图,偶图 一个简单图中若任意两点之间均有边相连,称这样的图为完全图,含有n个顶点的完全图,其边数有 1/2[n(n-1)] 条。 如果图的顶点能分成两个互不相交的非空集合 V1 和V2 , 使在同一集合中任意两个顶点均不相邻,称这样的图为偶图(也称二分图、二部图),如果偶图的顶点集合V1 和V2之间的每一对顶点都有一条边相连,称这样的图为完全偶图,完全偶图中V1 含m个顶点,V2 含有 n个顶点,则其边数共 m · n 条。
图 G1={V1 , E1} 和 G2={V2 , E2},如果有 和 ,称 G1 是 G2 的一个子图,若有 则称 G1 是 G2 的一个部分图(生成子图)。注意部分图也是子图,但子图不一定是部分图。 部分图 子图: 子图,部分图
§2.树图和最小部分树 树图(简称树,记作T(V, E))是简单连通图。(无圈,无重边) 一. 树的性质 性质1. 任何树中必存在次为1 的点。 次为1的点称为悬挂点,与之关联的边称为悬挂边。 性质2. 具有n个顶点的树恰有(n-1)条边。 性质3. 任何具有n 个点、(n - 1)条边连通图是树。 说明: 1. 树中只要任意再加一条边,必出现圈。 2. 树中任意两点之间有且只有一条通路,从树中任意删掉一条边,就不再连通。
推论. 把图的所有点分成 V 和 两个集合,则两集合之间连线的最短边一定包含在最小部分树内。 二. 图的最小部分树 如果 G1 是 G2 的部分图,又是树图,则称 G1 是 G2的部分树(或支撑树)。树图的各条边称为树枝(假定各边均有权重),一般图 G2含有多个部分树,其中树枝总长最小的部分树,称为该图的最小部分树(也称最小支撑树)。 定理1. 图中任一个点 i ,若 j是与 i 相邻点中距离最近的,则边 [ i , j ] 一定包含在该图的最小部分树中。
1. 从图中任选一点 vi ,让 vi∈V ,图中其余点均包含在 中; 2. 从 V与 的连线中找出最小边,这条边一定包含在最小部分树中,不妨设这条边为[vi , vj]将其加粗,标记为最小部分树中的边。 3. 令 V∪vj→V, - vj→ ; 三. 避圈法和破圈法 寻找最小部分树的方法主要有避圈法和破圈法两种。 避圈法步骤: 4. 重复2、3两步,一直到图中所有点均包含在 V 中。
避圈法另一种做法: 1. 在所有各边中找到边权最小的一条,将其作为最小部分树中的第一边;在剩余的边中,仍然找到边权最小的作为最小部分树的第二条边; 2. 在剩余的边中,找到边权最小的边,查看其是否与前面的边形成圈,如果没有,则在最小部分树中添加该边,如果形成了圈,则不再考虑该边; 3. 重复进行第二步,直到找到第 n-1 条边为止。(因为有 n个顶点的树中一定有 n-1 条边)
例:分别用两种避圈法构造下图的最小部分树。 第一种解法: 1. 在点集中任选一点,不妨取 S,令 V={S} 2. 找到和 S相邻的边中,权值最小的 [S , A] 。
3. V={S , A} 4. 重复第2,3步,找到下一个点。
破圈法求解步骤: 1. 从图 N 中任取一回路,去掉这个回路中边权最大的边,得到原图的一个子图 N1。 2. 从剩余的子图中任找一回路,同样去掉回路中边权最大的一条边,得一新的子图; 3. 重复第 2 步,直到图中不再含有回路为止。 用破圈法求解上例: 1. 任意找到一回路,不妨取 DETD,去掉边权最大的边[T , E];
2. 从剩余的子图中任找一回路,同样去掉回路中边权最大的一条边,得一新的子图;依次类推。
破圈法的另一种解法: 1. 从剩余图中找到边权最大的一条边,如果将其删除后图仍然是连通的,则删除此边,否则不再考虑此边; 2. 重复上述步骤,直到剩余边数为n-1 为止。 用此法求解上述问题:
注意: 1. 一个图的最小部分树不唯一,该题中用几种解法得到的结果都是相同的,是特殊情况; 2. 不同解法得到的最小部分树所包含的边虽然可能不相同,但是,每个最小部分树中所有边权的总和一定都是相同的,即都达到了最小。
§3.最短路问题 最短路问题是指从给定的网络图中找出任意两点之间距离最短(权值和最小)的一条路。 某些整数规划和动态规划问题可以归结为求最短路的问题。 如选址问题、管道铺设选线问题、设备更新、投资等问题。 最短路的求法: 1. 从某一点至其它各点之间最短距离的狄克斯屈拉( Dijksrta)算法; 2. 求网络图中任意两点之间的最短距离的矩阵算法。
基本思路:如果 v1→ v2→ v3→ v4 是 v1→ v4的最短路径,则 v1→ v2→ v3一定是 v1→ v3的最短路径。 v2→ v3→ v4一定是 v2→ v4 的最短路径。 一. Dijkstra 算法 Dijkstra 算法假设: 1. 设dij表示图中两相邻点 i与 j的距离,若 i与 j不相邻,令 dij=∞,显然 dii =0。 2. 设 Lsi 表示从 s 点到 i点的最短距离。
求从起始点 s到终止点 t 的最短路径。 Dijkstra 算法步骤: 1. 对起始点s ,因 Lss =0 ,将 0 标注在 s旁的小方框内,表示 s点已标号; 2. 从点 s出发,找出与 s 相邻的点中距离最小的一个,设为r ,将 Lsr = Lss+ dsr 的值标注在 r旁的小方框内,表明点 r也已标号; 3. 从已标号的点出发,找出与这些点相邻的所有未标号点 p ,若有 Lsp =min { Lss+ dsp , Lsr+ drp },则对 p 点标号,并将 Lsp 的值标注在 p 点旁的小方框内; 4. 重复第 3 步,直到t点得到标号为止。
解: (1)从 v1 点出发,对 v1 点标号,将 L11=0 标注在 旁的小方框内,令 v1∈V,其余点属于 ; 例. 求下图中从 v1 到 v7 的最短路。
(2)同 v1 相邻的未标号点有v2 、 v3 , 对v3标号,将 L13 的值标注在 v3 旁的小方框内; 将( v1, v3) 加粗,并令 V∪v3 → V, 。 L1r = min { 0+d12, 0+ d13} =min{5,2}=2= L13
(3)同 v1 , v3 相邻的未标号点有v2 、 v4 、 v6 , 对v2标号,将 L12 的值标注在 v2 旁的小方框内; 将( v1, v2) 加粗,并令 V∪v2 →V, 。 L1p = min { L11+d12, L13+d34, L13+d36} =min{0+5,2+7,2+4}=5= L12
(4)同 v1 , v2,v3 相邻的未标号点有v4 、 v5、 v6 , 对v6标号,将 L16 的值标注在 v6 旁的小方框内;将( v3, v6) 加粗,并令 V∪v6 →V, 。 L1p = min { L12+d25, L12+d24, L13+d34, L13+d36} =min{5+7,5+2,2+7,2+4} =6= L16
(5)同 v1 , v2,v3 ,v6 相邻的未标号点有v4 、 v5、 v7 , 对v4 , v5 同时标号,将 L14 = L15 的值标注在 v4, v5 旁的小方框内;将( v2, v4), ( v6, v5) 加粗,并令V∪v4∪v5→V, 。 L1p = min { L12+d25, L12+d24, L13+d34, L16+d64 , L16+d65 , L16+d67} =min{5+7,5+2,2+7,6+2,6+1,6+6}=7= L14 = L15
(6)同 v1 , v2,v3 , v4, v5,v6 相邻的未标号点只有 v7 , L1p = min { L15+d57, L16+d67} =min{7+3,6+6}=10= L17 对v7标号,将 L17 的值标注在 v7 旁的小方框内;将( v5, v7) 加粗。图中粗线表明从点 v1 到网络中其它各点的最短路,各点旁的数字就是点 v1 到各点的最短距离。
二. 求任意两点间最短距离的矩阵算法 用 Dijkstra算法只能计算从图中某一点到其他点的最短距离,如果要计算各点之间的最短距离就需要对每个点分别计算,而用矩阵算法则可以同时求出所有各点间的最短距离。 例. 利用矩阵算法求上述网络图中各点间的最短距离。 解. 设dij表示图中两相邻点 i与 j的距离,若 i与 j不相邻,令 dij=∞,显然 dii =0。建立距离矩阵:
计算停止的控制: p是图中顶点数。 从上述距离矩阵可以看出从 i 点到j 点的直接距离,但从 i 到 j 的最段距离不一定就是从 i 点直接到j 点。 如上述问题中,从 v1→ v2 的最短距离应该是: min{d11+d12 , d12+d22 , d13+d32 , d14+d42 , d15+d52 , d16+d62 , d17+d72 } 即 min{d1r+dr2}。 因此可以构造一个新的矩阵 D(1) ,令 D(1) 中每一个元素为: dij(1) =min{dir+drj} ,则矩阵 D(1) 给出了网络中任意两点之间直接到达及经由一个中间点时的最短距离。 再构造矩阵 D(2) ,dij(2) =min{dir (1)+drj (1)} 。 依次类推构造矩阵 D(k) ,dij(k) =min{dir (k -1)+drj (k -1)} 。
该例中 k = 3 。 上述 D(2)中的元素给出了各点间的最短距离,但是并没有给出具体是经过了哪些中间点才得到的这个最短距离,如果要知道中间点具体是什么,需要在计算过程中进行记录。 教材160页例5
§4.网络的最大流 一. 网络最大流的有关概念 1. 有向图与容量网络 对图中每条边规定指向的图称为有向图,有向图的边称为弧,记作(vi , vj),表示方向从点 vi 指向点 vj ,有向图是点与弧的集合,记作 D(V, A)。 弧(vi , vj)的最大通过能力,称为该弧的容量,记为c(vi , vj) ,或简记为 cij 。 定义了弧容量的网络称为容量网络。 容量网络通常规定一个发点(源点,记为s)一个收点(汇点,记为t),网络中其余的点称为中间点。 从发点到收点之间允许通过的最大流量称为最大流。 多个收(发)点的网络可以转换为只含一个收(发)点。
2. 流与可行流 称网络上满足下述条件(1)、(2)的流为可行流: (1) 容量限制条件: 对所有弧有 0≤f (vi , vj)≤c (vi , vj) (2) 中间点平衡条件: ∑f (vi , vj) - ∑ f(vj , vi)=0 (i≠s , t) 流是指加在网络各条弧上的一组负载量,对加在弧(vi , vj)上的负载量记作 f (vi , vj) ,或简记作fij ,若网络上所有的 fij =0,这个流称为零流。 以 v( f )表示网络中从 s→t的流量,则 零流是可行流,求最大流就是求v( f )的最大值。
二. 割和流量 弧旁数字为 cij ( fij ) 所有不同的割见教材162页 上图中 KK将网络上的点分割成 V 和 两个集合,并有 s∈V , t ∈ ,称弧的集合 (V, )={(v1 , v3) , (v2 , v4)}是一个割。注意,这里不包含(v3 , v2) 。 割的容量是组成它的集合中各弧容量之和,用c(V, )表示, 割是指将容量网络中的发点和收点分割开,并使s→t的流中断的一组弧的集合。
用 f (V, ) 表示通过割 (V, ) 中所有 V→ 方向弧的流量的总和, f ( , V) 表示通过割 中所有 →V方向弧的流量的总和,则有: 从 s→t的流量等于通过割的从V→ 的流量减去 →V的流量,有: 用 v*( f ) 表示网络中从 s→t的最大流,则有 最大流 v*( f ) 应小于最小割的容量(用 c*(V, )表示) 因此,上例中对大流不会超过14 。
三. 最大流最小割定理 如果在网络的发点和收点之间能找到一条链,在这条链上所有指向为 s→t 的弧(称前向弧,记作μ+),存在f < c (非饱和);所有指向为 t →s 的弧(称后向弧,记为μ-),存在f > 0(非零),这样的链称增广链。 当有增广链存在时,找出 再令
显然,经过计算后f ’ 仍然为可行流,但较原来的可行流 f流量增大了θ 。因此,只有当网络图中找不到增广链时,s→t 流才不可能进一步增大。 定理2. 在网络中 s→t的最大流量等于它的最小割集的容量,即 证明:略(教材163页)
三. 求网络最大流的标号算法 Ford-Fulkerson标号算法,其本质是判断是否存在增广链,并找出增广链。 第一步:首先给发点 s 标号(0 , ε(s))。 第一个数字是使这个点得到标号的前一个点的代号,因 s是发点,因此记为0。 第二个数字 ε(s) 表示从上一个标号到这个标号点的流量的最大允许调整值,s 为发点,不允许调整容量,故 ε(s)=∞。 第二步:列出与已标号点相邻的所有未标号点: 1. 考虑从标号点i出发的弧 (i , j),如果有fij=cij,不给点j标号;若fij<cij ,则对 j 标号,记为(i , ε( j )),其中ε( j ) = min{ε( i ) ,(cij ,fij)}
1. 标号过程中断,t得不到标号,说明该网络中不存在增广链,给定流量即为最大流量。记已标号点集为V,未标号点集为 ,(V , ) 为网络的最小割。 2. 考虑所有指向标号点 i 的弧 (h , i),如果有 fhi=0,对 h 不标号, 若 fhi>0,则对 h点标号,记为(i , ε( h )),其中ε( h ) = min{ε( i ) , fhi)}. 3. 如果某未标号点 k有两个以上相邻的标号点,可按(1) ,(2) 中所述规则分别计算出 ε( k )的值,并取其中的最大的一个标记。 第三步:重复第二步可能出现如下两种结果: 2. t 得到标号,这时可用反向追踪法在网络中找到一条从 s→t的有标号点以及相应的弧连接而成的增长链。
设原图中可行流为 f ,令 第四步:修改流量。 这样得到网络上的一个新的可行流 f ’ 。 第五步:抹掉图上所有标号,重复第一到第四步。 注意:在求解步骤中,第三步起到控制运算停止的作用,而不是第五步。
例:用标号法求下述网络图s →t 的最大流量,并找出该网络图的最小割。 解:(1) 先给 s点标号 (0 , ∞);
(2) 从 s 点出发的弧 (s , v2),因有 fs2<cs2 ,且 ε(v2)=min{ε(s) , (cs2- fs2)}=2 故对 v2点标号(s , 2)。 (s , v1)饱和,不标号。 (3) 弧 (v1 , v2),因有 f12>0,且 ε(v1)=min{ε(v2) , f12)}=2 故对 v1点标号(v2, 2)。 (v2 , v4)饱和,不标号。
(4) 弧 (v1 , v3),因有 f13<c13 ,且 ε(v3)=min{ε(v1) , (c13- f13)}=2 故对 v3点标号(v1, 2)。 (5) 弧 (v4 , v3),因有 f43>0,且 ε(v4)=min{ε(v3) , f43)}=1 故对 v4点标号(v3, 1)。 (v3 , t)饱和,不标号, v2 已标号。
(6) 弧 (v4 , t),因有 f4t<c4t,且 ε(t)=min{ε(v4) , (c4t - f4t)}=1 故对 t点标号(v4, 1)。 (7) 由于收点 t得到标号,用反追踪法找出网络图上的一条增广链。
(8) 修改增广链上各弧的流量: 非增广链上的所有弧流量不变,这样得到网络图上的一个新的可行流。
已标号点集为V={s , v1 , v2 , v3 },未标号点集为 ,(V , ) ={(3 , t) , (2 , 4)}为网络的最小割。 重复上述标号过程,由于对点s 、v1 、v2 、v3 标号后,标号中断,故图中的可行流即为最大流,v*( f )=14
三. 应用举例 见教材
§5.最小费用流 在产销平衡问题中,研究的是使费用最小的物资调运方案;最大流问题中考虑了联结两个点之间的弧的容量限制,但是没考虑流量通过各条弧时发生的费用。 实际物资调运中,既要考虑弧的容量又要考虑调运费用的节省,这就是最小费用流要研究的问题。 在最小费用流问题中,将单位流量通过弧的费用当成距离,则从发点至收点的最小费用也就等价于求最短距离问题。这样最短路问题变成了最小费用流问题的特例。 求最小费用流时,一方面通过增广链来调整流量,另一方面要找出每一步费用最小的增广链。是最大流和最短路问题的综合求解。