QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1678|回复: 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 最大流问题的数学描述" V$ y2 ~- t. X  w" E4 P. B
    1.1 网络中的流 定义9 \2 D* @; S# S
    在以V 为节点集, A 为弧集的有向图G = (V, A) 上定义如下的权函数:5 J% @2 g' M" h# K, z
    6 S; m0 o3 X5 w* A0 ~
    (i) L : A → R 为孤上的权函数,弧 (i, j)∈ A 对应的权 L(i, j) 记为 ,称为孤 (i, j) 的容量下界(lower bound);
    ) k; v1 \, u- i9 V, l- M4 i* K1 ]
    * ~3 x! z& q! M9 C* {(ii)U : A → R 为弧上的权函数,弧(i, j)∈ A对应的权U(i, j) 记为 ,称为孤 (i, j) 的容量上界或容量(capacity);
    3 ~. J& P4 h  c7 T4 ?( m1 j' A: ~5 Z( f
    (iii) D :V → R 为顶点上的权函数,节点i ∈V 对应的权 D(i) 记为  ,称为顶 点i 的供需量(supply/demand);
    ! O+ F. K2 T7 t: ^, Z
    8 f" B0 ?) C& G; _2 _) L6 k% e8 P此时所构成的网络称为流网络,可以记为 N = (V, A, L,U,D) 。 由于我们只讨论V, A 为有限集合的情况,所以对于弧上的权函数 L,U 和顶点上的 权函数 D ,可以直接用所有孤上对应的权和顶点上的权组成的有限维向量表示,因此 L,U, D 有时直接称为权向量,或简称权。由于给定有向图G = (V, A) 后,我们总是可 以在它的弧集合和顶点集合上定义各种权函数,所以流网络一般也直接简称为网络。
    ) l/ D  h9 Z% [& _- @& v
    , F7 w  {! y/ e在流网络中,弧(i, j) 的容量下界  和容量上界表示的物理意义分别是:通过该 弧发送某种“物质”时,必须发送的最小数量为 ,而发送的最大数量为 。顶点i ∈V 对应的供需量则表示该顶点从网络外部获得的“物质”数量( > 0时),或从该顶 点发送到网络外部的“物质”数量(< 0 时)。下面我们给出严格定义。
    ) p: E' @# a! m) k( q% F' h( G6 @" u' M7 t# q6 {
    可行流(feasible flow)
    % C* {, t% f8 W  L$ g$ ?: c* @! ~% s( D/ D# G
    * z( d. U0 g/ |0 n9 ?. {* |9 ?) `

    - u; G$ W" g7 C5 m, |
    0 n% ~8 A6 ?! h8 f) D* i可见,当 di > 0时,表示有di 个单位的流量从网络外部流入该顶点,因此顶点i 称 为供应点(supply node)或源(source),有时也形象地称为起始点或发点等;当di < 0 时,表示有|di | 个单位的流量从该顶点流失到网络外部(或说被该顶点吸收),因此顶 点i 称为需求点(demand node)或汇(sink),有时也形象地称为终止点或收点等;当 di = 0时,顶点i 称为转运点(transshipment node)或平衡点、中间点等。此外,根据 (1)可知,对于可行网络,必有
    . C, c5 q0 n7 J1 l( V8 q4 a$ c: O6 x2 q+ N. g& q4 A

    * L; s: r( c& V3 f3 L+ T3 S
    & ?/ \! t' Y4 D  \0 j  d也就是说,所有节点上的供需量之和为 0 是网络中存在可行流的必要条件4 B! z" V& a# R; u

    ; E4 \& D/ t3 S* p* @* a, |8 v. u/ ?2 I8 E1 O4 n
    0 g; _* o/ T" j4 [" N
    + j% ^, u- i; [
    1.2 最大流问题) r! x( U( [1 C' s0 K( ?. u" F$ H( v
    考虑如下流网络 N = (V, A,U,D):节点 s 为网络中唯一的源点,t 为唯一的汇点, 而其它节点为转运点。如果网络中存在可行流 f ,此时称流 f 的流量(或流值,flow value)为 (根据(3),它自然也等于 −  ),通常记为v 或v( f ) ,即# |- k2 V5 J5 v0 R! a5 @3 i
      |0 K. J: `0 |' Z4 r4 R: [

    4 J. }# {' ~) q对这种单源单汇的网络,如果我们并不给定  和  (即流量不给定),则网络一 般记为 N = (s,t,V, A,U) 。最大流问题( maximum flow problem )就是在 N = (s,t,V, A,U) 中找到流值最大的可行流(即最大流)。我们将会看到,最大流问题 的许多算法也可以用来求解流量给定的网络中的可行流。也就是说,当我们解决了最大 流问题以后,对于在流量给定的网络中寻找可行流的问题,通常也就可以解决了。! Q/ H/ n* ?! i8 N
    , {. y$ ^3 _" l
    用线性规划描述最大流问题5 ?4 r$ {) r( y
    因此,用线性规划的方法,最大流问题可以形式地描述如下:
    : \+ m% e6 b; s: q( A2 k9 w, N7 m$ {7 E/ |7 W6 M/ W
    7 J- R. _  ^" H) h  V8 h' q8 T
    1 X* r" O; F9 [5 W: m3 k
    定义】 如果一个矩阵 A 的任何子方阵的行列式的值都等于0,1或 −1,则称 A 是 全幺模的(totally unimodular TU,又译为全单位模的),或称 A 是全幺模矩阵。
    6 u8 q+ q! O9 ?& `$ _) W  M
    6 j& H7 _* |. q; S% y- w, ?9 D) K& ]整流定理3 a0 b8 f6 `+ P
    【定理 7】(整流定理) 最大流问题所对应的约束矩阵是全幺模矩阵。若所有弧容量 均为正整数,则问题的最优解为整数解。 最大流问题是一个特殊的线性规划问题。我们将会看到利用图的特点,解决这个问 题的方法较之线性规划的一般方法要方便、直观得多。" ]' ]& A8 U, K+ i, t6 j, f7 ~2 X
    9 W! K& n- Q+ G  }! L1 s
    1.3 单源和单汇运输网络
    5 b( ^" \5 q& k: p; @多源多汇网络 转化成单源单汇网络. f4 @: {& z2 n
    实际问题往往是多源多汇网络,为了计算的规格化,可将多源多汇网络G 化成单 源单汇网络G' 。设 X 是G 的源,Y 是G 的汇,具体转化方法如下:
    $ C/ W6 [; f& t  }. H' Z3 i9 [' N* r' i4 A* G
    (i)在原图G 中增加两个新的顶点 x 和 y ,令为新图G' 中之单源和单汇,则G 中 所有顶点V 成为G' 之中间顶点集。6 }/ n6 m2 O" T6 Z$ o% f
    . u: s( x& y) r$ @. c$ a0 f" U6 x
    (ii)用一条容量为∞的弧把 x 连接到 X 中的每个顶点。; P. N" {6 ]" H  Q0 _
    4 _9 L1 c$ m0 ]1 d) |; M
    (iii)用一条容量为∞的弧把Y 中的每个顶点连接到 y 。 G 和G' 中的流以一个简单的方式相互对应。若 f 是G 中的流,则由
    ( U. }  _# I6 }7 D
    : V- f7 f% z# D- _
    ' b- u+ V6 U# @# {* l
    ' ^' r, n+ D7 x! w8 ~6 R2 最大流和最小割关系割的容量
    4 K, l8 u" a; x* l: T6 g, K( v+ c% h

    $ m) I6 H9 B% v5 r3 R3 u' j% u- J5 j* {1 R! v+ f) k$ c& @2 C
    则在这条可增广轨上每条前向弧的流都可以增加一个量δ ,而相应的后向弧的流可减 少δ ,这样就可使得网络的流量获得增加,同时可以使每条弧的流量不超过它的容量, 而且保持为正,也不影响其它弧的流量。总之,网络中 f 可增广轨的存在是有意义的, 因为这意味着 f 不是最大流。
    " E' I6 ^3 q) a" N
    4 K" j! i6 M5 G  O0 m3 最大流的一种算法—标号法7 T& g( C! i6 C2 x2 Z/ `- V9 E
    标号法是由 Ford 和 Fulkerson 在 1957 年提出的。用标号法寻求网络中最大流的基 本思想是寻找可增广轨,使网络的流量得到增加,直到最大为止。即首先给出一个初始 流,这样的流是存在的,例如零流。如果存在关于它的可增广轨,那么调整该轨上每条 弧上的流量,就可以得到新的流。对于新的流,如果仍存在可增广轨,则用同样的方法 使流的值增大,继续这个过程,直到网络中不存在关于新得到流的可增广轨为止,则该 流就是所求的最大流。2 y; U6 Z: X2 y: i" Y1 @
    : t: U. R1 T  t2 s  W, }
    这种方法分为以下两个过程:" O6 j, m7 S$ U  M: l( F

    9 T/ B0 m5 e. ]+ p2 rA.标号过程:通过标号过程寻找一条可增广轨。
    ) c9 C+ ^0 g1 K; M8 S! S
    / w, O; U+ j. }6 U- u1 [& C/ mB.增流过程:沿着可增广轨增加网络的流量。
    4 j7 Y& G! z# A/ ?7 M" h8 W0 Q3 H# S% O/ d3 d$ h
    这两个过程的步骤分述如下。) n$ p& F, B. ~& j# [

    $ X9 L  A% `8 \8 R(A)标号过程:, ^  A- M8 N" p1 R5 r9 v. G- X. K

    * H2 q" x$ C9 V4 V
    % C3 O' ^( ?/ A; }" M* I5 i+ N8 b1 s# A& A
    (B)增流过程
    - F2 J* ^: h; f' I! A
    - \& g" V# Z, H. Q网络最大流 x 的求解步骤" Q2 E) E! X! a# r& h0 u9 L  h
    求网络 N = (s,t,V, A,U) 中的最大流 x 的算法的程序设计具体步骤如下:& f( V, C$ I% I6 I8 P  C) L  K

    , A: b; N* i3 ]& E: u, l对每个节点 j ,其标号包括两部分信息 (pred( j),maxf(j)). a/ J7 m2 }0 H* ]: u6 |
    # ?1 e6 H. c3 d+ m( M
    该节点在可能的增广路中的前一个节点 pred( j) ,以及沿该可能的增广路到该节点为止 可以增广的最大流量 maxf( j)。
    + X" R/ k3 X8 j* s4 ~( _' M4 R* I. j, T6 H1 \4 F5 ^) @# ?
    . b1 ?7 m6 }) y
    ) T7 w. ?5 ]% `7 }

    并将 j 加入 LIST 中。

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

    : x' c" K  B! Z. j( j+ Y
    2 X" c! \3 \- w& L  {: H9 l
    $ B4 G2 a$ h4 c6 W- s2 u" j
    解 编写程序如下:
    " M) w1 N. E5 A" T3 Q+ R2 ?( z. n/ F, f' x) O4 q
    clc,clear
    0 Y& a" _7 {; d. ?/ m* R$ Tu(1,2)=1;u(1,3)=1;u(1,4)=2;u(2,3)=1;u(2,5)=2;
    " ?: Y2 H6 F# B" z9 Z( [5 _% Eu(3,5)=1;u(4,3)=3;u(4,5)=3;5 f2 J. ^( |' ]: x- o
    f(1,2)=1;f(1,3)=0;f(1,4)=1;f(2,3)=0;f(2,5)=1;3 R% I* l, N. [; O% C4 A$ @
    f(3,5)=1;f(4,3)=1;f(4,5)=0;
    . K. Z& e+ m7 H, Z; ln=length(u);list=[];maxf(n)=1;, R7 {) w/ d9 w
    while maxf(n)>0. y" d: v+ z- r) _
    maxf=zeros(1,n);pred=zeros(1,n);
    & o; h' f8 v/ }9 [2 Y0 F0 `, flist=1;record=list;maxf(1)=inf;8 ~( @1 Z6 f( g. p" X
    % list是未检查邻接点的标号点,record是已标号点( z2 J! W$ F6 E. v" |, u
    while (~isempty(list))&(maxf(n)==0)& ^' R. a6 C( I* }; V
        flag=list(1);list(1)=[];
    $ P; g# u- m( I. f: s! w' k    label1= find(u(flag,-f(flag,);
    1 S0 E7 P0 W# k    label1=setdiff(label1,record);
    # b5 i7 O- w5 ]9 b- ^- V1 o    list=union(list,label1);; _+ `  F6 b/ N
        pred(label1)=flag;* b( U! S- e2 a  t9 N& Q
        maxf(label1)=min(maxf(flag),u(flag,label1)...# o" b9 n8 W# z& m- T- M
        -f(flag,label1));9 n7 a# y" n! F8 T8 B* K1 L
        record=union(record,label1);# w. j$ l) s! d
        label2=find(f(:,flag));
    9 K, l) R& Z5 b: B    label2=label2';
    1 @* V: c8 J! N' o; E    label2=setdiff(label2,record);
    1 j, ]- w: ^8 j4 K& ~" B- R    list=union(list,label2);
    # C  _% o7 }" n6 T" B( v    pred(label2)=-flag;
    0 B& Q4 z$ d2 r% F- j. J    maxf(label2)=min(maxf(flag),f(label2,flag));
    / F& T2 r/ Q1 ]9 Z, w* n' x4 Q    record=union(record,label2);) ]9 h& k' i( c0 k- w/ N
    end$ g3 Z$ N( T4 \) c/ w$ [
         if maxf(n)>0
    + @/ {4 i; }. F  G6 @- N        v2=n; v1=pred(v2);
    7 j% g  o( R0 A0 m/ _  A        while v2~=13 e* v$ b! @8 b* P$ d5 ~
                if v1>0
    2 R2 e3 Y0 g  [0 E3 v* C& O# g                f(v1,v2)=f(v1,v2)+maxf(n);
    5 p6 g6 z0 k! n9 L6 b' q* g- q% l            else
    $ w9 H+ |  \! r+ e! _3 M! ]$ B                v1=abs(v1);7 ~- {8 f& n" E6 o' C3 ^0 l1 t! ]$ q
                    f(v2,v1)=f(v2,v1)-maxf(n);
    % ]7 l# l4 L/ I1 j1 s! T            end
    2 k% Q6 W6 b- U1 r: N! k/ ]! L1 u- |            v2=v1; v1=pred(v2);
    % J! q3 B) A, u        end
    $ [2 ?0 M8 `. `    end- _+ |  ?+ Z* M1 G/ _
    end
    ( s- g" h; X5 ]; Sf
    0 I1 H, |" |- U例18 现需要将城市 s 的石油通过管道运送到城市t ,中间有4个中转站  v1 ,v2 ,v3 和  v4 ,城市与中转站的连接以及管道的容量如图7所示,求从城市 s 到城市t 的最大流。
    ) @8 j1 R- D# ~, c  S0 P7 ^# `: v& F/ m* q4 r
    $ R& n2 `7 l! e- F

    : h# \, b# l: ^' n# n+ O. s+ X- ^4 S2 l. c' E
    解 使用最大流的数学规划表达式,编写LINGO程序如下:- K0 `8 g; v( s# ]% ^* W

    7 T! N* \& D" c- o, Pmodel:' X% T! x; {) k: y* _: W# R# p7 ~
    sets:+ X$ w- \$ ^# \# p( e9 @+ y
    nodes/s,1,2,3,4,t/;0 R  k1 W1 P+ w. [; ^5 ^
    arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,f;! R% S' k, b8 n! ^) J
    endsets" T% U) D) P; U8 S
    data:- ]: l- m+ o! M
    c=8 7 9 5 2 5 9 6 10;
    9 h9 k4 w/ e1 T1 g; Z3 }enddata1 v/ p9 u8 c; U0 H5 b, P
    n=@size(nodes); !顶点的个数;1 C' |( y- o7 l% C1 _+ F
    max=flow;
    6 |. }1 |+ F3 H5 n6 \@for(nodes(i)|i #ne#1 #and# i #ne# n:
    4 a6 S3 I* F4 [$ M    @sum(arcs(i,j):f(i,j))=@sum(arcs(j,i):f(j,i)) u/ I+ U& C' g; E9 d4 q& r
    @sum(arcs(i,j)|i #eq# 1:f(i,j))=flow;
    , \2 b% w# B  Y5 i$ ], w@sum(arcs(i,j)|j #eq# n:f(i,j))=flow;
    : \" A! l$ }2 x' o7 E@for(arcsbnd(0,f,c));) }6 K! {& ~: c( @0 p# }2 _
    end   P# W* M) t) e5 l* m8 f/ f0 W

    + O9 x% X2 B" z* c0 T6 v# Q在上面的程序中,采用了稀疏集的编写方法。下面介绍的程序编写方法是利用赋权邻 接矩阵,这样可以不使用稀疏集的编写方法,更便于推广到复杂网络。6 |1 T+ S( d7 \9 z  A, m
    ! C- [8 V+ p( G# |  R
    model:4 F( L+ g# J! n( N3 _0 P7 ^  }
    sets:
    4 q) p: n+ _! A# o% u' Bnodes/s,1,2,3,4,t/;
    + a4 z9 e$ ?" Zarcs(nodes,nodes):c,f;0 ^1 ~7 n2 e1 ?$ X  j0 e, l
    endsets
    # v: i  F0 j1 f5 ?0 \; I; f$ `  Zdata:. e9 H: x' `# b
    c=0;" S& c1 E3 N3 E. G( M4 m& T0 h
    @text('fdata.txt')=f;
    " c1 P  {! l, Tenddata
    * A3 J/ \9 V# ?. }9 scalc:
    9 H" s+ B1 E4 H/ zc(1,2)=8;c(1,4)=7;
    " |# |- h8 N  A! l; K7 y9 Zc(2,3)=9;c(2,4)=5;6 f  R( a9 J+ a% V9 A
    c(3,4)=2;c(3,6)=5;( k( X( b, N. ?
    c(4,5)=9;c(5,3)=6;c(5,6)=10;3 }! K* u+ j- y, \1 l% c5 Z
    endcalc! _7 P- H4 ^" b- v" |
    n=@size(nodes); !顶点的个数;$ v. T  F% g' ]7 D2 c$ V4 x; }
    max=flow;8 L# v" e8 `  |2 n4 p
    @for(nodes(i)|i #ne#1 #and# i #ne# n:) Z$ u, S. c; _7 t3 S2 `
        @sum(nodes(j):f(i,j))=@sum(nodes(j):f(j,i)));. _6 Z  R0 g! `4 V5 m$ c+ R
    @sum(nodes(i):f(1,i))=flow;! E3 a( N9 m" \2 n, Q
    @sum(nodes(i):f(i,n))=flow;( U4 P- |" y  t! B% C1 E
    @for(arcsbnd(0,f,c));4 x+ l  {& `# P5 u
    end3 Z) W4 i9 {  A5 x) p* }% ~

    ' `# T% Y- ]4 y1 f( R————————————————
    . Z% q! k5 f' `& w+ V* w) u, |版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    - ?7 {( N- }* `1 H2 b/ H& W9 E原文链接:https://blog.csdn.net/qq_29831163/article/details/89786313( h$ R9 H. a" [# U7 o

    , }# P8 }% x- r. {+ ?- a4 ^) H& V" j) I2 l7 v! ^
    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, 2025-5-15 12:38 , Processed in 0.468787 second(s), 50 queries .

    回顶部