QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1978|回复: 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 最大流问题的数学描述
    ( w6 J. ]& p! g) ?( {- ~1.1 网络中的流 定义9 A, o! s5 l' F( t5 u  |
    在以V 为节点集, A 为弧集的有向图G = (V, A) 上定义如下的权函数:
      Q: u  @& S% s8 \! E8 t: C  h2 s9 M0 U$ V
    (i) L : A → R 为孤上的权函数,弧 (i, j)∈ A 对应的权 L(i, j) 记为 ,称为孤 (i, j) 的容量下界(lower bound);* j5 _2 S' K* H! n

    ( w0 A" F+ _3 n( ]$ C(ii)U : A → R 为弧上的权函数,弧(i, j)∈ A对应的权U(i, j) 记为 ,称为孤 (i, j) 的容量上界或容量(capacity);
    . T8 u7 \+ L6 L2 @9 j& {* n  P2 W$ C& K  e; q, s" m2 x
    (iii) D :V → R 为顶点上的权函数,节点i ∈V 对应的权 D(i) 记为  ,称为顶 点i 的供需量(supply/demand);( R1 P- j/ ?5 \) P6 t! A

    5 Y* S/ \5 W/ T此时所构成的网络称为流网络,可以记为 N = (V, A, L,U,D) 。 由于我们只讨论V, A 为有限集合的情况,所以对于弧上的权函数 L,U 和顶点上的 权函数 D ,可以直接用所有孤上对应的权和顶点上的权组成的有限维向量表示,因此 L,U, D 有时直接称为权向量,或简称权。由于给定有向图G = (V, A) 后,我们总是可 以在它的弧集合和顶点集合上定义各种权函数,所以流网络一般也直接简称为网络。
    3 k3 d$ U, `+ \. V( I9 u7 e4 ~/ n4 q# x- A; V$ P. C! }
    在流网络中,弧(i, j) 的容量下界  和容量上界表示的物理意义分别是:通过该 弧发送某种“物质”时,必须发送的最小数量为 ,而发送的最大数量为 。顶点i ∈V 对应的供需量则表示该顶点从网络外部获得的“物质”数量( > 0时),或从该顶 点发送到网络外部的“物质”数量(< 0 时)。下面我们给出严格定义。
    . [& i3 M2 v: D# d9 [9 l+ @( S
    - K2 m/ Y  C4 X4 m$ u" t& M可行流(feasible flow)
    ' }, I( K0 A2 P" x( @: P+ w$ w) E4 s' b( `# ^. d: r

    ; v9 L- T1 {- j( o0 s: K% @' a: h, ^
    5 g) u& V  w0 I  s1 O0 Z
    ) B3 G9 q8 ]& s5 O可见,当 di > 0时,表示有di 个单位的流量从网络外部流入该顶点,因此顶点i 称 为供应点(supply node)或源(source),有时也形象地称为起始点或发点等;当di < 0 时,表示有|di | 个单位的流量从该顶点流失到网络外部(或说被该顶点吸收),因此顶 点i 称为需求点(demand node)或汇(sink),有时也形象地称为终止点或收点等;当 di = 0时,顶点i 称为转运点(transshipment node)或平衡点、中间点等。此外,根据 (1)可知,对于可行网络,必有
    1 g* [# P4 o. t# R: z* z9 z1 V0 f* A" h0 i- i( m2 a* \& Z. Z) b

    / D' J% o' l* ^/ T
    7 R0 p! b; A8 a2 W, L' E  y也就是说,所有节点上的供需量之和为 0 是网络中存在可行流的必要条件
    / m4 k+ S: ~$ Q. D8 p$ Q, L
    3 h* W- A. e4 ?
    / z0 {/ y; Q$ z
    8 ?5 {. u2 R7 {+ v$ U7 d; L" _; Y" L1 F9 R
    1.2 最大流问题
    7 M, o/ F# d! U- M3 g: M; C. }考虑如下流网络 N = (V, A,U,D):节点 s 为网络中唯一的源点,t 为唯一的汇点, 而其它节点为转运点。如果网络中存在可行流 f ,此时称流 f 的流量(或流值,flow value)为 (根据(3),它自然也等于 −  ),通常记为v 或v( f ) ,即
      e/ g! h$ K2 t& t* O
    7 v2 _" V! _* D# D7 g
    1 P: Q) b& {% d& B4 i* I1 U+ j对这种单源单汇的网络,如果我们并不给定  和  (即流量不给定),则网络一 般记为 N = (s,t,V, A,U) 。最大流问题( maximum flow problem )就是在 N = (s,t,V, A,U) 中找到流值最大的可行流(即最大流)。我们将会看到,最大流问题 的许多算法也可以用来求解流量给定的网络中的可行流。也就是说,当我们解决了最大 流问题以后,对于在流量给定的网络中寻找可行流的问题,通常也就可以解决了。
    . z& s# H' w8 j  \* N% U' ~  Z5 D+ o
    用线性规划描述最大流问题  v2 p) |# s8 T  D8 q5 i; Z& e
    因此,用线性规划的方法,最大流问题可以形式地描述如下:
    % W0 d) H* r2 K0 h
    3 c. ]5 w8 `) i  J
    5 G: b& I  s/ Q
    " }' U/ M% E; H定义】 如果一个矩阵 A 的任何子方阵的行列式的值都等于0,1或 −1,则称 A 是 全幺模的(totally unimodular TU,又译为全单位模的),或称 A 是全幺模矩阵。
    & o( |: _& b( n- N
    " o! C, Y- }+ Q整流定理
    + P4 Q4 A. ~. K7 Y/ p2 Z【定理 7】(整流定理) 最大流问题所对应的约束矩阵是全幺模矩阵。若所有弧容量 均为正整数,则问题的最优解为整数解。 最大流问题是一个特殊的线性规划问题。我们将会看到利用图的特点,解决这个问 题的方法较之线性规划的一般方法要方便、直观得多。; @4 p7 a2 E# q, X$ d

    - z6 P# P$ _9 Z+ m0 R# h1.3 单源和单汇运输网络
    % e1 S1 f/ |/ h0 q7 W多源多汇网络 转化成单源单汇网络  y1 c1 `0 F: g9 C/ r
    实际问题往往是多源多汇网络,为了计算的规格化,可将多源多汇网络G 化成单 源单汇网络G' 。设 X 是G 的源,Y 是G 的汇,具体转化方法如下:! T& J: _- U9 {( n  Z3 `

    ! O# y3 G+ d# S! v1 f  j(i)在原图G 中增加两个新的顶点 x 和 y ,令为新图G' 中之单源和单汇,则G 中 所有顶点V 成为G' 之中间顶点集。4 R5 `9 }, j9 M- j6 Z
    ' D* I' g. N7 ~+ J5 N
    (ii)用一条容量为∞的弧把 x 连接到 X 中的每个顶点。! k; a$ s# e  z- W4 Y9 ?1 {$ c
    , M4 `  B: o, G( I
    (iii)用一条容量为∞的弧把Y 中的每个顶点连接到 y 。 G 和G' 中的流以一个简单的方式相互对应。若 f 是G 中的流,则由
    ! u5 s5 w& [& `$ r) l: U; `3 y' n

    2 S2 t6 R7 U/ @4 _7 J* t
    0 M8 x' G8 N4 A2 最大流和最小割关系割的容量
    : X" x/ ^5 s6 T6 L2 k  L( J0 b$ b; _7 M; c' w" n

    8 b, F2 ~. g( L' O
    * V# {; v  z1 O7 W% n' c则在这条可增广轨上每条前向弧的流都可以增加一个量δ ,而相应的后向弧的流可减 少δ ,这样就可使得网络的流量获得增加,同时可以使每条弧的流量不超过它的容量, 而且保持为正,也不影响其它弧的流量。总之,网络中 f 可增广轨的存在是有意义的, 因为这意味着 f 不是最大流。( c2 Y# G0 D9 w+ \, i) ?  n

    ! a  c+ G: r, q% Z5 q, |3 最大流的一种算法—标号法
    $ h; ?  V) ~3 c" F* ]标号法是由 Ford 和 Fulkerson 在 1957 年提出的。用标号法寻求网络中最大流的基 本思想是寻找可增广轨,使网络的流量得到增加,直到最大为止。即首先给出一个初始 流,这样的流是存在的,例如零流。如果存在关于它的可增广轨,那么调整该轨上每条 弧上的流量,就可以得到新的流。对于新的流,如果仍存在可增广轨,则用同样的方法 使流的值增大,继续这个过程,直到网络中不存在关于新得到流的可增广轨为止,则该 流就是所求的最大流。6 A5 Z. F! ~/ O
    , h4 s& {1 b* T) }2 `4 G  x
    这种方法分为以下两个过程:
    4 L7 A  G& `0 d7 X; f, H4 d) t, |! S: S2 H; y1 `. q! g  u! \
    A.标号过程:通过标号过程寻找一条可增广轨。+ k' u9 u9 ~) l3 A

    ( D& m# h7 v. SB.增流过程:沿着可增广轨增加网络的流量。
    1 e7 C  R/ P) m; o9 F) }: x6 ^" \' z" L3 V: {1 g1 d
    这两个过程的步骤分述如下。
    ( m  A- F" V: v, S" K1 A, Y! u3 A8 t2 t0 F9 q7 R7 h
    (A)标号过程:
    ( @3 |# T, _1 M8 ~. p1 u& c1 }* a& m
    0 B0 o& O2 j% a. i0 T  w% Q( `

    6 P6 D/ _( [6 w% R' Q(B)增流过程/ f) M0 E9 n: f( K

    ) K# z  B/ @* C& M* u$ w0 a6 ?网络最大流 x 的求解步骤! D5 [4 c0 g7 M  s( \* ~" a
    求网络 N = (s,t,V, A,U) 中的最大流 x 的算法的程序设计具体步骤如下:
    ! E- ~2 U0 b% m* U) M$ [' P( s/ M% s/ L
    对每个节点 j ,其标号包括两部分信息 (pred( j),maxf(j))
    6 z% Z- ]- ?: ~( y4 E+ s, k# _. l, t5 P4 T
    该节点在可能的增广路中的前一个节点 pred( j) ,以及沿该可能的增广路到该节点为止 可以增广的最大流量 maxf( j)。* q0 I) s' b9 J/ a
    - Z5 Y/ |8 O' I
    3 q8 C) x( k) _4 `

    8 D6 a9 ?; _& k) u

    并将 j 加入 LIST 中。

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

    - q0 X  U) }# Q$ h/ b) c6 \
    2 J, g7 j/ [4 p' a" E! e0 j, I, K
    # i! t3 H" d9 M( Q
    解 编写程序如下:
    . V# P% C2 ?! s+ Z5 T3 V! k: N5 U# `4 v
    clc,clear
    7 \! L+ U7 w8 L. z" Cu(1,2)=1;u(1,3)=1;u(1,4)=2;u(2,3)=1;u(2,5)=2;, X' }' @: Y( d; U) c
    u(3,5)=1;u(4,3)=3;u(4,5)=3;7 i( \! L5 w7 j1 c" ]
    f(1,2)=1;f(1,3)=0;f(1,4)=1;f(2,3)=0;f(2,5)=1;0 I7 f) n. e7 y2 Z
    f(3,5)=1;f(4,3)=1;f(4,5)=0;
    3 }& j& p, n6 |n=length(u);list=[];maxf(n)=1;: T$ P2 b9 M& U; I5 {4 I" B
    while maxf(n)>0
    7 w$ T6 J, O, u, N, T  O0 u0 Imaxf=zeros(1,n);pred=zeros(1,n);
    8 p4 r% N# X/ l. c3 y8 Plist=1;record=list;maxf(1)=inf;8 [0 ~* R5 k( H0 s* h  s
    % list是未检查邻接点的标号点,record是已标号点
    8 a. q; g# i3 Fwhile (~isempty(list))&(maxf(n)==0)
    4 \5 J6 z) {( A* n    flag=list(1);list(1)=[];5 k, s& v- g" V
        label1= find(u(flag,-f(flag,);
    * a5 O) M1 m2 f% o4 o    label1=setdiff(label1,record);
    4 @( \; {0 u. L' F& y9 b    list=union(list,label1);
    9 f; m/ A: H1 n; m7 o    pred(label1)=flag;3 r7 _7 [- v1 S
        maxf(label1)=min(maxf(flag),u(flag,label1)...1 |  I4 w2 x% s2 c; g% H4 C
        -f(flag,label1));
    . H$ M& l' G7 D4 |$ P2 b  u; k! i  m    record=union(record,label1);4 o; n7 @7 A/ l3 e' b
        label2=find(f(:,flag));
    % Q1 U/ p# B8 C! E: i2 [3 m4 P    label2=label2';/ H5 Y7 x# m4 ~& V
        label2=setdiff(label2,record);7 k/ s; {* v8 E2 y) u' N
        list=union(list,label2);: B' y$ B3 l/ R* n  x# ~
        pred(label2)=-flag;# ^4 g3 ~& u5 O- g/ p$ L3 T# U
        maxf(label2)=min(maxf(flag),f(label2,flag));- y. D9 N8 b) s0 ~# n. M
        record=union(record,label2);
    6 c) t; I: `; w$ M* n$ i end
    4 k( }3 Y2 m. G. r; M     if maxf(n)>0
    7 r' x: u8 J; [8 V2 o        v2=n; v1=pred(v2);- F; o7 f+ d7 A$ F- E8 W5 Y( }
            while v2~=1
    ( {/ |7 r+ z( p# A. K            if v1>0
    # |, _- E& M7 H: C4 y                f(v1,v2)=f(v1,v2)+maxf(n);% G6 C* o# u0 z6 E7 I+ W2 \. N2 f
                else
    : b- q( j; l7 T# Y                v1=abs(v1);. {$ r/ _3 |' ]+ ?- p8 ?$ U) Q- g
                    f(v2,v1)=f(v2,v1)-maxf(n);
    9 ^7 \+ R% ]" n4 @" g            end# X6 F0 X; g! U4 |% @
                v2=v1; v1=pred(v2);. T% a- f* }6 F9 `& ^+ L/ a$ w
            end( Z9 z8 |; }) O$ Y
        end' w3 X0 w& N5 s- @. N
    end, w9 G% y4 |5 K" n% c4 Y3 y
    f " T8 `! u9 N0 o( W' i# ]
    例18 现需要将城市 s 的石油通过管道运送到城市t ,中间有4个中转站  v1 ,v2 ,v3 和  v4 ,城市与中转站的连接以及管道的容量如图7所示,求从城市 s 到城市t 的最大流。" y2 X1 r% |9 \' U* r& u
    , j+ W0 O8 W. b  S2 o" w3 {9 F5 P; t8 l

    ( ^8 q, `( A8 B; g' T$ R) N( N- p; N
    * C) K: y$ r# C9 _" s4 R
    8 k+ u; w# t) z  e. w; q3 `$ O解 使用最大流的数学规划表达式,编写LINGO程序如下:
      W) X8 c" N5 N  R9 {8 g2 F' n0 U1 G
    1 b+ ^5 e* i' |0 f6 O- H- x! ~5 k/ lmodel:
    . V* P7 [& k- L$ l, csets:
    ( f' v# m0 u9 Z8 @- y/ ~: d+ qnodes/s,1,2,3,4,t/;8 b" ~# f6 w  f5 ]
    arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,f;# f7 \% }$ e6 B5 s  I
    endsets; \* l- V; U1 `9 H& ~
    data:- }% r5 Q/ H! w
    c=8 7 9 5 2 5 9 6 10;# s1 M# ?3 R4 w3 ?# Q1 u0 G0 h. f
    enddata' l4 Z9 N, _  ^
    n=@size(nodes); !顶点的个数;+ Q5 ?5 l1 P- S1 g6 C7 I
    max=flow;- [# p0 X, p5 Q4 W- n. E' v
    @for(nodes(i)|i #ne#1 #and# i #ne# n:
    1 f, d- |3 R% F6 A    @sum(arcs(i,j):f(i,j))=@sum(arcs(j,i):f(j,i)5 K+ C' t: ~6 \$ T; f
    @sum(arcs(i,j)|i #eq# 1:f(i,j))=flow;
    & G( o/ u, ~2 k2 M0 K@sum(arcs(i,j)|j #eq# n:f(i,j))=flow;
    % I. j! V1 A- t  L@for(arcsbnd(0,f,c));! w) O7 e& o. i* G+ V* h; {: p
    end   c6 i( W8 z+ \1 y( \
    3 ]( x& V3 H: j3 u( Z
    在上面的程序中,采用了稀疏集的编写方法。下面介绍的程序编写方法是利用赋权邻 接矩阵,这样可以不使用稀疏集的编写方法,更便于推广到复杂网络。! m' v' d0 |' w2 ~3 [3 U

    ; `' D0 k* f% vmodel:
    $ p$ g8 K; [) dsets:
    ! g# \$ h5 g( B% Ynodes/s,1,2,3,4,t/;" S# s2 ^+ k) x5 S2 V! [' h/ m
    arcs(nodes,nodes):c,f;2 L: X. {( r3 F
    endsets$ g( Z' k* n9 x. c' c7 u' J
    data:
    8 ?. O" ^8 E; h5 J% vc=0;9 n3 F/ Q! F2 ?$ H9 ]3 `/ ?
    @text('fdata.txt')=f;0 W8 p  j( Y! R( q0 j! J8 E, |
    enddata! w, L5 \+ e7 T9 _; p  L: X: Y, M+ e
    calc:# @4 x7 ?+ x6 w8 h. }  ?
    c(1,2)=8;c(1,4)=7;
    5 ?! x' d: `9 q* |0 ^$ o' vc(2,3)=9;c(2,4)=5;
    * I& w: X* I# o1 tc(3,4)=2;c(3,6)=5;9 A. s; f. ]9 c4 m& E" K  J
    c(4,5)=9;c(5,3)=6;c(5,6)=10;
    7 e1 _8 ]. z$ u( x1 x1 dendcalc
    5 L+ {+ U5 Q* Y6 v- h# k9 r- dn=@size(nodes); !顶点的个数;
    . R4 B" H& Q" B8 Qmax=flow;+ K( v% Z+ S& }+ o# v6 q1 H
    @for(nodes(i)|i #ne#1 #and# i #ne# n:
    ! {% o2 L5 y; o0 U1 K- Z    @sum(nodes(j):f(i,j))=@sum(nodes(j):f(j,i)));6 T& \" y$ I4 n+ [( P  Q
    @sum(nodes(i):f(1,i))=flow;
    : U/ D' g4 {2 O* }9 b. l9 g@sum(nodes(i):f(i,n))=flow;! m: u9 X5 c( m" p
    @for(arcsbnd(0,f,c));0 j9 t9 R* c4 A& z' h* p1 y; [) j) M
    end
    / L1 o& q- M2 Q+ }: b& j0 e# G1 Z
    ( V/ s. U0 q) }& {- e————————————————
    . u- z% ^$ o8 w, Z) \6 r3 M版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; @) V# r+ v( R* `1 B- F
    原文链接:https://blog.csdn.net/qq_29831163/article/details/89786313
      U2 V/ l5 s8 B# B2 g: q$ Q# M9 I8 F- {
    # y+ ^9 n5 P# ]% h* j: G  b
    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-14 22:06 , Processed in 0.433940 second(s), 53 queries .

    回顶部