数学建模社区-数学中国
标题: 常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树 [打印本页]
作者: 浅夏110 时间: 2020-5-21 09:56
标题: 常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树
1 最大流问题的数学描述
' L3 h; o& }8 _1 e4 U# Z# L s1.1 网络中的流 定义. C/ w' [, M" ]; i$ n; e4 r6 j
在以V 为节点集, A 为弧集的有向图G = (V, A) 上定义如下的权函数:
k `0 x; k% I9 q' `
" I7 o% c/ t) M2 q, P+ f& a(i) L : A → R 为孤上的权函数,弧 (i, j)∈ A 对应的权 L(i, j) 记为 ,称为孤 (i, j) 的容量下界(lower bound);' d4 n. e% u' C J
- X! u6 o- m4 n2 a: _" c(ii)U : A → R 为弧上的权函数,弧(i, j)∈ A对应的权U(i, j) 记为 ,称为孤 (i, j) 的容量上界或容量(capacity);
6 E% A( [2 ^3 h3 o% L- I" i- r. q" k- J1 B) h
(iii) D :V → R 为顶点上的权函数,节点i ∈V 对应的权 D(i) 记为 ,称为顶 点i 的供需量(supply/demand);+ A7 a1 p, f1 ^$ ]
4 w) ~) E4 ~) n4 X此时所构成的网络称为流网络,可以记为 N = (V, A, L,U,D) 。 由于我们只讨论V, A 为有限集合的情况,所以对于弧上的权函数 L,U 和顶点上的 权函数 D ,可以直接用所有孤上对应的权和顶点上的权组成的有限维向量表示,因此 L,U, D 有时直接称为权向量,或简称权。由于给定有向图G = (V, A) 后,我们总是可 以在它的弧集合和顶点集合上定义各种权函数,所以流网络一般也直接简称为网络。, s' {9 Y g$ q( E" x* f
0 @" p( i! n& i4 h3 I# m" n在流网络中,弧(i, j) 的容量下界 和容量上界表示的物理意义分别是:通过该 弧发送某种“物质”时,必须发送的最小数量为 ,而发送的最大数量为 。顶点i ∈V 对应的供需量则表示该顶点从网络外部获得的“物质”数量( > 0时),或从该顶 点发送到网络外部的“物质”数量(< 0 时)。下面我们给出严格定义。+ p: X. |) B" ]4 R; m0 ?7 c
1 P. P0 u5 D x* L; O; N" S6 {可行流(feasible flow)! L' w# `' R. e! a% j
3 S8 i3 v7 S0 R! C" F5 \

$ B1 i$ p0 B. Z, |% h+ t
" w2 ]1 D* @7 H! h6 P9 j- z* T$ Y1 \# p
可见,当 di > 0时,表示有di 个单位的流量从网络外部流入该顶点,因此顶点i 称 为供应点(supply node)或源(source),有时也形象地称为起始点或发点等;当di < 0 时,表示有|di | 个单位的流量从该顶点流失到网络外部(或说被该顶点吸收),因此顶 点i 称为需求点(demand node)或汇(sink),有时也形象地称为终止点或收点等;当 di = 0时,顶点i 称为转运点(transshipment node)或平衡点、中间点等。此外,根据 (1)可知,对于可行网络,必有2 ^0 F1 A# T% ^. R* U0 L+ C/ C$ p
+ ]% ^0 r7 P! P2 t- s! d% j% j

# h5 ~( D3 g; D( ]* J6 N/ n
9 s& \+ c1 @7 _ ]也就是说,所有节点上的供需量之和为 0 是网络中存在可行流的必要条件9 j9 x( e& C% d, n9 U* g
8 y+ w' p& M1 u% o, @2 C5 {
# [( z) {) b1 J

^% }2 J% o: s; b' M% M' z/ w5 R0 o/ F6 L M0 E& v2 V
1.2 最大流问题
3 h7 l6 p3 B' d8 k考虑如下流网络 N = (V, A,U,D):节点 s 为网络中唯一的源点,t 为唯一的汇点, 而其它节点为转运点。如果网络中存在可行流 f ,此时称流 f 的流量(或流值,flow value)为 (根据(3),它自然也等于 − ),通常记为v 或v( f ) ,即. M: v% Z% [7 {8 u0 z+ ?4 \4 V
6 w4 q# C7 @; D- W4 w
" }7 g/ u' s4 D% \. o+ O
对这种单源单汇的网络,如果我们并不给定 和 (即流量不给定),则网络一 般记为 N = (s,t,V, A,U) 。最大流问题( maximum flow problem )就是在 N = (s,t,V, A,U) 中找到流值最大的可行流(即最大流)。我们将会看到,最大流问题 的许多算法也可以用来求解流量给定的网络中的可行流。也就是说,当我们解决了最大 流问题以后,对于在流量给定的网络中寻找可行流的问题,通常也就可以解决了。5 V' g+ n. _7 Z7 i: d/ T
& J8 U5 o- A7 D8 v: b+ R, S7 i
用线性规划描述最大流问题1 ~! H( L3 ]3 F! V m9 f5 t
因此,用线性规划的方法,最大流问题可以形式地描述如下:% d |' q/ C6 o# d
! R1 }5 r) O. n3 o7 u
) x0 p5 `3 f2 ]2 U" Q8 h5 ~' U9 @$ C3 ?0 e) K! `% W5 c
定义】 如果一个矩阵 A 的任何子方阵的行列式的值都等于0,1或 −1,则称 A 是 全幺模的(totally unimodular TU,又译为全单位模的),或称 A 是全幺模矩阵。5 g( b8 K9 e5 `& e) x
4 c0 d2 P( H; e6 e9 g1 ^. v
整流定理
, j+ F6 E- e; f0 s6 Q" T【定理 7】(整流定理) 最大流问题所对应的约束矩阵是全幺模矩阵。若所有弧容量 均为正整数,则问题的最优解为整数解。 最大流问题是一个特殊的线性规划问题。我们将会看到利用图的特点,解决这个问 题的方法较之线性规划的一般方法要方便、直观得多。
7 k+ X! P' Y5 W0 G! q+ w; T
! E- v0 ?) d. y) s1.3 单源和单汇运输网络
3 W- O0 }3 X" J3 @( q多源多汇网络 转化成单源单汇网络
- n- z7 V! ]7 M2 c; P! e3 f实际问题往往是多源多汇网络,为了计算的规格化,可将多源多汇网络G 化成单 源单汇网络G' 。设 X 是G 的源,Y 是G 的汇,具体转化方法如下:
+ a0 C1 d3 i: g* m* l' z- p8 F, I5 O$ S9 p3 ^
(i)在原图G 中增加两个新的顶点 x 和 y ,令为新图G' 中之单源和单汇,则G 中 所有顶点V 成为G' 之中间顶点集。
, v4 v0 z8 N! c) z& _
! i- C' `: r2 e, F(ii)用一条容量为∞的弧把 x 连接到 X 中的每个顶点。 O( J8 q' _% ^5 T- U" C3 [
) `) U4 v0 e: K* \; V8 q
(iii)用一条容量为∞的弧把Y 中的每个顶点连接到 y 。 G 和G' 中的流以一个简单的方式相互对应。若 f 是G 中的流,则由( Q8 |+ Z: G1 [0 i
5 P% b0 {6 |/ |6 X
0 H+ `8 f+ j: o. t
4 G6 W9 I* X9 V2 最大流和最小割关系割的容量
- ~: y1 ?- \# T: {) g6 P& g
* W' r& l% x1 m0 t* R# }* \: v2 u
s( W7 v' D4 O2 y1 W* M5 f2 |' g
/ s; }3 P- O s' B$ m9 k! C; A则在这条可增广轨上每条前向弧的流都可以增加一个量δ ,而相应的后向弧的流可减 少δ ,这样就可使得网络的流量获得增加,同时可以使每条弧的流量不超过它的容量, 而且保持为正,也不影响其它弧的流量。总之,网络中 f 可增广轨的存在是有意义的, 因为这意味着 f 不是最大流。6 O( T0 Y3 @, S
8 K3 N4 e' \1 ]3 最大流的一种算法—标号法
& y3 O/ h* P" H/ q标号法是由 Ford 和 Fulkerson 在 1957 年提出的。用标号法寻求网络中最大流的基 本思想是寻找可增广轨,使网络的流量得到增加,直到最大为止。即首先给出一个初始 流,这样的流是存在的,例如零流。如果存在关于它的可增广轨,那么调整该轨上每条 弧上的流量,就可以得到新的流。对于新的流,如果仍存在可增广轨,则用同样的方法 使流的值增大,继续这个过程,直到网络中不存在关于新得到流的可增广轨为止,则该 流就是所求的最大流。
; y* e' R* c- Y6 s+ z' v
% z) w, s3 U, m0 q这种方法分为以下两个过程:
, z2 \; f3 x$ A+ [/ y
& G+ X3 {. f; s1 v- B6 w' O9 W2 lA.标号过程:通过标号过程寻找一条可增广轨。
8 S5 x+ K% I8 ~0 ^. h9 }$ ]7 Z' C1 H( F
B.增流过程:沿着可增广轨增加网络的流量。4 |. x/ x6 j3 I6 t* }' ^3 M- W
5 A0 Z% C. o2 w& ^. r, {0 v
这两个过程的步骤分述如下。
% S+ @6 k- i$ R" ]! w8 U
; X1 D& x8 r9 C3 @2 W& u/ q1 Q(A)标号过程:0 H9 Y0 S2 c7 ]) V0 T/ Y- o
7 G% L2 X) S T; ?
' O6 b7 |. ]- N: g' W! v- @
2 _3 K; N, ?! u1 @! _ A
(B)增流过程
+ r9 D. P8 H" P( J2 J* @, U- J+ `/ h. R0 W! U
网络最大流 x 的求解步骤
# |( B* p2 n! @5 n8 Z/ ~6 h求网络 N = (s,t,V, A,U) 中的最大流 x 的算法的程序设计具体步骤如下:" C1 l6 m: G/ B/ v$ \" q
- B& W6 Z( N( }& [2 q8 {6 p
对每个节点 j ,其标号包括两部分信息 (pred( j),maxf(j))8 U* c6 B- o ]' {% C" e& d& P
! Y/ R$ a6 I: h
该节点在可能的增广路中的前一个节点 pred( j) ,以及沿该可能的增广路到该节点为止 可以增广的最大流量 maxf( j)。
2 D* z& L( ?2 Q
1 E$ w+ C) w! l) R8 |: x* i, y
5 [9 ^0 r) O& t ~* _4 Q
; [& k& U1 M& f2 @; ?& M- E并将 j 加入 LIST 中。
例 17 用 Ford-Fulkerson 算法计算如图 6 网络中的最大流,每条弧上的两个数字分 别表示容量和当前流量。

3 A) _2 ^0 |$ D& D2 S3 C: t2 k+ C
" s; Z) M) h# f' B2 W
: \6 M! E& M( Q' T解 编写程序如下:/ T. Z0 K( _4 V
6 w* X/ S( q. ?2 zclc,clear
0 G+ F3 M/ V7 {' m0 vu(1,2)=1;u(1,3)=1;u(1,4)=2;u(2,3)=1;u(2,5)=2;
/ P! Z/ |. y; B0 l# Hu(3,5)=1;u(4,3)=3;u(4,5)=3;
( c; B; E! f9 Nf(1,2)=1;f(1,3)=0;f(1,4)=1;f(2,3)=0;f(2,5)=1;
' |6 h" M) C) C( N; i& Ef(3,5)=1;f(4,3)=1;f(4,5)=0;1 I2 @' M3 z! c
n=length(u);list=[];maxf(n)=1;2 c4 q; s; A* h
while maxf(n)>0
$ [. Y; m$ ~; P. X5 q0 ymaxf=zeros(1,n);pred=zeros(1,n);' d9 O' x2 G$ P& x' {( e+ |
list=1;record=list;maxf(1)=inf;. [* }* P2 C) X6 A
% list是未检查邻接点的标号点,record是已标号点
9 f0 i0 l& ~: A/ Cwhile (~isempty(list))&(maxf(n)==0)
% S9 s% ^0 F0 W% D4 }6 j flag=list(1);list(1)=[];4 _0 f# ~& v% }; U
label1= find(u(flag,
-f(flag,
);& m# C3 s9 i! y5 \% b9 ~
label1=setdiff(label1,record);
" L- Y8 F6 f3 `/ E: ]# ~ list=union(list,label1);
" |6 ^& l" z$ V' |! r6 A( p pred(label1)=flag;5 n) y7 }% g5 W4 g, W: @
maxf(label1)=min(maxf(flag),u(flag,label1)..., \2 b- s2 [* U2 R
-f(flag,label1));
# r/ ~1 H6 f1 k& W, ?5 T; m& d2 r# [ record=union(record,label1);: m# ]! t9 J2 Q* q' ^& i
label2=find(f(:,flag));3 `2 @9 g+ f5 V8 i6 G
label2=label2';3 ~5 i C. O1 o+ U# T: s9 b+ s/ D
label2=setdiff(label2,record);
' [8 G* n! ^: o. {4 _ list=union(list,label2);
& [% c, K- d7 L+ w$ l pred(label2)=-flag;( d t0 O& A8 Q) s
maxf(label2)=min(maxf(flag),f(label2,flag));
" H9 d4 O' R/ Y/ v! c record=union(record,label2);
2 U/ d+ }3 e. | | end: P& I# U# _- _7 v7 e6 T+ L- S
if maxf(n)>0
3 m/ @7 K N/ p v2=n; v1=pred(v2);" @' B+ C# l8 P9 b2 P
while v2~=10 d* h% n; ]) _! p: F! v
if v1>0
7 X; i* n3 D- I$ Z* F% m) H f(v1,v2)=f(v1,v2)+maxf(n);- B. U/ g& S" B
else" Z3 l( b/ X& r% G
v1=abs(v1);
8 y+ h* L* M/ q' q# d' e: E f(v2,v1)=f(v2,v1)-maxf(n); b: z2 r. p$ ^7 Z
end
; t. `# W) N5 ~! M! E | v2=v1; v1=pred(v2);6 {. k# Y9 {( I7 X- u
end; x! ]5 ~9 Q/ }8 z( ?
end" ?0 `5 Q7 k! t) {8 H. |& ?! d( q
end
+ Q& e9 x, ~9 ~* V. U" of 5 Y# K2 F" d! S! m- `
例18 现需要将城市 s 的石油通过管道运送到城市t ,中间有4个中转站 v1 ,v2 ,v3 和 v4 ,城市与中转站的连接以及管道的容量如图7所示,求从城市 s 到城市t 的最大流。3 \* A8 K, R7 D9 X3 y, v
/ d) H! ~, A }7 J$ O
6 Z$ \+ Y6 W. s0 C
% j* m( V' ~, G0 z, y
/ w( J+ r8 M6 b! L6 D1 B
解 使用最大流的数学规划表达式,编写LINGO程序如下:
5 f- ?# B( w M A: |# u7 n& j. m
. f. |- X9 x2 Cmodel:& e% ?" z: Z- M f" A5 Z& U6 i" `1 ]
sets:
6 U+ I) ]. o% `. u. Wnodes/s,1,2,3,4,t/;
4 i7 Q3 f8 `$ \; S" H2 p6 karcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,f;6 D' {& w& P! E5 D% c$ o
endsets e9 \, S3 i0 W( D
data:
+ w# Y8 c) I9 t ^c=8 7 9 5 2 5 9 6 10;
2 k( a. c: S5 O2 z+ |enddata/ k$ c* a7 y( O. r
n=@size(nodes); !顶点的个数;
2 a5 a0 `1 u: ~0 i. T: v& `& p) Vmax=flow;8 W6 F+ n2 {* T# u4 E' X4 b0 D
@for(nodes(i)|i #ne#1 #and# i #ne# n:8 l% {3 q( R1 k4 o k9 s
@sum(arcs(i,j):f(i,j))=@sum(arcs(j,i):f(j,i)* D7 S3 P; t! M! p
@sum(arcs(i,j)|i #eq# 1:f(i,j))=flow;
2 Q3 O6 O7 V0 J" l@sum(arcs(i,j)|j #eq# n:f(i,j))=flow;1 n' X: E, M! M, ~8 v( f0 Q$ P* U
@for(arcs
bnd(0,f,c));
" n+ h3 H( c: K# d6 E. ~" _end % j% ^7 @% E' G9 @* M9 I+ X
1 b: S, _& O, j W0 s3 t
在上面的程序中,采用了稀疏集的编写方法。下面介绍的程序编写方法是利用赋权邻 接矩阵,这样可以不使用稀疏集的编写方法,更便于推广到复杂网络。0 v& k4 M, I( [; Q9 _2 R
; M+ J8 Y# X: ~* t$ G
model:* v6 r' S' U& T
sets:
" ^! W# D" z1 |. P; P! \! R. v4 X) fnodes/s,1,2,3,4,t/;$ j2 p0 o: q8 r- p0 ~
arcs(nodes,nodes):c,f;
' Z5 F/ s5 t; bendsets$ v' |+ v, A+ L/ `$ X- P4 T4 v
data:& C* X1 L2 R$ C
c=0;
0 C; e! O+ O! z8 t! [; m, y7 ?# z@text('fdata.txt')=f;
8 r- b" ]6 d. B$ _+ A7 Eenddata5 V8 V ?% S5 N
calc:
7 C9 z$ {" F% X, J6 }c(1,2)=8;c(1,4)=7;. _( G+ Y' M0 o: z6 |; }! } q; d
c(2,3)=9;c(2,4)=5;
% `! O' {7 A/ ?5 {, o |; Yc(3,4)=2;c(3,6)=5;
9 \* q/ Y) a, Gc(4,5)=9;c(5,3)=6;c(5,6)=10;2 H9 g( Q. T; P% ^+ U; f* p$ P
endcalc
2 [: J( F6 P1 g2 y l. kn=@size(nodes); !顶点的个数; M* p, N4 M% J5 g. x
max=flow;
9 p4 _3 y7 b; B* T+ d7 T@for(nodes(i)|i #ne#1 #and# i #ne# n:8 v9 z- U; j, I3 Y! A4 x1 o
@sum(nodes(j):f(i,j))=@sum(nodes(j):f(j,i))); Z8 @. ^, X3 ]1 H% t
@sum(nodes(i):f(1,i))=flow;
; x n0 d$ \9 }+ ]" \" g@sum(nodes(i):f(i,n))=flow;/ F( M# O" J' P! `6 n
@for(arcs
bnd(0,f,c));
3 H, E6 k" e$ j7 `end5 E- Y* V9 B! b% l
~* q: c" x a" F
————————————————* H: J, }" D0 I
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" B& o- k( ^- U% F1 m原文链接:https://blog.csdn.net/qq_29831163/article/details/89786313
A9 T9 y4 ?; \% n$ v
0 ~( |- T) Q: W' y9 p! D8 ^0 Z( r9 e4 `2 k6 Q, m- ?" \5 e7 M
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |