数学建模社区-数学中国
标题: 常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树 [打印本页]
作者: 浅夏110 时间: 2020-5-21 09:56
标题: 常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树
1 最大流问题的数学描述6 J; ]* p# c6 j1 @3 F d8 L
1.1 网络中的流 定义* J) H2 X( ?% m* q( [3 E6 {
在以V 为节点集, A 为弧集的有向图G = (V, A) 上定义如下的权函数:
$ Z. Z- U5 T1 _: |
& o; T3 k$ u! V; V/ y(i) L : A → R 为孤上的权函数,弧 (i, j)∈ A 对应的权 L(i, j) 记为 ,称为孤 (i, j) 的容量下界(lower bound);
; _8 N5 U1 I4 S, e& Q; Y; e/ q r2 \4 g+ J/ t
(ii)U : A → R 为弧上的权函数,弧(i, j)∈ A对应的权U(i, j) 记为 ,称为孤 (i, j) 的容量上界或容量(capacity);+ T7 c1 [8 F3 c2 A+ D* m+ `
0 F6 e% s* S4 a; d5 P' w8 p: P _
(iii) D :V → R 为顶点上的权函数,节点i ∈V 对应的权 D(i) 记为 ,称为顶 点i 的供需量(supply/demand);- K, H2 v4 g: T
1 U- o- r# W6 d7 }3 p2 T; d
此时所构成的网络称为流网络,可以记为 N = (V, A, L,U,D) 。 由于我们只讨论V, A 为有限集合的情况,所以对于弧上的权函数 L,U 和顶点上的 权函数 D ,可以直接用所有孤上对应的权和顶点上的权组成的有限维向量表示,因此 L,U, D 有时直接称为权向量,或简称权。由于给定有向图G = (V, A) 后,我们总是可 以在它的弧集合和顶点集合上定义各种权函数,所以流网络一般也直接简称为网络。
) x! ~4 R0 A$ S) x' D* n3 V6 _2 q1 o' Y2 e; B' B
在流网络中,弧(i, j) 的容量下界 和容量上界表示的物理意义分别是:通过该 弧发送某种“物质”时,必须发送的最小数量为 ,而发送的最大数量为 。顶点i ∈V 对应的供需量则表示该顶点从网络外部获得的“物质”数量( > 0时),或从该顶 点发送到网络外部的“物质”数量(< 0 时)。下面我们给出严格定义。
8 e8 a9 N4 B" g& {9 y/ C
5 U! B" O" p' j) U# u" ~可行流(feasible flow)
& Y9 Y3 x- ` f ~/ ], [8 e7 u1 g
- G5 V3 T! e( X, s9 R* T1 K! y4 v* ]
7 L0 [0 d7 u5 x. w! k' E( j6 M+ U: d0 c) ?6 `; u- C
9 y0 a* T T* n" S可见,当 di > 0时,表示有di 个单位的流量从网络外部流入该顶点,因此顶点i 称 为供应点(supply node)或源(source),有时也形象地称为起始点或发点等;当di < 0 时,表示有|di | 个单位的流量从该顶点流失到网络外部(或说被该顶点吸收),因此顶 点i 称为需求点(demand node)或汇(sink),有时也形象地称为终止点或收点等;当 di = 0时,顶点i 称为转运点(transshipment node)或平衡点、中间点等。此外,根据 (1)可知,对于可行网络,必有
! m3 Q) p8 q1 r- ^: e
* C' T# ^- v' A% E& q: L
D# C H% C8 x) V1 [
8 h! c; p' c2 W5 w6 T# H' X也就是说,所有节点上的供需量之和为 0 是网络中存在可行流的必要条件: ]# C3 H2 X, q, X0 c3 R! [3 R- V
; v4 I1 O$ f; q% _8 Z" w
( P3 \# m& V" a
$ h7 x( K8 P5 O. ~% o
0 z. n7 z |; W( J2 A1 b1.2 最大流问题
. R) g8 f2 h: k3 P考虑如下流网络 N = (V, A,U,D):节点 s 为网络中唯一的源点,t 为唯一的汇点, 而其它节点为转运点。如果网络中存在可行流 f ,此时称流 f 的流量(或流值,flow value)为 (根据(3),它自然也等于 − ),通常记为v 或v( f ) ,即4 d8 Q0 a! P, T; f, ]
: i* M( h) j$ @; ^7 [0 T

( c: R8 N8 ^: n8 X" u/ J6 Y对这种单源单汇的网络,如果我们并不给定 和 (即流量不给定),则网络一 般记为 N = (s,t,V, A,U) 。最大流问题( maximum flow problem )就是在 N = (s,t,V, A,U) 中找到流值最大的可行流(即最大流)。我们将会看到,最大流问题 的许多算法也可以用来求解流量给定的网络中的可行流。也就是说,当我们解决了最大 流问题以后,对于在流量给定的网络中寻找可行流的问题,通常也就可以解决了。
- u6 Y `- q! I8 P
- |/ G' e8 W: e2 T用线性规划描述最大流问题5 @/ l7 D: A( A; z5 O! Z
因此,用线性规划的方法,最大流问题可以形式地描述如下:
. d% R+ @' q2 r- w6 L3 S8 h; Y% M( |2 n. X: W

+ { b9 t( ~' Y6 r! a9 ~" U
& s5 z0 W) e) t定义】 如果一个矩阵 A 的任何子方阵的行列式的值都等于0,1或 −1,则称 A 是 全幺模的(totally unimodular TU,又译为全单位模的),或称 A 是全幺模矩阵。
/ F$ E5 s9 H, |1 k. n! A" v/ W' X; I! |+ ^+ J
整流定理1 v& {6 E4 H" G4 Q( W
【定理 7】(整流定理) 最大流问题所对应的约束矩阵是全幺模矩阵。若所有弧容量 均为正整数,则问题的最优解为整数解。 最大流问题是一个特殊的线性规划问题。我们将会看到利用图的特点,解决这个问 题的方法较之线性规划的一般方法要方便、直观得多。
2 L: d4 g, a$ \+ y. Z( ~
. i. a: O8 a2 R" q1.3 单源和单汇运输网络8 j' J" z; `1 Y1 `
多源多汇网络 转化成单源单汇网络* V" t9 ~! y8 h
实际问题往往是多源多汇网络,为了计算的规格化,可将多源多汇网络G 化成单 源单汇网络G' 。设 X 是G 的源,Y 是G 的汇,具体转化方法如下:
: U% t7 l& B6 S/ z; G$ Y$ W6 I1 x' ^* n6 W
(i)在原图G 中增加两个新的顶点 x 和 y ,令为新图G' 中之单源和单汇,则G 中 所有顶点V 成为G' 之中间顶点集。6 f8 O8 l. \ H* K; u2 `4 N# o
: s/ r% D# V# i4 B8 K$ `6 h(ii)用一条容量为∞的弧把 x 连接到 X 中的每个顶点。6 F, ~* a( s, \5 [3 l6 x
2 \4 v2 e) }7 E, _0 r(iii)用一条容量为∞的弧把Y 中的每个顶点连接到 y 。 G 和G' 中的流以一个简单的方式相互对应。若 f 是G 中的流,则由 L7 w8 j, ]6 j7 Z. H3 c$ ~
1 l' @# u6 P- c) H P1 P
2 d; k* a) b1 s& p$ c7 k% M7 y5 Q: x, Q2 Y a$ ]3 F0 d
2 最大流和最小割关系割的容量
8 f: r8 N& T3 t9 M w+ ?- U! R n- B/ c/ H# `: n

6 M" E- o% d" r# F4 e3 M' e, y9 m' y: R
6 o" q# J$ [) A; p8 _则在这条可增广轨上每条前向弧的流都可以增加一个量δ ,而相应的后向弧的流可减 少δ ,这样就可使得网络的流量获得增加,同时可以使每条弧的流量不超过它的容量, 而且保持为正,也不影响其它弧的流量。总之,网络中 f 可增广轨的存在是有意义的, 因为这意味着 f 不是最大流。
) N- m3 e2 O: E* V; V( f) r; _5 c, w$ d( ]2 g Z0 ~% b
3 最大流的一种算法—标号法* ^8 m, J( c& s. V7 L# o1 ]
标号法是由 Ford 和 Fulkerson 在 1957 年提出的。用标号法寻求网络中最大流的基 本思想是寻找可增广轨,使网络的流量得到增加,直到最大为止。即首先给出一个初始 流,这样的流是存在的,例如零流。如果存在关于它的可增广轨,那么调整该轨上每条 弧上的流量,就可以得到新的流。对于新的流,如果仍存在可增广轨,则用同样的方法 使流的值增大,继续这个过程,直到网络中不存在关于新得到流的可增广轨为止,则该 流就是所求的最大流。2 X: E: z; O2 v8 n' h
9 }# O8 |5 Q7 c" u$ T这种方法分为以下两个过程:
. d* p4 D9 J. R) P1 t8 g1 V8 V
E4 G, K$ R; U2 ]4 zA.标号过程:通过标号过程寻找一条可增广轨。3 S; {5 d$ k+ j( y" L
4 H5 w7 y" f1 E/ o U3 aB.增流过程:沿着可增广轨增加网络的流量。 {: N1 c0 }0 b& t: m" I& K
$ S2 ?( w# Q s/ |5 \ X
这两个过程的步骤分述如下。$ [' r/ b% S2 B# f: E' b5 x% \
1 x2 w4 R/ G) b! X0 a6 M(A)标号过程:
6 C$ b; ^. o6 \& a4 S+ R5 L% R: \2 A
3 i1 S% _ c6 d8 y- [
3 |, y8 J; S. s9 ?
(B)增流过程
% p3 v) E# [, ` s4 t+ p7 K. ?
$ b* X( L: j; v; `5 d
网络最大流 x 的求解步骤" Q! H3 e3 u& ]# X& u3 ]% O
求网络 N = (s,t,V, A,U) 中的最大流 x 的算法的程序设计具体步骤如下:* X ?) M$ o3 K9 K; w6 t8 i
( a3 x5 p0 O {) H
对每个节点 j ,其标号包括两部分信息 (pred( j),maxf(j)). ]" c$ G' a0 b) ^: w" H
4 G& I5 I# W7 {, ^5 d; k0 H
该节点在可能的增广路中的前一个节点 pred( j) ,以及沿该可能的增广路到该节点为止 可以增广的最大流量 maxf( j)。+ e+ d; e: J+ m
% ~$ z1 T4 M( p8 K1 _# q/ x/ _5 X5 Z

R- j8 d3 w# c2 j: h9 i2 C
8 U. a# s9 s- L并将 j 加入 LIST 中。
例 17 用 Ford-Fulkerson 算法计算如图 6 网络中的最大流,每条弧上的两个数字分 别表示容量和当前流量。
( l9 ~$ A7 A0 w+ w) r3 z
. ]# o6 G6 V8 i& }) G, s' O1 h/ y
4 t; m; N- t) Y$ l解 编写程序如下:
& J' g6 G! h1 s9 N# q2 h- _( O$ H
clc,clear4 x0 X+ ^: B4 F
u(1,2)=1;u(1,3)=1;u(1,4)=2;u(2,3)=1;u(2,5)=2;
1 e3 A. b7 o0 H* q0 o7 F5 t! ?! fu(3,5)=1;u(4,3)=3;u(4,5)=3;& Z: H2 q" c% [# i V
f(1,2)=1;f(1,3)=0;f(1,4)=1;f(2,3)=0;f(2,5)=1;
; ~6 i# \" D( d9 U) A' r" B% A7 z" o! mf(3,5)=1;f(4,3)=1;f(4,5)=0;5 o2 m+ V+ @ n2 a1 i3 o, i3 h
n=length(u);list=[];maxf(n)=1;
: w( E& U( T% |, w/ mwhile maxf(n)>0
4 p X& ]: ~, l5 l) T2 E) e9 S7 qmaxf=zeros(1,n);pred=zeros(1,n);- W" f" O, T/ r7 M7 J- U
list=1;record=list;maxf(1)=inf;& \* T" E- ~# l: ~! Z, p0 @
% list是未检查邻接点的标号点,record是已标号点
+ m7 ~: `0 e1 }8 ^3 X( C2 Kwhile (~isempty(list))&(maxf(n)==0)
6 c% \! U4 M8 }4 E: P7 Y5 Y# k9 ]. ~ flag=list(1);list(1)=[];
8 O( \1 G. [* H% f J label1= find(u(flag,
-f(flag,
);1 @3 w8 Q* n, j9 L% d; i6 y
label1=setdiff(label1,record);
+ N: p( |5 W. a1 K0 m list=union(list,label1);2 i& z2 D2 n! ^. t+ r4 ], ^
pred(label1)=flag;! i* x f( E" c& q, b7 ^& h4 X
maxf(label1)=min(maxf(flag),u(flag,label1)...4 `- ~* {- m: U$ O% b
-f(flag,label1));
3 ~# ~( G0 p8 T7 a1 M record=union(record,label1);- ]8 i/ y* H/ P
label2=find(f(:,flag));! D& c: }6 I9 Y4 f- j' F0 l
label2=label2';3 s2 V6 [. S+ g. }3 p9 ^4 c; h$ f
label2=setdiff(label2,record);6 A, G' p, l ~# Z% G
list=union(list,label2);$ e& r- d. Z6 b, W6 `
pred(label2)=-flag;: G$ D' \0 q; B4 ?0 \! y
maxf(label2)=min(maxf(flag),f(label2,flag));- z8 |. U. j* P
record=union(record,label2);
$ c+ v$ z. X" _5 H& w: c7 E end
2 _5 T; I0 [# Z$ @ if maxf(n)>00 d2 n5 J" Q# J# g2 }
v2=n; v1=pred(v2);
9 N+ O+ a! T9 Q2 Y5 ^. U while v2~=1
6 a/ `7 F2 P0 y4 x5 | if v1>0" z9 @! A: u D; Z% u5 Z" q
f(v1,v2)=f(v1,v2)+maxf(n);
$ u# X$ |% d3 `. C) Y2 j else
8 n2 I$ T% u8 p$ r( u& ^2 d' s v1=abs(v1);
. b, `) l, s' p* B6 n4 d9 t$ o f(v2,v1)=f(v2,v1)-maxf(n);' M0 K9 [3 v# V# D
end0 T" W1 }, |+ P2 G$ q6 H
v2=v1; v1=pred(v2);
+ ~0 T: J: n% d% s- [, m end
( P M) D5 L5 Y. T/ a end
: n0 E7 J1 ~* M, B$ ]7 bend
l1 o2 N, g6 L- P( wf
5 f3 d; Z. D: v- O& V0 O, w, }例18 现需要将城市 s 的石油通过管道运送到城市t ,中间有4个中转站 v1 ,v2 ,v3 和 v4 ,城市与中转站的连接以及管道的容量如图7所示,求从城市 s 到城市t 的最大流。3 L# f" f7 d3 c4 B/ V
( g" G! u! U- Q& W i' M$ D$ ?3 I
. W/ i, s; S! G: |5 Z
) i4 K$ g& k9 i3 O, s( g
I) H, T7 o" j0 }9 j4 h解 使用最大流的数学规划表达式,编写LINGO程序如下:
" N: q! c8 i5 j
* {7 ]; G5 A5 O" Z* |8 B8 tmodel:
% n' z2 D0 C/ |+ F& Ssets:! W5 K. ~# X( t! F2 Y$ L6 K
nodes/s,1,2,3,4,t/;# R9 Z) \, C) i$ ?! a ]
arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,f;
! m: i% z# M+ V7 I. a! W" ~endsets1 d( W" q v5 u
data:
0 O0 R% s- N- r/ vc=8 7 9 5 2 5 9 6 10;
3 J* K; j3 \( \6 m* n: V4 Y( x8 {enddata1 t& @% x, U. ^- ?
n=@size(nodes); !顶点的个数;* x0 ]- }; I |4 K) X
max=flow;% i7 T8 z1 j' R5 _
@for(nodes(i)|i #ne#1 #and# i #ne# n:9 S+ b8 T% b* [- n; l
@sum(arcs(i,j):f(i,j))=@sum(arcs(j,i):f(j,i)1 }9 @7 E' O" W8 l6 r
@sum(arcs(i,j)|i #eq# 1:f(i,j))=flow;0 F: x* ?: o1 F( [2 i. B* p
@sum(arcs(i,j)|j #eq# n:f(i,j))=flow;& X, y& p* W* s7 R; q; s
@for(arcs
bnd(0,f,c));
7 R0 Y: l" ~2 r O: h6 q4 `6 C3 vend
8 p$ s$ M% O) S, I( ]! p& s# z6 Q
8 c1 W9 K, x2 K; N0 s5 e在上面的程序中,采用了稀疏集的编写方法。下面介绍的程序编写方法是利用赋权邻 接矩阵,这样可以不使用稀疏集的编写方法,更便于推广到复杂网络。
" a9 Z1 B4 K# ], z" v2 O
( B( T" H. L. w# U- [+ Q- ~/ g5 Cmodel:
+ d. |0 H+ f6 ?% g( U3 Zsets:
7 A9 k( @" C& r/ Hnodes/s,1,2,3,4,t/;
* W3 Y6 g* i% e, B. D+ |7 a7 carcs(nodes,nodes):c,f;7 x2 P2 N5 ~8 Y9 R# G5 b2 x
endsets
, y! V0 z; L$ z! V" K- R( wdata:
' t: s9 s4 L" f: l% B& Zc=0;# m, s3 z0 U5 I% K+ d$ ]
@text('fdata.txt')=f;
/ N& g- Y! I+ Benddata
, f" w% Q! o. G( \calc:) @! T c- J' @3 E# |: }
c(1,2)=8;c(1,4)=7;
0 d% H5 @. |, Xc(2,3)=9;c(2,4)=5;
0 Y' I) J# |7 o7 Z9 nc(3,4)=2;c(3,6)=5;$ O0 k0 m4 b0 Z
c(4,5)=9;c(5,3)=6;c(5,6)=10;% q6 Y H6 g( K6 Z
endcalc. e$ l7 ]& v, H! M/ g
n=@size(nodes); !顶点的个数;
/ h f1 e: l& T' ?# p, D: Vmax=flow;4 |' n/ N. C% ^
@for(nodes(i)|i #ne#1 #and# i #ne# n:1 O7 |# u$ e3 Q% ~1 z7 e" \# t
@sum(nodes(j):f(i,j))=@sum(nodes(j):f(j,i)));( h4 p8 |1 W3 J
@sum(nodes(i):f(1,i))=flow;6 I- V( ~; A& E* |# }7 J. W9 j
@sum(nodes(i):f(i,n))=flow;; w* C( M& U i% I1 J% w
@for(arcs
bnd(0,f,c));+ M% d+ y4 \. q. M3 n
end4 Y( P- c' Z# y" Y- {! D5 N0 j
3 L5 }* @, w& u8 d; K
————————————————
" i5 }7 C4 M2 {% w! Y- V- K版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 m2 Q H( ?5 Z/ {' O1 [
原文链接:https://blog.csdn.net/qq_29831163/article/details/89786313) m; M/ U" m. L
3 Y C* C" D6 F) x* z# ?( W4 i
0 ]6 P; \* E( I" T4 ^$ {0 q+ G
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |