数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-5-21 09:56
标题: 常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树
1 最大流问题的数学描述
: U/ N! @! c2 x& U1.1 网络中的流 定义
6 e% [7 P: z$ J3 N- l在以V 为节点集, A 为弧集的有向图G = (V, A) 上定义如下的权函数:
% F* T" u( E; j) ]) v  X# [- f" N) O6 t: a- l
(i) L : A → R 为孤上的权函数,弧 (i, j)∈ A 对应的权 L(i, j) 记为 ,称为孤 (i, j) 的容量下界(lower bound);
0 }9 E6 V/ ]% H4 w* L1 m
0 \+ X/ p4 d3 r(ii)U : A → R 为弧上的权函数,弧(i, j)∈ A对应的权U(i, j) 记为 ,称为孤 (i, j) 的容量上界或容量(capacity);" ^* P3 |2 k- ]* A( }/ g5 l' k5 d
6 ?2 e; M& k; k* Z& Y. _5 t9 v
(iii) D :V → R 为顶点上的权函数,节点i ∈V 对应的权 D(i) 记为  ,称为顶 点i 的供需量(supply/demand);
4 s5 X# K. ^) u% q: I9 [* i1 Y/ x" d$ U; K+ w
此时所构成的网络称为流网络,可以记为 N = (V, A, L,U,D) 。 由于我们只讨论V, A 为有限集合的情况,所以对于弧上的权函数 L,U 和顶点上的 权函数 D ,可以直接用所有孤上对应的权和顶点上的权组成的有限维向量表示,因此 L,U, D 有时直接称为权向量,或简称权。由于给定有向图G = (V, A) 后,我们总是可 以在它的弧集合和顶点集合上定义各种权函数,所以流网络一般也直接简称为网络。0 W6 b5 D- M4 C, G- Y0 U0 K6 c
) B+ Y* K% N0 W& S+ N% s, C
在流网络中,弧(i, j) 的容量下界  和容量上界表示的物理意义分别是:通过该 弧发送某种“物质”时,必须发送的最小数量为 ,而发送的最大数量为 。顶点i ∈V 对应的供需量则表示该顶点从网络外部获得的“物质”数量( > 0时),或从该顶 点发送到网络外部的“物质”数量(< 0 时)。下面我们给出严格定义。$ F( L' o+ k& D' ]0 |
1 w& C- o* S4 P5 t7 _
可行流(feasible flow)
0 O+ }3 V+ L5 k! L3 _. W2 t$ j! G  N& c3 l& L, ~( T, L6 z' ]

. k( P, x! M; K  \+ J( s
' Y# S9 {8 k) p7 }6 [0 B
) j) m. D8 b" h0 V可见,当 di > 0时,表示有di 个单位的流量从网络外部流入该顶点,因此顶点i 称 为供应点(supply node)或源(source),有时也形象地称为起始点或发点等;当di < 0 时,表示有|di | 个单位的流量从该顶点流失到网络外部(或说被该顶点吸收),因此顶 点i 称为需求点(demand node)或汇(sink),有时也形象地称为终止点或收点等;当 di = 0时,顶点i 称为转运点(transshipment node)或平衡点、中间点等。此外,根据 (1)可知,对于可行网络,必有
. n. ~2 I# @1 k) ?7 ?
3 T2 A1 J9 h% F% A5 Z- m* ~  l2 z3 N7 n: i

) R7 P' C8 p1 g+ Z# s' R$ P也就是说,所有节点上的供需量之和为 0 是网络中存在可行流的必要条件! o1 j0 b7 x3 A9 ~9 V$ K+ W9 W

) F* G- O  p! \3 \2 f! u/ b* S, i9 a' ]# R% c/ i$ ], f

" Z* s9 w; {4 O$ \- S) d1 I; y0 o( }# ^4 `3 {
1.2 最大流问题
+ X2 k2 m2 h% O考虑如下流网络 N = (V, A,U,D):节点 s 为网络中唯一的源点,t 为唯一的汇点, 而其它节点为转运点。如果网络中存在可行流 f ,此时称流 f 的流量(或流值,flow value)为 (根据(3),它自然也等于 −  ),通常记为v 或v( f ) ,即% s! r$ e) y4 P( o6 Q

+ [! E8 h" y. ^; f- \9 e+ d
9 H/ U* U/ I; B  X6 U8 `5 a" a对这种单源单汇的网络,如果我们并不给定  和  (即流量不给定),则网络一 般记为 N = (s,t,V, A,U) 。最大流问题( maximum flow problem )就是在 N = (s,t,V, A,U) 中找到流值最大的可行流(即最大流)。我们将会看到,最大流问题 的许多算法也可以用来求解流量给定的网络中的可行流。也就是说,当我们解决了最大 流问题以后,对于在流量给定的网络中寻找可行流的问题,通常也就可以解决了。
. D% @/ p! D% E, q5 {$ e1 C) e% V+ a$ u9 C1 ?
用线性规划描述最大流问题
6 X0 S) W( z1 D6 a' L( Q5 O) _" f因此,用线性规划的方法,最大流问题可以形式地描述如下:5 x1 R0 E  V1 T+ w

: _5 c; r3 @- t6 J/ r! X. w
; N, J4 Z1 {$ Y! L
7 d+ b3 I3 Q) G- e# u1 w# Y; Q3 |: h定义】 如果一个矩阵 A 的任何子方阵的行列式的值都等于0,1或 −1,则称 A 是 全幺模的(totally unimodular TU,又译为全单位模的),或称 A 是全幺模矩阵。6 h' o9 c+ G# b/ a( }7 U

& ]/ J2 p$ O- R整流定理  d& W0 E4 x) p+ U- L8 F/ m
【定理 7】(整流定理) 最大流问题所对应的约束矩阵是全幺模矩阵。若所有弧容量 均为正整数,则问题的最优解为整数解。 最大流问题是一个特殊的线性规划问题。我们将会看到利用图的特点,解决这个问 题的方法较之线性规划的一般方法要方便、直观得多。
6 U# P6 t8 q; s- `# J. v2 E& U& E4 Y
1.3 单源和单汇运输网络0 ?! a, ?% [5 l* v& j
多源多汇网络 转化成单源单汇网络
9 u4 s) C8 l& T实际问题往往是多源多汇网络,为了计算的规格化,可将多源多汇网络G 化成单 源单汇网络G' 。设 X 是G 的源,Y 是G 的汇,具体转化方法如下:* F2 I, o2 B, ?0 Y' E* U6 r# X
: M* [# @$ C7 h7 @! X
(i)在原图G 中增加两个新的顶点 x 和 y ,令为新图G' 中之单源和单汇,则G 中 所有顶点V 成为G' 之中间顶点集。
3 i- e: ~9 l+ D: \7 X/ O# ?1 |0 ^/ u1 z2 S0 \! K. r* ?+ }! v, h5 N5 R6 T
(ii)用一条容量为∞的弧把 x 连接到 X 中的每个顶点。3 Z% R7 {5 `7 q0 C

- F+ M( Z( K( Y: f1 ]5 o(iii)用一条容量为∞的弧把Y 中的每个顶点连接到 y 。 G 和G' 中的流以一个简单的方式相互对应。若 f 是G 中的流,则由( A$ e: i' H) E% _! v+ }
0 u! h0 k' }1 c& C

- p# ~2 B8 R2 e( z( g
, j0 ]; U. R1 `! S2 最大流和最小割关系割的容量. F; T% x) F6 @$ B6 f: j. [
. n( i2 x, A4 [6 N) @
/ D& {+ n7 [, J9 c

0 {+ d- k! m( r  x9 F! J1 U+ [则在这条可增广轨上每条前向弧的流都可以增加一个量δ ,而相应的后向弧的流可减 少δ ,这样就可使得网络的流量获得增加,同时可以使每条弧的流量不超过它的容量, 而且保持为正,也不影响其它弧的流量。总之,网络中 f 可增广轨的存在是有意义的, 因为这意味着 f 不是最大流。
5 R' _' G$ _2 h7 o" h
+ s1 n/ R9 ]% n6 M) U) \  y3 最大流的一种算法—标号法
4 Y1 `+ x8 y; u3 c* {. @标号法是由 Ford 和 Fulkerson 在 1957 年提出的。用标号法寻求网络中最大流的基 本思想是寻找可增广轨,使网络的流量得到增加,直到最大为止。即首先给出一个初始 流,这样的流是存在的,例如零流。如果存在关于它的可增广轨,那么调整该轨上每条 弧上的流量,就可以得到新的流。对于新的流,如果仍存在可增广轨,则用同样的方法 使流的值增大,继续这个过程,直到网络中不存在关于新得到流的可增广轨为止,则该 流就是所求的最大流。
6 R6 L* C4 y) e% n) A
+ {8 g. t7 J/ Y" F这种方法分为以下两个过程:
+ D; t! [: V+ D7 ?% I' l8 ~5 D, y( }8 j$ H: ~
A.标号过程:通过标号过程寻找一条可增广轨。  V' J8 d5 z3 D( Q6 ^
# }( t! T9 E; h6 H
B.增流过程:沿着可增广轨增加网络的流量。0 K1 J% A, k; q) Z! Y- B

  D" i5 N  X  C: N2 f1 N这两个过程的步骤分述如下。0 |% R  ^& R1 b; u
6 m* x6 p, [3 B( v% X. ?# v3 B
(A)标号过程:
9 T/ r& L) N: c, J8 _9 N: R
* l+ W' r8 {, B6 w9 d6 l6 n
5 V# L1 s& [2 t  _
$ j# V5 d) F! I(B)增流过程
. G% D- Y5 d. g
" X/ q2 V  \( t1 e网络最大流 x 的求解步骤
: Q+ {& P9 _$ n4 B6 F2 O8 w求网络 N = (s,t,V, A,U) 中的最大流 x 的算法的程序设计具体步骤如下:* A+ M  F/ _+ ?* O
0 [  z: x- c- z4 ~4 b/ H' U
对每个节点 j ,其标号包括两部分信息 (pred( j),maxf(j)); j6 x7 P# Q; v" [2 b
% W5 S' a: `5 t4 g! a1 S' v
该节点在可能的增广路中的前一个节点 pred( j) ,以及沿该可能的增广路到该节点为止 可以增广的最大流量 maxf( j)。; N" i! d, Q4 U. n/ k$ _

" Z& A* `- ]8 n7 X6 B0 Y. |% J& M+ N; ]8 J6 B1 _' J( Y$ N

0 P, u, W% x: W; }& [

并将 j 加入 LIST 中。

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


" d( S4 J; Z3 N$ j' M4 x1 }' s4 i
: t4 G/ F) x# i; i# S  i$ Y* y* ~) N, F0 Y$ X3 f) C# |3 q
解 编写程序如下:2 U: W* n& _  U! z( v% t: Y# A
7 e1 h7 @, D2 Q! Y
clc,clear; l9 b# Q$ u5 q! c2 ]" X
u(1,2)=1;u(1,3)=1;u(1,4)=2;u(2,3)=1;u(2,5)=2;# x. |1 ~. I& h1 J5 ~+ d
u(3,5)=1;u(4,3)=3;u(4,5)=3;% g" w3 d' r: w) \* q  J
f(1,2)=1;f(1,3)=0;f(1,4)=1;f(2,3)=0;f(2,5)=1;6 {; w. ^3 ~+ E' ~& b
f(3,5)=1;f(4,3)=1;f(4,5)=0;2 n1 E" Z7 [6 Q3 n* k: \
n=length(u);list=[];maxf(n)=1;4 v  u! Y! C9 L$ ]& @
while maxf(n)>0  B1 ~6 s* O1 D3 O% R9 f7 O
maxf=zeros(1,n);pred=zeros(1,n);* e! h; L. y/ h" ~0 a" h
list=1;record=list;maxf(1)=inf;) ~4 [9 I" w* {, V) H* K* a1 O9 e: W) K
% list是未检查邻接点的标号点,record是已标号点
5 m  x& g4 t4 dwhile (~isempty(list))&(maxf(n)==0)5 q/ f& d% l; A) P
    flag=list(1);list(1)=[];
* ?; `) [0 m. r9 s* W    label1= find(u(flag,-f(flag,);
% d' J6 j# B7 z9 k9 c5 c    label1=setdiff(label1,record);9 B' P- S1 T9 l0 l: N' S9 t; J4 {
    list=union(list,label1);" A4 K0 E5 ~9 k5 F! c5 @) C
    pred(label1)=flag;
# y" S2 e3 ], i8 K5 l    maxf(label1)=min(maxf(flag),u(flag,label1)..." Z, a5 f0 O; P  I" O- _8 c
    -f(flag,label1));
, g( O! [: s* C' c0 N" A3 z: ?( t    record=union(record,label1);
6 `. ]# t0 g9 _7 R    label2=find(f(:,flag));
2 Z9 J0 w& {. g( c  t2 F3 Q. \    label2=label2';, m: n% l7 k. y1 f9 O" L0 \2 s: T% S
    label2=setdiff(label2,record);
, a9 o) n  [. n. F0 z# P    list=union(list,label2);. Q' r$ i; x" B' e
    pred(label2)=-flag;
' T* S" }6 {- E' ]& s  i    maxf(label2)=min(maxf(flag),f(label2,flag));, m( x7 y" n9 K
    record=union(record,label2);. G# I/ y  w$ a0 [
end' |3 \2 o8 B, O
     if maxf(n)>0
4 L- h* f7 O. |5 H        v2=n; v1=pred(v2);
. t9 O. i+ m& q        while v2~=1
  L) O8 i' C; }; ?            if v1>0  F5 h5 y8 M3 f: h
                f(v1,v2)=f(v1,v2)+maxf(n);/ R: n. T  w4 A: J3 K
            else/ G. H& @: _0 f. P  `0 _2 ]! s) B
                v1=abs(v1);2 S7 g  k9 j& c3 k: f
                f(v2,v1)=f(v2,v1)-maxf(n);
" F7 u4 k( `8 R2 |, E# {( |- b8 l            end
1 x% z3 M5 F0 ^# D9 c            v2=v1; v1=pred(v2);
0 A. n7 t; z# U( L9 U. a* s# u        end
; d( v7 ]3 o4 [9 r, G    end
) k6 K, {3 J( send
2 R5 B# r" F2 B7 i5 s. Rf 3 ~/ T: N3 }, B& j4 P+ d
例18 现需要将城市 s 的石油通过管道运送到城市t ,中间有4个中转站  v1 ,v2 ,v3 和  v4 ,城市与中转站的连接以及管道的容量如图7所示,求从城市 s 到城市t 的最大流。
2 g- R' n& Y, s9 c$ _9 Z3 B
) m; o# I7 r$ c) z* r* S7 q7 y; e2 E
9 c2 l; @. w5 B6 p+ A7 j  X
( z; G/ S. J2 V" E8 M) ^
解 使用最大流的数学规划表达式,编写LINGO程序如下:
- n3 d$ M2 G: T
. M$ Y% o6 W2 h+ w7 F/ `model:9 X2 q& I% L2 \: i) a, f2 k
sets:
2 n; E6 Q" B' ]nodes/s,1,2,3,4,t/;
! `# B3 O. P- ?; b5 }2 }arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,f;. K" E5 c4 N& B
endsets) x: }" O1 ?" M4 {4 \5 p% d' G
data:
1 a5 [7 `- y5 yc=8 7 9 5 2 5 9 6 10;
- h) g+ D- E: N( g  [2 n1 jenddata$ S3 L: g, K* ]$ r: N- O7 w) x: K
n=@size(nodes); !顶点的个数;. g& |7 \, u4 J6 A$ ^3 y
max=flow;1 H% {+ v; J5 f/ S5 m+ Y. h
@for(nodes(i)|i #ne#1 #and# i #ne# n:9 n# a9 L6 t; I( b
    @sum(arcs(i,j):f(i,j))=@sum(arcs(j,i):f(j,i)8 G: C; ~) K; {; ^$ j; D9 G
@sum(arcs(i,j)|i #eq# 1:f(i,j))=flow;2 L* F3 i# o( i+ k. M3 u/ D
@sum(arcs(i,j)|j #eq# n:f(i,j))=flow;7 `3 L/ ~* _- J
@for(arcsbnd(0,f,c));
7 s+ K! o5 [4 s8 W. Mend , g' T+ T; F) C- f# y( x

/ K# Q4 o: g3 @- V在上面的程序中,采用了稀疏集的编写方法。下面介绍的程序编写方法是利用赋权邻 接矩阵,这样可以不使用稀疏集的编写方法,更便于推广到复杂网络。' \2 Q! |4 z$ K# W
& H  }2 q/ }, b
model:5 a! x! I- b& D
sets:
, i$ U$ z2 N. ?nodes/s,1,2,3,4,t/;2 H$ n/ n- i. @5 A, f
arcs(nodes,nodes):c,f;7 W3 v: x. m- _' \% f1 |
endsets! Y8 I8 {/ ~. k; I( I# y
data:' o1 \7 V' W1 p6 {" B5 O# p1 X2 U
c=0;$ H2 E% y' k) F, |$ R
@text('fdata.txt')=f;& G' w; f9 `  T# `
enddata1 K% o: w# t; I9 `. L: @& Q
calc:# D+ b& u# t9 V: k$ o5 g% Y
c(1,2)=8;c(1,4)=7;% y8 |; I+ a1 A1 p/ c  M% M
c(2,3)=9;c(2,4)=5;1 T9 d: @, g9 I5 h# i
c(3,4)=2;c(3,6)=5;+ a; e; ?) o2 S" Q& V
c(4,5)=9;c(5,3)=6;c(5,6)=10;
& }9 s3 M5 H8 mendcalc+ e5 e% a$ ]9 m$ l7 s8 N
n=@size(nodes); !顶点的个数;
5 E* |8 p2 G! x8 C" Umax=flow;! z; T+ z& \+ N; |, d6 T
@for(nodes(i)|i #ne#1 #and# i #ne# n:* I  c) C/ I* ~& L7 K
    @sum(nodes(j):f(i,j))=@sum(nodes(j):f(j,i)));
9 x+ M) {4 ?  I/ c7 {( ^@sum(nodes(i):f(1,i))=flow;, n6 [5 Q- N  g/ }6 j5 b4 s5 r4 ]
@sum(nodes(i):f(i,n))=flow;
' h, H! _+ w4 K% U@for(arcsbnd(0,f,c));
  o% I2 B2 g3 o$ u3 ]end$ u! B+ P5 A9 L- y; _3 w! h

& H- u0 Q4 }. o1 L# e/ y$ A————————————————. D8 w7 p$ [- c8 x/ m4 f' }
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 b3 T! c! Y3 l2 o# U
原文链接:https://blog.csdn.net/qq_29831163/article/details/89786313
2 K8 {' j+ a/ Q/ `" Y3 p2 F/ K- W9 W: D! Z( H5 m0 i, C7 ]6 f, R5 U

8 ^  L6 p6 B+ E




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