(六)图与网络2

来源:互联网 发布:淘宝双十一狂欢节 编辑:程序博客网 时间:2024/05/16 12:07

图与网络


匹配问题

基本概念
  1. 定义:若ME(G),eiejM,eiej无公共端点(ij),则称M为图G中的一个对集;M中的一条边的两个端点叫做在对集M中相配;M中的端点称为被M许配;G中每个顶点皆被M许配时,M称为完美对集;G中已无使|M|>|M|的对集M,则M称为最大对集;若G中有一轨,其边交替地在对集M内外出现,则称此轨为M的交错轨,交错轨的起止顶点都未被许配时,此交错轨称为可增广轨。若把可增广轨上在M外的边纳入对集,把M内的边从对集中删除,则被许配的顶点数增加2,对集中的“对儿”增加一个
  2. 定理一:M是图G中的最大对集当且仅当G中无M可增广轨
  3. 定理二:G为二分图,XY是顶点集的划分,G中存在把X 中顶点皆许配的对集的充要条件是:SX ,则|N(S)||S|,其中N(S)S中顶点的邻集
    二分图即二部图
  4. 推论:若Gk(k>0)正则2分图,则G有完美对集
    所谓k次正则图,即每顶点皆k度的图
婚配定理
每个姑娘都结识k(k1)位小伙子,每个小伙子都结识k位姑娘,则每位姑娘都能和她认识的一个小伙子结婚,并且每位小伙子也能和他认识的一个姑娘结婚应用:人员分配问题

n位工作人员分配n项工作,每人适合做其中一件或几件,问能否每人都有一份适合的工作?如果不能,最多几人可以有适合的工作?

本质上是求二分图的最大(完美)对集
匈牙利算法
库恩—曼克莱斯算法

未完待续

Euler图和Hamilton图

基本概念
  1. 经过G的每条边的迹叫做G的Euler迹;闭的Euler迹叫做Euler回路或E回路;含Euler回路的图叫做Euler图。直观地讲,Euler图就是从一顶点出发每边恰通过一次能回到出发点的那种图,即不重复地行遍所有的边再回到出发点
    • G是Euler图的充分必要条件是G连通且每顶点皆偶
    • G是Euler图的充分必要条件是G连通且G=i=1dCi,Ci是圈,E(Ci)E(Cj)=ϕ(ij)
      ,G 中有Euler 迹的充要条件是G 连通且至多有两个奇次点
  2. 包含G的每个顶点的轨叫做Hamilton(哈密顿)轨;闭的Hamilton轨叫做Hamilton圈或H圈;含Hamilton圈的图叫做Hamilton图。直观地讲,Hamilton图就是从一顶点出发每顶点恰通过一次能回到出发点的那种图,即不重复地行遍所有的顶点再回到出发点
Euler回路的Fleur算法

未完待续

应用
  1. 邮递员问题——走完边

    • 中国邮递员问题

      上述中国邮递员问题的数学模型是:在一个赋权连通图上求一个含所有边的回路,且使此回路的权最小。显然,若此连通赋权图是Euler图,则可用Fleury算法求Euler回路,此回路即为所

      对于非Euler图,1973年,Edmonds和Johnson给出下面的解法见96页

    • 多邮递员问题

      邮局有k(k2)位投递员,同时投递信件,全城街道都要投递,完成任务返回邮局,如何分配投递路线,使得完成投递任务的时间最早?我们把这一问题记成kPP。

      未完待续

  2. 旅行商(TSP)问题——走完点

    1. 用图论的术语说,就是在一个赋权完全图中,找出一个有最小权的Hamilton圈。称这种圈为最优圈。与最短路问题及连线问题相反,目前还没有求解旅行商问题的有效算法。所以希望有一个方法以获得相当好(但不一定最优)的解。一个可行的办法是首先求一个Hamilton圈C,然后适当修改C以得到具有较小权的另一个Hamilton圈。修改的方法叫做改良圈算法

    2. 改良圈算法:

      未完待续

    3. 案例

      从北京(Pe)乘飞机到东京(T)、纽约(N)、墨西哥城(M)、伦敦(L)、巴黎(Pa)五城市做旅游,每城市恰去一次再回北京,应如何安排旅游线,使旅程最短?各城市之间的航线距离如下表

      城市 L M N Pa Pe T L 0 56 35 21 51 60 M 56 0 21 57 78 70 N 35 21 0 36 68 68 Pa 21 57 36 0 51 61 Pe 51 78 68 51 0 13 T 60 70 68 61 13 0
    4. 求解:

      function mainclc,clearglobal aa=zeros(6);a(1,2)=56;a(1,3)=35;a(1,4)=21;a(1,5)=51;a(1,6)=60;a(2,3)=21;a(2,4)=57;a(2,5)=78;a(2,6)=70;a(3,4)=36;a(3,5)=68;a(3,6)=68; a(4,5)=51;a(4,6)=61;a(5,6)=13; a=a+a'; L=size(a,1);c1=[5 1:4 6];[circle,long]=modifycircle(c1,L);c2=[5 6 1:4];%改变初始圈,该算法的最后一个顶点不动[circle2,long2]=modifycircle(c2,L);if long2<longlong=long2;circle=circle2;endcircle,long%*******************************************%修改圈的子函数%*******************************************function [circle,long]=modifycircle(c1,L);global aflag=1;while flag>0flag=0;for m=1:L-3for n=m+2:L-1if a(c1(m),c1(n))+a(c1(m+1),c1(n+1))<...a(c1(m),c1(m+1))+a(c1(n),c1(n+1))flag=1;c1(m+1:n)=c1(n:-1:m+1);endendendendlong=a(c1(1),c1(L));for i=1:L-1long=long+a(c1(i),c1(i+1));endcircle=c1;
  3. 旅行商问题的数学表达式

    将旅行商问题写成数学规划的具体形式还需要一定的技巧^见99页^

最大流问题

数学描述
  1. 网络中的流

    定义:在以V 为节点集, A为弧集的有向图G=(V,A)上定义如下的权函数:

    • L:AR为孤上的权函数,弧(i,j)A对应的权L(i,j)记为lij,称为孤(i,j)的容量下界(lower bound
    • L:AR为孤上的权函数,弧(i,j)A对应的权U(i,j)记为uij,称为孤(i,j)的容量上界,或直接称为容量(capacity)
    • D:VR为顶点上的权函数,节点iV对应的权D(i)记为di,称为顶点i的供需量(supply/demand)

    此时所构成的网络称为流网络,可以记为N=(V,A,L,U,D)

    由于给定有向图G=(V,A)后,我们总是可以在它的弧集合和顶点集合上定义各种权函数,所以流网络一般也直接简称为网络

    严格定义:对于流网络N=(V,A,L,U,D),其上的一个流flowf是指从N的弧集AR的一个函数,即对每条弧(i,j)赋予一个实数fij(称为弧(i,j)的流量)。如果流f满足:

    j:(i,j)Afijj:(j,i)Afji=di,iVlijfijuij,(i,j)A(1)

    则称f为可行流(feasible flow)。至少存在一个可行流的流网络称为可行网络(feasible network)。(1)约束即流量守恒条件(也称流量平衡条件),下面的约束称为容量约束。

    • di>0则是源点(Source)
    • di<0则是汇点(Sink)
    • di=0即是平衡点

    对于可行网络,必有

    iVdi=0

    一般来说,我们总是可以把L0的流网络转化为L=0的流网络进行研究。所以,除非特别说明,以后我们总是假设L=0(即容量下界为0)

  2. 最大流问题

    考虑如下流网络N=(V,A,U,D)节点s为网络中唯一的源点,t唯一的汇点,而其它节点为转运点。如果网络中存在可行流f,此时称流f的流量(或流值,flow value)为ds(根据(3),它自然也等于dt ),通常记为vv(f),即

    v=v(f)=ds=dt

    对这种单源单汇的网络,如果我们并不给定流量,则网络一
    般 记为N=(s,t,V,A,U)

    最大流问题(maximum flow problem)就是在
    N=(s,t,V,A,U)中找到流值最大的可行流(即最大流)

    用线性规划的方法,最大流问题可以形式地描述如下:

    maxvs.t.j:(i,j)Afijj:(j,i)Afji=v,v,0,i=si=tts,t0fijuij,(i,j)A

    定义: 如果一个矩阵 A的任何子方阵的行列式的值都等于0,1或−1,则称 A是全幺模的(totally unimodular TU,又译为全单位模的),或称A 是全幺模矩阵

    整流定理:最大流问题所对应的约束矩阵是全幺模矩阵。若所有弧容量均为正整数,则问题的最优解为整数解。

    最大流问题是一个特殊的线性规划问题。我们将会看到利用图的特点,解决这个问题的方法较之线性规划的一般方法要方便、直观得多

  3. 单源和单汇运输网络

    实际问题往往是多源多汇网络,为了计算的规格化,可将多源多汇网络G化成单源单汇网络G。具体转化方法^见102页^

  4. 最大流和最小割关系

    未完待续~

  5. 最大流的一种算法—标号法

    标号法是由Ford和Fulkerson在1957年提出的。用标号法寻求网络中最大流的基本思想是寻找可增广轨,使网络的流量得到增加,直到最大为止。即首先给出一个初始流,这样的流是存在的,例如零流。如果存在关于它的可增广轨,那么调整该轨上每条弧上的流量,就可以得到新的流。对于新的流,如果仍存在可增广轨,则用同样的方法使流的值增大,继续这个过程,直到网络中不存在关于新得到流的可增广轨为止,则该流就是所求的最大流。

    Ford-Fulkerson算法案例

    clc,clearu(1,2)=1;u(1,3)=1;u(1,4)=2;u(2,3)=1;u(2,5)=2;u(3,5)=1;u(4,3)=3;u(4,5)=3;f(1,2)=1;f(1,3)=0;f(1,4)=1;f(2,3)=0;f(2,5)=1;f(3,5)=1;f(4,3)=1;f(4,5)=0;n=length(u);list=[];maxf(n)=1;while maxf(n)>0maxf=zeros(1,n);pred=zeros(1,n);list=1;record=list;maxf(1)=inf;%list是未检查邻接点的标号点,record是已标号点while (~isempty(list))&(maxf(n)==0)flag=list(1);list(1)=[];label1= find(u(flag,:)-f(flag,:));label1=setdiff(label1,record);list=union(list,label1);pred(label1)=flag;maxf(label1)=min(maxf(flag),u(flag,label1)...-f(flag,label1));record=union(record,label1);label2=find(f(:,flag));label2=label2';label2=setdiff(label2,record);list=union(list,label2);pred(label2)=-flag;maxf(label2)=min(maxf(flag),f(label2,flag));record=union(record,label2);endif maxf(n)>0v2=n; v1=pred(v2);while v2~=1if v1>0f(v1,v2)=f(v1,v2)+maxf(n);elsev1=abs(v1);f(v2,v1)=f(v2,v1)-maxf(n);endv2=v1; v1=pred(v2);endendendf

最小费用流及其求法

最小费用流
  1. 上面我们介绍了一个网络上最短路以及最大流的算法,但是还没有考虑到网络上流的费用问题,在许多实际问题中,费用的因素很重要。例如,在运输问题中,人们总是希望在完成运输任务的同时,寻求一个使总的运输费用最小的运输方案。这就是下面要介绍的最小费用流问题

  2. 在运输网络N=(s,t,V,A,U)中,设cij是定义在A上的非负函数,它表示通过弧(i,j)单位流的费用。所谓最小费用流问题就是从发点到收点怎样以最小费用输送一已知量v(f)的总流量

  3. 最小费用流问题可以用如下的线性规划问题描述:

    min(i,j)Acijfijs.t.j:(i,j)Afijj:(j,i)Afji=v(f),v(f),0,i=si=tts,t0fijuij,(i,j)A

    显然,如果v(f) =最大流 v(fmax) ,则本问题就是最小费用最大流问题。如果v(f) >最大流 v(fmax) ,则本问题无解

  4. 求最小费用流的一种方法—迭代法

    这个方法是由 Busacker 和Gowan在1961 年提出的。

    案例:编写了最小费用最大流函数mincostmaxflow,其中调用了利用Floyd算法求最短路的函数floydpath

    function mainexample19clear;clc;global M numc=zeros(6);u=zeros(6);c(1,2)=2;c(1,4)=8;c(2,3)=2;c(2,4)=5;c(3,4)=1;c(3,6)=6;c(4,5)=3;c(5,3)=4;c(5,6)=7;u(1,2)=8;u(1,4)=7;u(2,3)=9;u(2,4)=5;u(3,4)=2;u(3,6)=5;u(4,5)=9;u(5,3)=6;u(5,6)=10;num=size(u,1);M=sum(sum(u))*num^2;[f,val]=mincostmaxflow(u,c)%定义求最短路径函数function path=floydpath(w);global M numw=w+((w==0)-eye(num))*M;p=zeros(num);for k=1:numfor i=1:numfor j=1:numif w(i,j)>w(i,k)+w(k,j)w(i,j)=w(i,k)+w(k,j);p(i,j)=k;endendendendif w(1,num) ==Mpath=[];elsepath=zeros(num);s=1;t=num;m=p(s,t);while ~isempty(m)if m(1)s=[s,m(1)];t=[t,t(1)];t(1)=m(1);m(1)=[];m=[p(s(1),t(1)),m,p(s(end),t(end))];elsepath(s(1),t(1))=1;s(1)=[];m(1)=[];t(1)=[];endendend%定义最小费用最大流函数function [flow,val]=mincostmaxflow(rongliang,cost,flowvalue);%第一个参数:容量矩阵;第二个参数:费用矩阵;%前两个参数必须在不通路处置零%第三个参数:指定容量值(可以不写,表示求最小费用最大流)%返回值flow 为可行流矩阵,val 为最小费用值global Mflow=zeros(size(rongliang));allflow=sum(flow(1,:));if nargin<3flowvalue=M;endwhile allflow<flowvaluew=(flow<rongliang).*cost-((flow>0).*cost)';path=floydpath(w);%调用floydpath 函数if isempty(path)val=sum(sum(flow.*cost));return;endtheta=min(min(path.*(rongliang-flow)+(path.*(rongliang-flow)==0).*M));theta=min([min(path'.*flow+(path'.*flow==0).*M),theta]);flow=flow+(rongliang>0).*(path-path').*theta;allflow=sum(flow(1,:));endval=sum(sum(flow.*cost));

计划评审方法和关键路线法

背景

计划评审方法(program evaluation and review technique, PERT)和关键路线法(critical path method, CPM)是网络分析的重要组成部分,它广泛地用于系统分析和项目管理。计划评审与关键路线方法是在20世纪50年代提出并发展起来的,1956年,美国杜邦公司为了协调企业不同业务部门的系统规划,提出了关键路线法。1958年,美国海军武装部在研制“北极星”导弹计划时,由于导弹的研制系统过于庞大、复杂,为找到一种有效的管理方法,设计了计划评审方法。由于PERT与CPM既有着相同的目标应用,又有很多相同的术语,这两种方法已合并为一种方法,在国外称为PERT/CPM,在国内称为统筹方法(scheduling method)

计划网络图
  1. 定义:称任何消耗时间或资源的行动称为作业。称作业的开始或结束为事件,事件本身不消耗资源

  2. 在计划网络图中通常用圆圈表示事件,用箭线表示工作,1,2,3表示事件, A, B表示作业。由这种方法画出的网络图称为计划网络图

    graph LR1(1)-->|A|2(2)2(2)-->|B|3(3)

    虚工作用虚箭线“……→”表示。它表示工时为零,不消耗任何资源的虚构工作。其作用只是为了正确表示工作的前行后继关系。

    定义:在计划网络图中,称从初始事件到最终事件的由各项工作连贯组成的一条路为路线。具有累计作业时间最长的路线称为关键路线

时间参数
  1. 事件时间参数

  2. 工作的时间参数

  3. 时差

    未完待续~

计划网络图的计算

具体见^114页^

  1. 建立计划网络图
  2. 写出相应的规划问题
  3. 问题求解
  4. 将关键路线看成最长路
关键路线与计划网络的优化

钢管订购与运输

问题描述

要铺设一条 A1A2A15的输送天然气的主管道, 经筛选后可以生产这种主管道钢管的钢厂有S1.S2,,S7。图中粗线表示铁路,单细线表示公路,双细线表示要铺设的管道。具体参数参见120页

(1)请制定一个主管道钢管的订购和运输计划,使总费用最小(给出总费用)。
(2)请就(1)的模型分析:哪个钢厂钢管的销价的变化对购运计划和总费用影响最大,哪个钢厂钢管的产量的上限的变化对购运计划和总费用的影响最大,并给出相应的数字结果。
(3)如果要铺设的管道不是一条线,而是一个树形图,铁路、公路和管道构成网络,请就这种更一般的情形给出一种解决办法,并按(1)的要求给出模型和结果。

  1. 符号规范:

    记第i个钢厂的最大供应量为si,从第i个钢厂到铺设节点j的订购和运输费用为cij;用lj表示管道第j段需要铺设的钢管量。xij是从钢厂i运到节点j的钢管量,yj是从节点j向左铺设的钢管量,zj是从节点j向右铺设的钢管量

  2. 运费矩阵的计算模型

    购买单位钢管及从Sii=1,2,,7运送到Ajj=1,2,,15的最小购运费用cij的计算:

    • 计算铁路任意两点间的最小运输费用

      由于铁路运费不是连续的,故不能直接用Floyd算法来计算最小运输费用。但可以用Floyd算法来计算任意两点间的最短铁路距离值,再依据题中的铁路运价表,来计算最小运输费用。这就巧妙的避开铁路运费不是连续的问题

    • 计算公路任意两点间的最小运输费用

    • 计算任意两点间的最小运输费用

      由于可以用铁路、公路交叉运送,所以任意相邻两点间的最小运输费用为铁路、公路两者最小运输费用的最小值

  3. 总费用的数学规划模型

    mini=17j=115cijxij+0.12j=115(zj(zj+1)+yj(yj+1))s.t.j=115xij{0}[500,si]yj+1+zj=ljxij0,zj0,yj0y1=z15=0i=1,2,,7j=1,2,,14i=1,2,,7,j=1,2,,15

  4. lingo程序

    见124页

管道为树形图时的模型

当管道为树形图时,建立与上面类似的非线性规划模型

mini=17j=121cijxij+0.05j=121(jk)E(y2jk+yjk)s.t.500fij=121xijxifi,i17xij=(jk)Eyjk,yjk+ykj=ljk,xij,yjk0i=1,2,,7j=1,2,,21



MATLAB图论工具箱

Matlab图论工具箱的命令见下表

命令名 功能 graphallshortestpaths 求图中所有顶点对之间的最短距离 graphconncomp 找无向图的连通分支,或有向图的强(弱)连通分支 graphisomorphism 确定两个图是否同构,同构返回1,否则返回0 graphisspantree 确定一个图是否是生成树,是返回1,否则返回0 graphmaxflow 计算有向图的最大流 graphminspantree 在图中找最小生成树 graphpred2path 把前驱顶点序列变成路径的顶点序列 graphshortestpath 求图中指定的一对顶点间的最短距离和最短路径 graphtopoorder 执行有向无圈图的拓扑排序 graphtraverse 求从一顶点出发,所能遍历图中的顶点