QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1970|回复: 0
打印 上一主题 下一主题

常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树

[复制链接]
字体大小: 正常 放大
浅夏110 实名认证       

542

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2020-11-14 17:15
  • 签到天数: 74 天

    [LV.6]常住居民II

    邮箱绑定达人

    群组2019美赛冲刺课程

    群组站长地区赛培训

    群组2019考研数学 桃子老师

    群组2018教师培训(呼伦贝

    群组2019考研数学 站长系列

    跳转到指定楼层
    1#
    发表于 2020-5-21 09:56 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    1 最大流问题的数学描述6 y+ v! t8 t9 L6 M1 m  [# }# @
    1.1 网络中的流 定义) s3 K+ o. ~( U# k9 c; Q/ _
    在以V 为节点集, A 为弧集的有向图G = (V, A) 上定义如下的权函数:
      s6 i* i4 m% ^- J- L+ R% Y" T* m- p) d5 g
    (i) L : A → R 为孤上的权函数,弧 (i, j)∈ A 对应的权 L(i, j) 记为 ,称为孤 (i, j) 的容量下界(lower bound);
    9 j( k. z+ Y5 m+ u2 A5 t. n; D& b
    - A0 i; o$ ]& F; y9 q(ii)U : A → R 为弧上的权函数,弧(i, j)∈ A对应的权U(i, j) 记为 ,称为孤 (i, j) 的容量上界或容量(capacity);
    ' D+ D' t% b* ~5 j0 O5 ]. R- X5 q$ r5 t* G8 L7 D
    (iii) D :V → R 为顶点上的权函数,节点i ∈V 对应的权 D(i) 记为  ,称为顶 点i 的供需量(supply/demand);6 m3 \' J1 [- G6 `2 @" i5 N

    ( x$ b$ x9 h% d/ ~, K! e! v此时所构成的网络称为流网络,可以记为 N = (V, A, L,U,D) 。 由于我们只讨论V, A 为有限集合的情况,所以对于弧上的权函数 L,U 和顶点上的 权函数 D ,可以直接用所有孤上对应的权和顶点上的权组成的有限维向量表示,因此 L,U, D 有时直接称为权向量,或简称权。由于给定有向图G = (V, A) 后,我们总是可 以在它的弧集合和顶点集合上定义各种权函数,所以流网络一般也直接简称为网络。
    ( l& z# Y: {4 V* C8 i+ h4 ~( L' m+ [
    在流网络中,弧(i, j) 的容量下界  和容量上界表示的物理意义分别是:通过该 弧发送某种“物质”时,必须发送的最小数量为 ,而发送的最大数量为 。顶点i ∈V 对应的供需量则表示该顶点从网络外部获得的“物质”数量( > 0时),或从该顶 点发送到网络外部的“物质”数量(< 0 时)。下面我们给出严格定义。- M# |1 }5 U/ h# ^# m

      x1 N* o: D2 ?可行流(feasible flow)% L; e4 p2 j: R

    ; t9 x) p$ Q; B1 n# S, P7 ^+ q" W# I9 Y' M6 a

    & h; G; N6 x+ D& v
    : t3 g3 T- Q- v# ~; D( |可见,当 di > 0时,表示有di 个单位的流量从网络外部流入该顶点,因此顶点i 称 为供应点(supply node)或源(source),有时也形象地称为起始点或发点等;当di < 0 时,表示有|di | 个单位的流量从该顶点流失到网络外部(或说被该顶点吸收),因此顶 点i 称为需求点(demand node)或汇(sink),有时也形象地称为终止点或收点等;当 di = 0时,顶点i 称为转运点(transshipment node)或平衡点、中间点等。此外,根据 (1)可知,对于可行网络,必有
    # |  z  n1 ]* b: ?
    5 O5 f( Y8 s3 }0 f9 z3 _
    - b5 }8 E! {  @7 t; ^8 Y0 Y1 L) h$ ~7 A/ p, I! [! r) y+ @0 O! V
    也就是说,所有节点上的供需量之和为 0 是网络中存在可行流的必要条件
    , ?$ J, [+ P  ]3 b% T/ Z5 e- O: S! S8 F5 @" T
    , V! d/ N8 e- x

    ) ~3 D& d+ @0 _" r  c# g6 k& n, p/ G6 N5 f( u. i
    1.2 最大流问题" A( v0 [/ r1 J& d. N2 I
    考虑如下流网络 N = (V, A,U,D):节点 s 为网络中唯一的源点,t 为唯一的汇点, 而其它节点为转运点。如果网络中存在可行流 f ,此时称流 f 的流量(或流值,flow value)为 (根据(3),它自然也等于 −  ),通常记为v 或v( f ) ,即
    7 P* f+ C+ U) d8 |2 U7 _7 L8 G- p$ \5 ~! J  C- h# l0 q1 p

    / R4 X+ Z" \+ W$ d对这种单源单汇的网络,如果我们并不给定  和  (即流量不给定),则网络一 般记为 N = (s,t,V, A,U) 。最大流问题( maximum flow problem )就是在 N = (s,t,V, A,U) 中找到流值最大的可行流(即最大流)。我们将会看到,最大流问题 的许多算法也可以用来求解流量给定的网络中的可行流。也就是说,当我们解决了最大 流问题以后,对于在流量给定的网络中寻找可行流的问题,通常也就可以解决了。
    + F7 ~! f2 E$ V% ~
    ( ^/ Q- e& n8 b用线性规划描述最大流问题" |0 i5 Y# w1 O# z( ?, A6 r9 X
    因此,用线性规划的方法,最大流问题可以形式地描述如下:2 n. Y3 \% u  n, \3 l

    7 X0 I/ f* U6 V7 H1 D4 R' }3 u( t. T; q6 V7 g) n! M, C
    " y9 ^9 e3 {" n2 w' m
    定义】 如果一个矩阵 A 的任何子方阵的行列式的值都等于0,1或 −1,则称 A 是 全幺模的(totally unimodular TU,又译为全单位模的),或称 A 是全幺模矩阵。1 _4 b. C3 i. X5 U1 Y1 ^+ P
    ' l; R! l- V2 v% r! A
    整流定理) A6 b" {, v/ H5 I1 l  X: x
    【定理 7】(整流定理) 最大流问题所对应的约束矩阵是全幺模矩阵。若所有弧容量 均为正整数,则问题的最优解为整数解。 最大流问题是一个特殊的线性规划问题。我们将会看到利用图的特点,解决这个问 题的方法较之线性规划的一般方法要方便、直观得多。+ I* h4 P4 h# ?! ^* |! e3 a

    5 W. O9 p0 d! ^$ @9 @; {* z, ?1.3 单源和单汇运输网络& _) m6 a& D) f0 G+ h) `2 P
    多源多汇网络 转化成单源单汇网络
    - O$ x3 d4 d( L4 Q, H0 e实际问题往往是多源多汇网络,为了计算的规格化,可将多源多汇网络G 化成单 源单汇网络G' 。设 X 是G 的源,Y 是G 的汇,具体转化方法如下:
    5 W, }  j& Q8 _' ~0 ^0 d) g+ h
    ; I- u! @  x/ U* K5 P(i)在原图G 中增加两个新的顶点 x 和 y ,令为新图G' 中之单源和单汇,则G 中 所有顶点V 成为G' 之中间顶点集。( k; s# t7 f$ F$ e5 P
    1 J. k3 Z( r0 t7 q$ z. U
    (ii)用一条容量为∞的弧把 x 连接到 X 中的每个顶点。
    9 ^( F: [) o1 `# u/ K: S' m3 a- O) U" l1 y
    (iii)用一条容量为∞的弧把Y 中的每个顶点连接到 y 。 G 和G' 中的流以一个简单的方式相互对应。若 f 是G 中的流,则由, ~8 f6 \% }4 \# b" G8 q

    0 [' C9 j% I. m$ D8 O6 K& f. W9 S  n; h0 R  h4 i- n
    . J6 Y: [% u; k$ j1 w  r6 ^
    2 最大流和最小割关系割的容量0 \& {* ?7 M% m* U
    ' ^; S; ^( s/ q! ^" }  h; L

    ) z  W: c# A' e* N, x' d* }0 ]5 d8 M2 z$ W+ H* [  G7 D. n0 q6 n
    则在这条可增广轨上每条前向弧的流都可以增加一个量δ ,而相应的后向弧的流可减 少δ ,这样就可使得网络的流量获得增加,同时可以使每条弧的流量不超过它的容量, 而且保持为正,也不影响其它弧的流量。总之,网络中 f 可增广轨的存在是有意义的, 因为这意味着 f 不是最大流。# {' W( T8 C" [; B3 K. _

    0 X" R1 P' S6 c3 最大流的一种算法—标号法
    9 H3 d, o% j" G+ P; N标号法是由 Ford 和 Fulkerson 在 1957 年提出的。用标号法寻求网络中最大流的基 本思想是寻找可增广轨,使网络的流量得到增加,直到最大为止。即首先给出一个初始 流,这样的流是存在的,例如零流。如果存在关于它的可增广轨,那么调整该轨上每条 弧上的流量,就可以得到新的流。对于新的流,如果仍存在可增广轨,则用同样的方法 使流的值增大,继续这个过程,直到网络中不存在关于新得到流的可增广轨为止,则该 流就是所求的最大流。9 b1 D1 |2 r7 S: h+ u; N( ~
    5 D0 k! w! F8 g; W$ K
    这种方法分为以下两个过程:
    2 N1 N0 H& N6 O  x
    ! ^( U  k8 s; K* q9 uA.标号过程:通过标号过程寻找一条可增广轨。: A; n; j9 z5 F" O/ I+ m

    4 K1 b/ o* o9 e6 s! IB.增流过程:沿着可增广轨增加网络的流量。$ a5 P$ V) |+ t# d4 j

    3 ]: V" p/ k* M+ f) \这两个过程的步骤分述如下。$ A( e. h1 ~  t8 q0 S

    ; ?* j5 ?& J$ F0 U(A)标号过程:: s. Y& g$ r. j1 g/ @# e

    : U' Q9 d8 B# _. T, k( e
    + r8 `  \! u* B3 c  o. H5 P: s5 _9 _* N. S
    (B)增流过程
    ) b/ c! A% T1 x- V# w3 R- r+ P2 z$ G: ]! e0 j
    网络最大流 x 的求解步骤/ t* Y: j7 B' K: }# a1 g
    求网络 N = (s,t,V, A,U) 中的最大流 x 的算法的程序设计具体步骤如下:
    + o* m3 Y5 ?( H( y4 i& a  M- p) i- C# P0 l; `
    对每个节点 j ,其标号包括两部分信息 (pred( j),maxf(j))0 d) S  d4 T* t$ I& ]% p
    . }2 O$ a6 b8 B
    该节点在可能的增广路中的前一个节点 pred( j) ,以及沿该可能的增广路到该节点为止 可以增广的最大流量 maxf( j)。
    ( b& u5 b: Z2 m5 r! L! \
    8 v& D4 T2 _% A* ~% ]8 j" M: c# B$ ]4 p6 Y

    # l. [7 B3 w4 A: s# Q2 M

    并将 j 加入 LIST 中。

    例 17 用 Ford-Fulkerson 算法计算如图 6 网络中的最大流,每条弧上的两个数字分 别表示容量和当前流量。

    ( r  N8 Z" g; G9 t$ g
    % ~8 ?" ~% \# X2 g5 g: X

    : L3 c" ^7 J( d/ G3 [" t- }0 M解 编写程序如下:2 f$ H3 c3 j% k8 i

    . J5 T( `( [* E& U, D- C; Eclc,clear
    2 e  |, I! T6 B9 ?' F9 f3 L7 ju(1,2)=1;u(1,3)=1;u(1,4)=2;u(2,3)=1;u(2,5)=2;
    ( N7 N- t  V" s. a8 Qu(3,5)=1;u(4,3)=3;u(4,5)=3;
    % z: n7 ]  D' p) z* T/ W0 f5 }f(1,2)=1;f(1,3)=0;f(1,4)=1;f(2,3)=0;f(2,5)=1;# C+ K9 G( d1 {4 h: `: Z
    f(3,5)=1;f(4,3)=1;f(4,5)=0;! @# B* D" T2 Q8 J0 }6 X% k
    n=length(u);list=[];maxf(n)=1;
    - u* R4 |4 u% C( ~; ^( Uwhile maxf(n)>0
      _* n- o% u/ V; A' Hmaxf=zeros(1,n);pred=zeros(1,n);
    $ k: t; w4 y, c& E* l' l! |! Llist=1;record=list;maxf(1)=inf;: M9 z9 W. E4 E5 }4 B
    % list是未检查邻接点的标号点,record是已标号点% X  r2 H( m0 g$ j9 V
    while (~isempty(list))&(maxf(n)==0)+ v1 e; u8 `1 B& @" d
        flag=list(1);list(1)=[];" A' o. O. w8 w7 n) M: ?0 I
        label1= find(u(flag,-f(flag,);
    # y3 a2 i4 P. i% H3 A) f" d, p    label1=setdiff(label1,record);
    & U5 P' _. w# P/ M  w0 n    list=union(list,label1);
    , [; K! k( ~7 E' A    pred(label1)=flag;
    1 f" ~5 K5 G' a' [8 j* Y! @8 b1 {+ L' }    maxf(label1)=min(maxf(flag),u(flag,label1)...
    $ D5 n" g& y# Y5 e' h& B+ J    -f(flag,label1));$ w9 }; a0 g7 ]6 F$ k
        record=union(record,label1);
    $ w( _% x' y& _) U: N9 K5 O' U    label2=find(f(:,flag));
    ) \: Z) L5 s' u5 C* C$ s    label2=label2';
    ) `" j1 {1 }2 F* d: ]$ o0 T% q0 c    label2=setdiff(label2,record);
    . m# V! M2 g$ t$ j& }    list=union(list,label2);9 J) Q0 I: \. T- u; L% t5 l
        pred(label2)=-flag;
    ; x. R. X& z$ |/ U9 O    maxf(label2)=min(maxf(flag),f(label2,flag));
    6 N! R! W1 {1 }% n    record=union(record,label2);
    - f; W4 G* A& p- V; ? end& V- B; ]: L. @% A6 B0 l, I) x; B
         if maxf(n)>0
    ! f# e5 p+ }7 g6 ]/ [3 Y        v2=n; v1=pred(v2);* x8 c& ~5 Q2 x2 r8 t
            while v2~=1
    $ T! X7 C  R8 w. M6 o; t  {. k            if v1>0
    / v' C% _* u8 |                f(v1,v2)=f(v1,v2)+maxf(n);/ _; `! H1 W5 K  l3 F% u! [* a7 H
                else
    4 g1 `' x) g2 r$ b& }7 v                v1=abs(v1);8 q/ B/ ]- y0 u: Z; G
                    f(v2,v1)=f(v2,v1)-maxf(n);
    0 F# y; ], N. R# y            end; W' T8 A. J6 R8 E* |
                v2=v1; v1=pred(v2);
    6 y$ _, E. U* k        end- C! V/ O  R% h# t/ z
        end
    8 r' y3 C+ B% t8 F7 _: U( ^7 wend
    4 ^0 i3 a2 U2 y9 of
    - i! d, g, w, ^6 k0 G# u) E例18 现需要将城市 s 的石油通过管道运送到城市t ,中间有4个中转站  v1 ,v2 ,v3 和  v4 ,城市与中转站的连接以及管道的容量如图7所示,求从城市 s 到城市t 的最大流。
    $ C$ \8 U6 J) X+ Y: G) W* R6 d! P9 x! J1 X! Y( ~

    5 v1 m; @4 _' D  A" ~0 G0 A, ~( o  h5 z! h# K

    7 i" I3 G5 \5 j解 使用最大流的数学规划表达式,编写LINGO程序如下:
    + w* ~- V- j: l% _: h0 V. M, J4 E% C2 w, v
    model:
    - i& W1 G. f/ J, H! o- E6 _9 ]1 [sets:
    * a# C% d. A; \. q/ a9 ynodes/s,1,2,3,4,t/;" [! g# l+ E6 x/ @
    arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,f;
    , n- {1 K4 Z" S  xendsets! H/ e- t. U4 z2 t  Y( T: h, _
    data:
    + K1 O  F+ M: C1 Uc=8 7 9 5 2 5 9 6 10;! r0 V1 z, \+ b( w  Z% ~
    enddata: x9 a* c$ e5 Z3 z
    n=@size(nodes); !顶点的个数;
    / l" o0 q3 F- Bmax=flow;% {; m. e) n) J1 q
    @for(nodes(i)|i #ne#1 #and# i #ne# n:2 @4 Q, C& j1 H$ b) P
        @sum(arcs(i,j):f(i,j))=@sum(arcs(j,i):f(j,i)
    5 h/ T% Z+ t' ]9 n! N@sum(arcs(i,j)|i #eq# 1:f(i,j))=flow;
    ! ]5 ]5 L0 [- v+ n@sum(arcs(i,j)|j #eq# n:f(i,j))=flow;5 D) ^4 f# f( A# k
    @for(arcsbnd(0,f,c));
    & q0 s2 ?6 R- Bend
    / Z4 B4 ?' l) {, S) ]2 m+ o& @7 Y0 b* d
    在上面的程序中,采用了稀疏集的编写方法。下面介绍的程序编写方法是利用赋权邻 接矩阵,这样可以不使用稀疏集的编写方法,更便于推广到复杂网络。; t  a2 u" E' _+ a  z$ K4 [4 j

    3 q+ Y9 a9 e: l0 U( z' |7 xmodel:$ _4 a, _0 M0 Q/ V( Y( s: d3 n
    sets:
    # V( g% A2 F* H$ {) ynodes/s,1,2,3,4,t/;
    4 O  b* b- G5 P5 k+ Larcs(nodes,nodes):c,f;
    & E4 w( O, A) E) r2 m  T' Dendsets. f; U5 l/ D, r  L3 ^7 e7 x
    data:+ T7 M3 ?4 o# g: A# _( D
    c=0;- [) y  I% G' W8 Z7 I( _* p
    @text('fdata.txt')=f;$ N# q  X" F2 w" [. O5 Q/ s
    enddata5 a8 S" S/ |$ W
    calc:
    , F, L& r+ i1 o. ?c(1,2)=8;c(1,4)=7;
    8 a) S/ j( x& Ac(2,3)=9;c(2,4)=5;
    2 L' i+ D& m1 {& e& n1 V% ~: ^c(3,4)=2;c(3,6)=5;
    + J! b# M0 C5 b6 xc(4,5)=9;c(5,3)=6;c(5,6)=10;
    ' h) Y0 y( C5 K0 ]; B% l/ hendcalc! F  Z" B' \* X/ R# h/ J
    n=@size(nodes); !顶点的个数;
    : s" Q( s4 x# U; x- w8 Fmax=flow;) K: M# T& B7 g, Z* t
    @for(nodes(i)|i #ne#1 #and# i #ne# n:
    3 l4 \3 }( }7 }6 J    @sum(nodes(j):f(i,j))=@sum(nodes(j):f(j,i)));# L/ N+ x% C8 F- ^& O
    @sum(nodes(i):f(1,i))=flow;& z1 u- t( U6 V* c" V+ Q4 ?
    @sum(nodes(i):f(i,n))=flow;
      c' y* k, d. R8 l@for(arcsbnd(0,f,c));
    " r6 U& p5 c0 Cend  B: v) }( X5 i/ [/ q# Y

    ' F) D! o3 \, e$ |# M6 J, P————————————————
    8 w& m* f9 L6 Y$ Q) A版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ! j3 H& ~$ ]* f6 W5 G" F/ U+ T原文链接:https://blog.csdn.net/qq_29831163/article/details/897863131 O4 W/ F+ U  o' a. U6 T  S5 x

    9 e6 r3 U+ D8 H* X1 S2 w  @
    4 R" g9 R1 g& C3 Q5 L/ j
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-9 21:49 , Processed in 0.326506 second(s), 50 queries .

    回顶部