运筹学第7章图与网络优化.ppt
第七章 图与网络优化,图是最直观的模型,2,图论 Graph Theory,哥尼斯堡七桥问题(Knigsberg Bridge Problem)Leonhard Euler(1707-1783)在1736年发表第一篇图论方面的论文,奠基了图论中的一些基本定理很多问题都可以用点和线来表示,一般点表示实体,线表示实体间的关联,3,7.1 图与网络的基本概念,1 图与网络图节点(Vertex)物理实体、事物、概念一般用 vi 表示边(Edge)节点间的连线,表示有关联一般用 eij 表示图(Graph)节点和边的集合一般用 G(V,E)表示点集 V=v1,v2,vn边集E=eij,网络图(Network)边上具有表示连接强度的权值,如 wij又称加权图(Weighted graph),4,2 无向图与有向图,所有边都没有方向的图称为无向图,如图7.2在无向图中 eij=eji,或(vi,vj)=(vj,vi)当所有边都有方向时,称为有向图,用D(V,A)表示在有向图中,有向边又称为弧,用 aij表示,i,j 的顺序是不能颠倒的,图中弧的方向用箭头标识图中既有边又有弧,称为混合图,3 端点,关联边,相邻,次,图中可以只有点,而没有边;而有边必有点若节点vi,vj 之间有一条边 eij,则称 vi,vj 是 eij 的端点(end vertex),而 eij 是节点 vi,vj 的关联边(incident edge)同一条边的两个端点称为相邻(adjacent)节点,具有共同端点的边称为相邻边一条边的两个端点相同,称为自环(self-loop);具有两个共同端点的两条边称为平行(多重)边(parallel edges)既没有自环也没有平行边的图称为简单图(simple graph)在无向图中,与节点相关联边的数目,称为该节点的“次”(degree),记为 d;次数为奇数的点称为奇点(odd),次数为偶数的点称为偶点(even);图中都是偶点的图称为偶点图(even graph),6,3 端点,关联边,相邻,次,有向图中,由节点向外指的弧的数目称为正次数,记为 d+,指向该节点的弧的数目称为负次数,记为 d次数为 0 的点称为孤立点(isolated vertex),次数为 1 的点称为悬挂点(pendant vertex)定理 1:图中点的次数和是边数个2倍定理 2:图中奇点的个数总是偶数个,7,4 链,圈,初等链,初等圈,简单链(圈)相邻节点的序列 v1,v2,vn 构成一条链(link)p178;在无向图中,节点不重复出现的链称为初等链;首尾相连的链称为圈(loop);首尾相连的初等链称为初等圈;边不重复出现的链(圈)称为简单链(圈),8,5 完全图,偶图简单图中任意两点间都有边相连,则称为完全图。n个点的完全图有n(n-1)/2条边 若图的顶点能分成两个互不相交的非空集合V1、V2,其在同一个集合中任意两点间都没有边相连,则称为偶图(二部图)。若偶图的顶点集合V1、V2之间的每一对不同顶点都有一条边相连,则称为完全偶图。在完全偶图中,若顶点分别为n1、n2,有n1n2条边,9,6 子图,部分图;连通图,成分设有两个图 G1(V1,E1),G2(V2,E2),若V2 V1,E2 E1,则 G2 是 G1 的子图。若V2=V1,E2 E1,则 G2 是 G1 的部分图(支撑子图)。无向图中,若任意两点间至少存在一条链,则称为连通图(connected graph),否则为非连通图(discon-nected graph);非连通图中的每个连通子(分)图称为成分(component)链,圈,路径(简称路),回路都是原图的子图支撑子图也是子图,子图不一定是支撑子图。平面图(planar graph),若在平面上可以画出该图而没有任何边相交,10,7基础图,路,回路,欧拉回路在有向图D(V,A)中去掉箭头,称为D的基础图,G(D)在有向图中,链 路圈 回路走过图中所有边且每条边仅走一次的闭行走称为欧拉回路定理:偶点图一定存在欧拉回路(一笔画定理),11,7.2 树图与最小支撑树,一般研究无向图树图:倒置的树,根(root)在上,树叶(leaf)在下多级辐射制的电信网络、管理的指标体系、家谱、分类学、组织结构等都是典型的树图,12,7.2.1 树的定义及其性质,任两点之间有且只有一条链的图称为树(tree)。无圈的连通图称为树(tree)p180。记为T(V,E)树的性质:p180-181任何树必存在次数为 1 的点具有 n 个节点的树 T 的边恰好为 n1 条,反之,任何有n 个节点,n1 条边的连通图必是一棵树最少边的连通子图,树中必不存在回路,13,7.2.2 支撑树树 T 是连通图 G 的支撑树(spanning tree),若 T 是 G的支撑图且是树图树枝总长最小的支撑树称为最小支撑树。,14,支撑树,连通图 G,最小支撑树?,15,7.2.3 最小支撑树,有n 个乡村,各村间道路的长度是已知的,如何敷设光缆线路使 n 个乡村连通且总长度最短显然,这要求在已知边长的网路图中找最小支撑树 最小支撑树的算法:Kruskal 算法:将图中所有边按权值从小到大排列,依次选所剩最小的边加入边集 T,只要不和前面加入的边构成回路,直到 T 中有 n1 条边,则 T 是最小支撑树,16,Kruskal 算法基于下述定理定理 4.1 指定图中任一点vi,如果 vj 是距 vi 最近的相邻节点,则关联边 eij 必在某个最小支撑树中。推论 4.1 将网路中的节点划分为两个不相交的集合V1和V2,V2=VV1,则V1和V2间权值最小的边必定在某个最小支撑树中。最小支撑树不一定唯一定理 4.1 推论4.1是一个构造性定理,它指示了找最小支撑树的有效算法,17,方法一(Prim 算法):1、根据网路写出边权矩阵,两点间若没有边,则用表示;2、从 v1 开始标记,在第一行打,划去第一列;3、从所有打 的行中找出尚未划掉的最小元素,对该元素画圈,划掉该元素所在列,与该列数对应的行打;4、若所有列都划掉,则已找到最小生成树(所有画圈元素所对应的边);否则,返回第 3 步。该算法中,打 行对应的节点在 V1中,未划去的列在 V2中,18,1,2,2,2,2,3,方法二(避圈法)开始选一条最小权的边,以后每一步中,总从未被选取的边中选一条权最小的边,并使之与已选取的边不构成圈,直到选出n-1条边为止。,Prim算法是多项式算法Prim算法可以求最大生成树网路的边权可以有多种解释,如效率次数受限的最小生成树尚无有效算法,19,方法三(破圈法)任取一个圈,从圈中去掉一条权最大的边。在余下的图 中,重复这个步骤,直到出现一个不含圈的图为止。,1,2,2,2,2,3,3,3,4,4,5,20,斯坦纳树问题,假设我们在北京、上海、西安三城市之间架设电话线,一种办法是分别联通北京-上海和北京-西安。另一种办法是选第四个点,假设郑州。由此分别向三城市架线,可能你不会想到第二种办法所用的电话线只是第一种办法的86.6%,即可取得比第一种办法节约13%的显著经济效益。这就是离散数学界30年代提出的著名的斯坦纳树问题,但一直未能得到证明。,21,1967年大名鼎鼎的贝尔电话公司,遇上了一家精明的用户航空公司,这家用户要求在第四个点的位置上架上电话线。这样使得电话公司不仅要拉新线,增加服务网点,而且要减少收费。这件事的连锁反应迫使电话公司改变了坚持长达10年按照最少发生树长度收费的原则,并且不得不对最短网络问题进行研究。,22,斯坦纳比,贝尔实验室数学中心主任波雷克和研究员吉尔伯特对斯坦纳比问题作了许多研究,根据自己多年研究所得提出如下猜想:对欧氏平面上的任何有限点集,其最小的Steiner树同最小发生树的长度之比(称为Steiner比,即斯坦纳比)不小于3/2。,23,正三角形加点可以节省最多。,24,25,26,27,由于其在运输、通信和计算机等现代经济与科技中的重要作用,近几十年来它的研究进展越来越快。1985年,格拉姆和金芳容借助于计算机进行了大量运算,证明了斯坦纳比大于0.824,虽距0.866不遥远,却始终未能达到最终目标。美国数学会主席曾感叹道:“这问题已经公开了22年,这件事总令你不安,你不能证明这样初级的东西。”也许源于猜想提出的戏剧性背景,也许源于理论意义以及贝尔实验室的学术权威,也许源于数学家对形成初等而又难解问题的爱好,人们对这个问题的研究历久不衰。,斯坦纳比的证明(1),28,斯坦纳比的证明(2),1990年,41岁的堵丁柱因为攻克这一问题而成为世界数学界冒出的奇葩。他与贝尔实验室黄光明研究员合作,找到了一个全新途径,给出了吉尔伯特-波雷克猜想完整的证明。证明的核心是关于鞍点的一个定理。其主要思想是,首先在欧氏平面含n点的集合与2n-3维空间的点之间建立一一对应的关系,使得猜想可以化为2n-3维空间上函数的极值问题。然后利用鞍点定理找出可以达到极值的临界点应满足的必要条件。之后,再将此条件转换为临界点对应的点集上的几何性质。最后,利用这几何性质确定几何结构,验证该猜想。,29,斯坦纳比的证明(3),证明于1990年10月在会议上正式公开,纽约时报立刻做了报道。接着科学杂志、科学新闻新科学论SLAM新闻等报刊上出现了许多报道。值得提及的SLAM新闻在头版上用了个有趣的“在计算机时代欧氏几何的欧氏平面上n点的集合2n-3维空间的点力与运气”。在不列颠百科全书1992年鉴中,该证明进一步被列为入选的6项数学成果的第一项。因此,堵丁柱也荣获了中国科学院自然科学一等奖、国家科技进步二等奖和中国青年科学家奖等殊荣。,30,7.3 最短路问题p185,4.5.1.2 狄克斯特拉算法(Dijkstra algorithm,1959)计算两节点之间或一个节点到所有节点之间的最短路令 dij 表示 vi 到 vj 的直接距离(两点之间有边),若两点之间没有边,则令 dij=;令 dii=0,s 表示始点,t 表示终点0、令始点Ts=0,并用框框住,所有其它节点临时标记 Tj=;1、从 vs 出发,对其相邻节点 vj1 进行临时标记,有 Tj1=ds,j1;2、在所有临时标记中找出最小者,并框住作为永久标记,设其为 vr,加粗该边。若此时全部节点都是永久标记,算法结束;否则到下一步;3、从新的永久标记节点 vr 出发,对其相邻的临时标记节点进行再标记,设 vj2 为其相邻节点,则 Tj2=minTj2,Tr+dr,j2,返回第2步。,31,例1 狄克斯特拉算法,0,8,15,10,12,15,11,31,13,最短路问题的标号过程,Dijkstra算法的基本思想:若vs,v1,vk是从vs到vk的最短路,则vs,v1,vi是从vs到vi的最短路。,T(临时)标号:从vs到某一节点最短距离的上界。,P(永久)标号:从vs到某一节点的最短距离。,33,步骤:,给vs标上永久标号P(vs)=0,其余节点标上临时标号T(vj)=,(1)若节点vi是刚得到P标号的点。把与vi有弧(边)直接相连而且有属于T标号的节点,改为下列T标号,T(vj)=minT(vj),P(vi)+dij,(2)把T标号中标号最小的节点vj0的临时标号T(vj0)改为P(vj0),直至算法终止;否则转(1),例 求节点v1到节点v5的最短距离及其路线,vS,v1,v2,v3,v4,v5,1,2,2,2,3,3,3,4,4,解 P(vs)=0 T(vj)=,j=1,5,第一步:,T(v1)=minT(v1),P(vs)+ds1=min,0+4=4,(1)与节点vs直接相连的临时标号的节点为 v1,v2,将这两个节点的临时标号改为,T(v2)=minT(v2),P(vs)+ds2=min,0+3=3,0,35,(2)在所有T标号中,最小的为T(v2)=3,于是令P(v2)=3,vS,v1,v2,v3,v4,v5,1,2,2,2,3,3,3,4,4,0,4,3,第二步:,(1)与节点v2直接相连的临时标号的节点为V1和v4,把这两个节点的T标号改为,T(v1)=minT(v1),P(v2)+d21=min4,3+2=4,T(v4)=minT(v4),P(v2)+d24=min,3+2=5,(2).在所有T变化中,T(v1)=4最小,于是令P(v1)=4,5,第三步:,(1).与节点v1相连的临时标号的节点为v3,v4,把这两个节点的T标号改为,T(v3)=minT(v3),P(v1)+d13=min,4+3=7,T(v4)=minT(v4),P(v1)+d14=min5,4+1=5,(2).在T标号中,T(v4)=5最小,令P(v4)=5,vS,v1,v2,v3,v4,v5,1,2,2,2,3,3,3,4,4,0,4,5,3,7,第四步:,(1).与节点v4相连的T标号有v3,v5把这两个节点的T标号改为,T(v3)=minT(v3),P(v4)+d43=min7,5+2=7,T(v5)=minT(v5),P(v5)+d45=min,5+4=9,vS,v1,v2,v3,v4,v5,1,2,2,2,3,3,3,4,4,0,4,5,3,7,9,(2).T(v3)最小,P(v3)=7,38,第五步:,(1).与v3相连的临时标号有v5,T(v5)=minT(v5),P(v3)+d35=min9,7+3=9,(2).P(v5)=9,最短路线:,vsv1v4 v5 vsv2v4 v5,vS,v1,v2,v3,v4,v5,1,2,2,2,3,3,3,4,4,0,4,5,3,7,9,39,也可以用表格的形式求解。p190,40,Dijkstra最短路算法的特点和适应范围,一种隐阶段的动态规划方法,而且是正向递推每次迭代只有一个节点获得永久标记,若有两个或两个以上节点的临时标记同时最小,可任选一个永久标记;总是从一个新的永久标记开始新一轮的临时标记,是一种深探法被框住的永久标记 Tj 表示 vs 到 vj 的最短路,因此 要求 dij0,第 k 次迭代得到的永久标记,其最短路中最多有 k 条边,因此最多有n1 次迭代如果只求 vs 到 vt 的最短路,则当 vt 得到永久标记算法就结束了;但算法复杂度是一样的应用 Dijkstra 算法 n1 次,可以求所有点间的最短路vs 到所有点的最短路也是一棵生成树,但不是最小生成树,41,Warshall-Floyd算法(1962),Warshall-Floyd算法可以解决有负权值边(弧)的最短路问题该算法是一种整体算法,一次求出所有点间的最短路该算法不允许有负权值回路,但可以发现负权值回路该算法基于基本的三角运算定义 对给定的点间初始距离矩阵dij,令dii=,i。对一 个固定点 j,运算 dik=mindik,dij+djk,i,k j,称为 三角运算。(注意,这里允许 i=k)定理 依次对 j=1,2,n 执行三角运算,则 dik 最终等于 i 到 k 间最短路的长度。,42,Floyd-Warshall 算法(1962),for i=1 to n do dii=;for all eij=0;for j=1 to n do for i=1 to n do if ij then for k=1 to n do if kj then begin dik=mindik,dij+djk;if dikdij+djk then eik=j end;,若网路中存在负回路,则计算中,某些 dii 会小于0,此时应中断算法显然,Floyd 算法要进行 n(n-1)2 次加法和比较如何回溯找出任两点之间的最短路?在Floyd 算法中设一伴随矩阵E=eik,eik 记录了 i 到 k 最短路中最后一个中间节点,43,小结,最短路有广泛的应用(4.3.4节 市话局扩容方案)最短路的多种形式:无向图,有向图无循环圈,有向图,混合图,无负边权,有负边权,有负回路,k-最短路等当存在负权值边时,Floyd算法比Dijkstra算法效率高,且程序极简单。但Dijkstra算法灵活若图是前向的,则Dijkstra算法也可以求两点间最长路一般情况下,两点间最长路是 NP-complete,但最短路是 P算法两点间k-最短路:分为边不相交的和边相交的 求边不相交的k-最短路非常容易:先求最短路,将该最短路中的边从网路删去,再用Dijkstra算法可求次最短路,以此类推,44,4.5.1.3 最短路应用举例市话扩容(实装率=0.8),45,7.4 网络的最大流和最小截,7.4.1 网络流的概念 p192网络流一般在有向图上讨论D=(V,A,C)定义网络上支路的容量为其最大通过能力,记为 cij,支路上的实际流量记为 fij。当支路上 fij=cij,称为饱和弧图中规定一个发点s,一个收点t;节点没有容量限制,流在节点不会存储集合f=fij|(vi,vj)A 称为该网络D的一个流f,46,7.4 网络的最大流和最小截,7.4.1 网络流的概念 p193集合f=fij|(vi,vj)A 称为该网络D的一个流f容量限制条件:0 fij cij 平衡条件:,满足上述条件的网络流称为可行流,总存在可行流,如0流f=0|(vi,vj)A;v=v(f)称为从s到t的可行流f的流量。最大流问题也是一个线性规划问题,47,最大流问题也是一个线性规划问题p194,48,7.4.1 增广链,当支路上 fij=cij,称为饱和弧当支路上 fij 0,称为非零流弧,49,7.4.1 增广链,链中与 s 到 t 方向一致的弧称为前向弧,反之称为后向弧 前向弧的全体记为 后向弧的全体记为,50,7.4.1 增广链,f为可行流,为s到t的链。若满足下列条件称为增广链。中每一弧是非饱和弧 中每一弧是非零流弧,51,截集与截集容量,定义:截集把网路分割为两个成分的正向弧的集合,其中一 个成分包含 s 点,另一个包含 t 点。(割、割集)一般包含 s 点的成分中的节点集合用S表示,包含 t 点的成 分中的节点集合用S表示截集容量是指截集中正向弧的容量之和,52,定义:最小截集是截集容量最小的截集(最小割),53,54,55,56,定理p195 福特-富克森定理:网路的最大流等于最小截集容量。,57,7.4.2 确定网路最大流的标号法,从任一个初始可行流出发,如 0 流基本算法:找一条从 s 到 t 点的增广链(augmenting path)若在当前可行流下找不到增广链,则已得到最大流增广链中与 s 到 t 方向一致的弧称为前向弧,反之后向弧,增广过程:前向弧 fij=fij+q,后向弧 fij=fij q 增广后仍是可行流,找从 s 到 t 点的增广链,58,最大流最小截的标号法步骤,第一步:标号过程,找一条增广链1、给源点 s 标号s+,q(s)=,表示从 s 点有无限流出潜力2、找出与已标号节点 i 相邻的所有未标号节点 j,若(1)(i,j)是前向弧且饱和,则节点 j 不标号;(2)(i,j)是前向弧且未饱和,则节点 j 标号为i+,q(j),表示从节点 i 正向流出,可增广 q(j)=minq(i),cijfij;(3)(j,i)是后向弧,若 fji=0,则节点 j 不标号;(4)(j,i)是后向弧,若 fji0,则节点 j 标号为i,q(j),表示从节点 j 流向 i,可增广 q(j)=minq(i),fji;3、重复步骤 2,可能出现两种情况:(1)节点 t 尚未标号,但无法继续标记,说明网路中已不存在增广链,当前流 v(f)就是最大流;所有获标号的节点在 V 中,未获标号节点在 V 中,V 与 V 间的弧即为最小截集;算法结束(2)节点 t 获得标号,找到一条增广链,由节点 t 标号回溯可找出该增广链;到第二步,59,最大流最小截的标号法步骤,第二步:增广过程1、对增广链中的前向弧,令 f=f+q(t),q(t)为节点 t 的标记值2、对增广链中的后向弧,令 f=fq(t)3、非增广链上的所有支路流量保持不变第三步:抹除图上所有标号,回到第一步以上算法是按广探法描述的,但在实际图上作业时,按深探法进行更快捷一次只找一条增广链,增广一次换一张图最后一次用广探法,以便找出最小截集,60,最大流最小截集的标号法举例,(s+,),(s+,6),(2,6),(3+,1),(4+,1),(s+,),(s+,5),(2+,2),(5,2),(4+,2),61,最大流最小截集的标号法举例,(s+,),(s+,3),(2,3),最小截集,62,最大流标号法的复杂度讨论,找一条增广链的计算量是容易估计的,不会超过O(n2)但是最多迭代多少次(即增广的次数)就很难估计,在最坏情况下,与边的容量有关;如上图:先增广 s u v t,然后增广 s v u t,每次只能增广 1 个单位,故要增广4000次才能结束克服这种缺点的经验方法:尽量先用段数少的增广链尽量不重复前面出现过的增广链,63,多端网路问题,虚发点,(20,0),(20,0),(20,0),(15,0),虚收点,64,定义 弧的剩余容量,65,66,67,68,69,70,71,72,73,74,75,7.5 最小费用最大流,双权网路:每条弧不但有容量,还有单位流量的通过费用两种解法:一种基于最小费用路径算法;一种基于可行弧集的最大流算法基于最小费用路径算法:总是在当前找到的最小费用的路径上增广流;缺点是每次增广后要改变弧的费用,且出现负权值费用的弧基于可行弧集的最大流算法:从 0 费用弧集开始应用最大流算法,然后根据计算信息提高费用的限界P,使可行弧集增大,再应用最大流算法,直至所有弧都进入可行弧集。这种算法是一种主-对偶规划的解法。使用这种方法的还有运输问题、匹配问题,