数学建模社区-数学中国

标题: 常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树 [打印本页]

作者: 浅夏110    时间: 2020-5-21 09:56
标题: 常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树
1 最大流问题的数学描述
8 l  X/ y/ k: s( x4 c/ k3 G1.1 网络中的流 定义
& f! b6 e" E  f5 j$ g% ?6 B% C* D在以V 为节点集, A 为弧集的有向图G = (V, A) 上定义如下的权函数:
' E& r, L0 f" s, _. @6 }4 `" `3 S; Q& r1 u3 X0 Y8 ~
(i) L : A → R 为孤上的权函数,弧 (i, j)∈ A 对应的权 L(i, j) 记为 ,称为孤 (i, j) 的容量下界(lower bound);
, |# P% i/ e% g: T+ W
: y3 H/ i9 o0 e: c(ii)U : A → R 为弧上的权函数,弧(i, j)∈ A对应的权U(i, j) 记为 ,称为孤 (i, j) 的容量上界或容量(capacity);
7 g6 p; z. T8 y8 @8 ^# ?& F# _* ?: i/ h; n: u& a7 N
(iii) D :V → R 为顶点上的权函数,节点i ∈V 对应的权 D(i) 记为  ,称为顶 点i 的供需量(supply/demand);
9 Z6 {: `/ Y+ I! @. R* Y6 X  l2 W) ?. a1 H6 r# B7 V
此时所构成的网络称为流网络,可以记为 N = (V, A, L,U,D) 。 由于我们只讨论V, A 为有限集合的情况,所以对于弧上的权函数 L,U 和顶点上的 权函数 D ,可以直接用所有孤上对应的权和顶点上的权组成的有限维向量表示,因此 L,U, D 有时直接称为权向量,或简称权。由于给定有向图G = (V, A) 后,我们总是可 以在它的弧集合和顶点集合上定义各种权函数,所以流网络一般也直接简称为网络。0 K, b& f/ I- P# p! [

$ @) v7 h$ x7 q, Q$ \在流网络中,弧(i, j) 的容量下界  和容量上界表示的物理意义分别是:通过该 弧发送某种“物质”时,必须发送的最小数量为 ,而发送的最大数量为 。顶点i ∈V 对应的供需量则表示该顶点从网络外部获得的“物质”数量( > 0时),或从该顶 点发送到网络外部的“物质”数量(< 0 时)。下面我们给出严格定义。3 J& i. F( O' |4 L8 K4 @: F

6 C4 B0 m& L9 }可行流(feasible flow)9 X5 w# d& j0 n; F  K2 a
+ Q* e9 H+ o* j5 P2 B

4 p+ ?2 P# K, n$ _$ T  \* B8 }3 R$ l' `! y) b# d# O
2 F# y8 k6 \+ v  ]
可见,当 di > 0时,表示有di 个单位的流量从网络外部流入该顶点,因此顶点i 称 为供应点(supply node)或源(source),有时也形象地称为起始点或发点等;当di < 0 时,表示有|di | 个单位的流量从该顶点流失到网络外部(或说被该顶点吸收),因此顶 点i 称为需求点(demand node)或汇(sink),有时也形象地称为终止点或收点等;当 di = 0时,顶点i 称为转运点(transshipment node)或平衡点、中间点等。此外,根据 (1)可知,对于可行网络,必有- T+ g; X* h. \) c' K  h/ {

8 T5 ?( n2 o& ]% Y0 M# h( t& P' q0 ^* T* q& u( r

) t  C1 c" z( \  H也就是说,所有节点上的供需量之和为 0 是网络中存在可行流的必要条件
: {1 p% n+ }$ B
1 f( X. l1 \' M0 i, d  N9 R2 D& w# ~6 X5 g0 F( K' v0 {

3 l$ a. H# ^% i. Q3 d! a3 s; a; U- B$ }5 S: G1 }" |4 T4 M. a
1.2 最大流问题
# Y* b0 i9 j' }6 x  ]7 o2 w考虑如下流网络 N = (V, A,U,D):节点 s 为网络中唯一的源点,t 为唯一的汇点, 而其它节点为转运点。如果网络中存在可行流 f ,此时称流 f 的流量(或流值,flow value)为 (根据(3),它自然也等于 −  ),通常记为v 或v( f ) ,即9 H% P: E& o5 Q, Z  b3 W3 i

6 w/ j+ m$ \* t" Q  \- B: R
$ }1 W- @. S5 y  N+ q" f对这种单源单汇的网络,如果我们并不给定  和  (即流量不给定),则网络一 般记为 N = (s,t,V, A,U) 。最大流问题( maximum flow problem )就是在 N = (s,t,V, A,U) 中找到流值最大的可行流(即最大流)。我们将会看到,最大流问题 的许多算法也可以用来求解流量给定的网络中的可行流。也就是说,当我们解决了最大 流问题以后,对于在流量给定的网络中寻找可行流的问题,通常也就可以解决了。
; U. Q5 s5 G  }& L1 }1 S  s8 y% A0 j/ V* n0 F1 D" n+ T- u4 U6 Z
用线性规划描述最大流问题
4 }" f: M2 O: C4 ~因此,用线性规划的方法,最大流问题可以形式地描述如下:6 B# r" Y  t4 g7 u
; s1 l  T+ x0 P9 {" D' l

$ U) @# J7 [9 D0 S  ~- f. X6 J6 j9 |) t
定义】 如果一个矩阵 A 的任何子方阵的行列式的值都等于0,1或 −1,则称 A 是 全幺模的(totally unimodular TU,又译为全单位模的),或称 A 是全幺模矩阵。
; r0 t4 U* ]5 ]/ y' Z& @8 J5 G; d: L; S0 o
整流定理7 y! C$ s1 I  `$ c
【定理 7】(整流定理) 最大流问题所对应的约束矩阵是全幺模矩阵。若所有弧容量 均为正整数,则问题的最优解为整数解。 最大流问题是一个特殊的线性规划问题。我们将会看到利用图的特点,解决这个问 题的方法较之线性规划的一般方法要方便、直观得多。8 |/ H5 o: n$ l) c
  q: v, `7 L7 s( q; h
1.3 单源和单汇运输网络% o2 Y( u+ I2 X
多源多汇网络 转化成单源单汇网络8 U1 _& i+ a2 m4 o' a- e- v; h$ t
实际问题往往是多源多汇网络,为了计算的规格化,可将多源多汇网络G 化成单 源单汇网络G' 。设 X 是G 的源,Y 是G 的汇,具体转化方法如下:: b7 ~8 R( h8 ?$ @3 A9 K

, j  o* B3 {+ C7 ~8 h1 _2 b(i)在原图G 中增加两个新的顶点 x 和 y ,令为新图G' 中之单源和单汇,则G 中 所有顶点V 成为G' 之中间顶点集。& x  A# i  k$ @. u4 N

7 Q. h0 K, l# {$ F" z8 L' B(ii)用一条容量为∞的弧把 x 连接到 X 中的每个顶点。; D% J6 L$ e8 {( R2 s. z, F, W

8 ?  z0 @; n, H7 J. s) e& [) Z(iii)用一条容量为∞的弧把Y 中的每个顶点连接到 y 。 G 和G' 中的流以一个简单的方式相互对应。若 f 是G 中的流,则由
9 [3 l/ J4 V! Z( ~; s" G# h+ T' l+ Y0 B5 C
3 M; A- ~. d( K4 _' w

( D; R" t$ J% G% N0 }2 最大流和最小割关系割的容量
* K8 k1 I4 ~+ m( D, V: F% `  T, r
0 j& t* k5 O6 g5 o! O) R2 @- P0 @# s# ?1 ?

* |# c' Y4 F- Z% ?' U3 t则在这条可增广轨上每条前向弧的流都可以增加一个量δ ,而相应的后向弧的流可减 少δ ,这样就可使得网络的流量获得增加,同时可以使每条弧的流量不超过它的容量, 而且保持为正,也不影响其它弧的流量。总之,网络中 f 可增广轨的存在是有意义的, 因为这意味着 f 不是最大流。9 G8 l. z5 B% [) N9 w" T

( k  B, d3 j2 b& n+ x3 最大流的一种算法—标号法
( T, u1 P% V: i% _7 h标号法是由 Ford 和 Fulkerson 在 1957 年提出的。用标号法寻求网络中最大流的基 本思想是寻找可增广轨,使网络的流量得到增加,直到最大为止。即首先给出一个初始 流,这样的流是存在的,例如零流。如果存在关于它的可增广轨,那么调整该轨上每条 弧上的流量,就可以得到新的流。对于新的流,如果仍存在可增广轨,则用同样的方法 使流的值增大,继续这个过程,直到网络中不存在关于新得到流的可增广轨为止,则该 流就是所求的最大流。
4 u2 K/ r2 X% u; R7 u- K9 x4 Z- M% b% v; g0 G' a  K- T+ A3 I8 h! c
这种方法分为以下两个过程:
; `+ P4 Z2 i# }- J( P8 h
! m3 b# c* x3 k5 U9 E4 qA.标号过程:通过标号过程寻找一条可增广轨。
( [% k* O; d( F, i8 I; _" ~; l6 i  p6 r$ `1 m/ O$ Z* n
B.增流过程:沿着可增广轨增加网络的流量。
3 _( E1 W& Y- p9 b. R
# {% k& F5 F* }8 R% Y: n. t这两个过程的步骤分述如下。
3 K) }2 N% S: X2 _$ E# F- b# X
$ G' q- G' s9 u+ c  m8 w- r(A)标号过程:: \2 z1 T5 P2 _; O# H0 U

8 R2 U  w& p- u$ o/ e/ V+ M5 |4 n3 b; q4 b3 }5 _+ \
& t: I' [; ^$ j# P2 ^
(B)增流过程7 G) N3 O7 v7 d  v4 Y+ p) I

8 ?6 m  \+ W/ z% _0 _网络最大流 x 的求解步骤% M7 J. @2 a4 X- w( b
求网络 N = (s,t,V, A,U) 中的最大流 x 的算法的程序设计具体步骤如下:
5 D$ T3 s+ H  B4 @5 \% E% R: p4 X# A( E! u5 N
对每个节点 j ,其标号包括两部分信息 (pred( j),maxf(j)): U. ]( t4 w5 v& @/ @/ f
& Q/ E) ?' b% L7 z
该节点在可能的增广路中的前一个节点 pred( j) ,以及沿该可能的增广路到该节点为止 可以增广的最大流量 maxf( j)。
7 a# m: e$ M6 a
+ A1 t$ Z+ u! P% [$ H7 B1 P( p2 c/ L8 c& U1 W4 [
# k  @0 O7 Q. I- b

并将 j 加入 LIST 中。

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

. }, z( i! w! `6 F
, h- D7 W% v! I& _( r

; P% ]8 y2 q) f3 P1 j解 编写程序如下:
5 N* m! \7 _2 g
2 C* k! v7 I$ M% ?$ ]clc,clear4 u* y) K5 i; n6 ^$ D
u(1,2)=1;u(1,3)=1;u(1,4)=2;u(2,3)=1;u(2,5)=2;. ?; `" Q3 M- t
u(3,5)=1;u(4,3)=3;u(4,5)=3;3 ~; q) P2 D8 C3 F  R+ R
f(1,2)=1;f(1,3)=0;f(1,4)=1;f(2,3)=0;f(2,5)=1;/ @# G5 n7 Z8 [6 @. M- f$ r
f(3,5)=1;f(4,3)=1;f(4,5)=0;
) y/ G- |# r# P& q  ?) A, a5 wn=length(u);list=[];maxf(n)=1;
0 l% I! d, f8 j  J5 T9 S, x0 E1 Zwhile maxf(n)>0! l) ?6 [, \) r0 Q9 y, Y  f
maxf=zeros(1,n);pred=zeros(1,n);3 G3 D" M0 H* G2 u& b' Z( p
list=1;record=list;maxf(1)=inf;( c+ d/ @( r0 }7 a* ]
% list是未检查邻接点的标号点,record是已标号点7 i0 J! S& @) u( C# D
while (~isempty(list))&(maxf(n)==0)' o0 `/ A  A5 N- t
    flag=list(1);list(1)=[];
  K  o" P1 D6 K0 [    label1= find(u(flag,-f(flag,);
& Z7 w9 }( X7 t8 w$ }* [* ~8 j    label1=setdiff(label1,record);
* p3 D9 \4 [' _; x* \5 j' C    list=union(list,label1);& T- V. `7 P# }
    pred(label1)=flag;# j$ i$ d" V! H
    maxf(label1)=min(maxf(flag),u(flag,label1)...  S5 x/ t1 v. |2 \" l
    -f(flag,label1));
$ Z+ e& k% T  a6 A, h    record=union(record,label1);7 f9 M9 U* C: V% U
    label2=find(f(:,flag));
/ h/ @: i8 O6 [3 ~    label2=label2';
4 W2 E9 A. u, }% ]) Q    label2=setdiff(label2,record);
0 v% C' j$ U2 c, b$ J' S: Y    list=union(list,label2);* T- m3 t9 o$ n4 A% W! p5 g$ Z
    pred(label2)=-flag;
  I* [2 H8 {4 R+ J    maxf(label2)=min(maxf(flag),f(label2,flag));% B% j3 @: L7 Q0 R+ H, y: a0 P
    record=union(record,label2);
2 _, p7 b6 @9 \' }+ L end
( C3 |3 l, P. k9 Q. J& j     if maxf(n)>0% S8 R: `0 ?# o9 b) j& P
        v2=n; v1=pred(v2);6 f% z; k% X. v( Y4 ~9 E( \
        while v2~=15 ]6 Q3 r& H% z1 P; a
            if v1>02 D* q6 n; C$ ~5 E" M/ Q
                f(v1,v2)=f(v1,v2)+maxf(n);! U1 k) q4 j; J9 n) @5 B) E
            else
% l: a% _9 O) C) y* G3 K. C# a                v1=abs(v1);9 x+ n) [! K- k" ~0 M
                f(v2,v1)=f(v2,v1)-maxf(n);+ }/ S" S7 W( Z, U6 }! W6 P
            end6 k6 o, M& }5 A* A4 P
            v2=v1; v1=pred(v2);
6 N7 P. p* k) {        end9 B7 W: I6 u2 Y8 M' F! G
    end0 }( z% p# w% W. |3 }
end: X7 A7 R' f( F& Z. W5 n
f 4 g) ?+ _/ E) L# H
例18 现需要将城市 s 的石油通过管道运送到城市t ,中间有4个中转站  v1 ,v2 ,v3 和  v4 ,城市与中转站的连接以及管道的容量如图7所示,求从城市 s 到城市t 的最大流。% e. f* h" W1 P/ X) S

0 G+ m' |& L) T7 r3 z+ }; `- ]0 L, n
: l; \9 I" Y1 N
5 s' y# W" B+ M1 u) p5 `
解 使用最大流的数学规划表达式,编写LINGO程序如下:
5 P5 g- d  O. J, z5 h5 k. U1 a) B& a; \" T
model:
  p' E  M, L* n- K3 l9 v5 I7 ssets:. f2 `% f3 J" [6 c) g
nodes/s,1,2,3,4,t/;9 Q! o' V' [: R5 B. z" F9 ^$ H; d
arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,f;
' J3 q3 ~, L" C! `+ ~1 ]  qendsets
5 q  [7 \& E0 fdata:8 J- |' h: R0 P" \8 P
c=8 7 9 5 2 5 9 6 10;
7 Z' V* S1 Q) N. P) ?enddata
; E0 v- Z' f3 y1 Y( Z) @n=@size(nodes); !顶点的个数;/ P7 y6 p6 C. I# x5 W
max=flow;
& k+ O* Q! u4 x2 y* _@for(nodes(i)|i #ne#1 #and# i #ne# n:
, l6 T& h' B. P    @sum(arcs(i,j):f(i,j))=@sum(arcs(j,i):f(j,i)
, A( y! L3 j5 l! @% s. Y- N% m$ C@sum(arcs(i,j)|i #eq# 1:f(i,j))=flow;
" k* d1 L0 I7 C  d3 J@sum(arcs(i,j)|j #eq# n:f(i,j))=flow;
) n, [/ P3 w% L- }@for(arcsbnd(0,f,c));
9 X/ A& v1 m) A: R; y) c1 wend
" b# Q5 @9 b" z! f6 q% h+ m& D! T* L7 t4 {) S9 c8 k% i: S. v
在上面的程序中,采用了稀疏集的编写方法。下面介绍的程序编写方法是利用赋权邻 接矩阵,这样可以不使用稀疏集的编写方法,更便于推广到复杂网络。' |$ z$ k' T8 N/ \+ q6 K

2 G% H3 z, e- X7 e. N0 N0 [* amodel:0 k* S" b6 o/ {
sets:; h( d' p( r* T! s
nodes/s,1,2,3,4,t/;" M' l2 I7 J) H1 b7 J5 R
arcs(nodes,nodes):c,f;
+ U0 q6 n" d# v2 \- X& Q$ M3 r8 M$ Wendsets
" c: a4 U+ U+ u3 _data:' Y2 N2 B/ t- r* m) {5 U
c=0;' ]" q+ v8 e# ?$ D2 X
@text('fdata.txt')=f;
( U) v# u/ [+ K7 R* Aenddata" R4 i' m) H$ R  G9 H! Z1 {
calc:
/ [# T  _: Q0 vc(1,2)=8;c(1,4)=7;
# I) _  g7 M. p2 W/ Cc(2,3)=9;c(2,4)=5;5 p# j' _" t% o
c(3,4)=2;c(3,6)=5;: b9 S$ p* A  c7 j
c(4,5)=9;c(5,3)=6;c(5,6)=10;3 j% I% w1 b) x# w# s3 S
endcalc( A3 b- _4 V% p5 e: _
n=@size(nodes); !顶点的个数;
, H( A# k  a+ M) V: e- m( f. K1 ^max=flow;8 [2 ^/ Z- w, r* J
@for(nodes(i)|i #ne#1 #and# i #ne# n:2 q2 B  ]& ~. e3 I: g. n1 S: g9 t. R
    @sum(nodes(j):f(i,j))=@sum(nodes(j):f(j,i)));
2 U% o2 H6 D6 @' d, Y# m9 h@sum(nodes(i):f(1,i))=flow;5 Q: _6 E( {5 y& z; z: Y. }
@sum(nodes(i):f(i,n))=flow;
; U$ f4 d! x: y1 s7 S" B. i# [@for(arcsbnd(0,f,c));% |" {  U$ c# a% P- C
end& ]7 a; M* A$ v1 k- O2 c) q( ~$ b

( a( m& E# C0 V* z+ H————————————————
% x7 ^* t( k3 {版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 F( F& }) J  O0 Q
原文链接:https://blog.csdn.net/qq_29831163/article/details/89786313
( h$ R; G% J9 h% N8 {2 h. p1 L0 c9 U- _' J
) _$ C( v0 c  W0 ^/ y7 p# M





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5