|
求解最小生成树的方法虽然很多,但是利用LINGO建立相应的整数规划模型是一种新的尝试。这对于处理非标准的MST问题非常方便。我们主要参考了文[7]。 " U1 `' H# y6 u; ]
在图论中,称无圈的连通图为树。在一个连通图G中,称包含图G全部顶点的树为图G的生成树。生成树上各边的权之和称为该生成树的权。连通图G的权最小的生成树称为图G的最小生成树。 4 h( {. o3 Q- H% E' A
许多实际问题都可以归结为最小生成树。例如,如何修筑一些公路把若干个城镇连接起来;如何架设通讯网络将若干个地区连接起来;如何修筑水渠将水源和若干块待灌溉的土地连接起来等等。为了说明问题,以下面的问题作为范例。 . c# {& L& o& x* K. U
范例:假设某电话公司计划在六个村庄架设电话线,各村庄之间的距离如图所示。试求出使电话线总长度最小的架线方案。 ) V3 y8 o- o f& V' I) D0 m
0 y& Y) U6 Y: ^9 c6 [: L+ V
( L. ^4 a2 k% L7 j
& ] K9 z& E$ K: _; ?) ^7 s w" O3 C# a4 \
- \5 r& E( y5 t! Y: u
( F- q/ u* @* L" _
. R# @( w/ L) n# C% v) H- I0 B% I" h
! `' @2 B8 v0 a( y; ]
& G( |1 c; R0 x4 e& s6 ~2 ]0 p| " x6 C& E t& O. O3 v
V1 |
$ W8 u3 D( ~/ ]+ U: c |
+ w. g: `- Y! `" k! p! l( h& T; w0 V$ Y' v* Z
# K5 j+ s1 j1 F; \9 m3 w
6 u; C5 d% g3 I
( j5 ~* v4 Z% [/ c( N0 g$ x6 @
7 y8 A3 S, l0 X) ^* ~$ H
: E* a$ v3 v" K; {6 y% X3 b
& ~ M9 F0 m' G& p/ Z5 m% R C& k" b9 c
|
/ _. }" }) e8 N ]3 h6 E! G V2 |
1 B* g4 e5 E# V- ?3 \5 L9 O |
$ q r4 T" t8 q3 O
, ]' v# d* X2 X$ g1 E9 D; X% ^2 C, I3 r
' b' P2 [6 f$ y( I( b
- V, _% }3 ?; `- z
- b7 o* j# `3 ~3 s( M" J! o0 I6 R1 G+ F3 H T$ d! R- V/ w8 ^9 q. F
S, Z; @ o6 @# a/ U" O6 l+ y
2 `$ [6 t; Q6 ^4 I- P) G# I" J$ d- ]| . O: T1 E& [3 m. U. ^0 Z5 J
V3 | ; a. r( n0 t2 p$ R
| ; i1 O9 i y3 N2 C' G* ~9 L
9 n9 d$ N- l. q, |) @# C3 C3 C% P9 }# `0 T5 | j
; Z" v( a1 [, g& \3 d8 K1 Y1 ?" C& D
; g4 x; n" D; o: G8 t* l
) o% W1 ~$ N. C3 N; h# ?4 L0 y8 G; x
. }0 }( z$ \$ T% j4 M2 U| " R4 ~( C4 S' ~3 W# _
V4 | & Z5 I. K& [! W( E
|
1 V% s* G- Y0 b
/ F* C) {6 A* D1 H0 r, {* X7 _
) u2 G' S6 c/ \% n" N% i6 a1 E5 v
3 `# g& p2 N3 C" y3 _6 x* r0 c: R" Y/ z1 w3 P
D+ @5 p+ c: s9 O, Q
: t' r6 U! u( q, H' I) _. a; [) r. e& {# O5 A+ `5 w
- K% o; y% S/ k) S( V# _9 C|
. \$ L% ~# p7 u G, @ m& j V5 |
( }% s9 H/ e) f4 z/ G |
s9 m: L6 S4 ?! h# a; s
% J/ i( p$ D1 T& j( S) [. s a! {) ]
z' Y" T* u1 y. Y1 |1 F& y. ^7 v
: a. P6 }/ }( V" k) L d H. }1 q$ U
$ E: O) `- w# _; \5 A" w5 S: z' \* A) ?2 k, m- x/ Z
' N" Z6 D0 d3 V/ Y# R" X! g' o2 @) `4 \; b- ~% A3 `2 }; L; E
|
0 {) P1 C2 n) e% W2 d& W0 I V6 | & \ U7 R; C, u; s! V
|
4 o2 `0 [: R0 m6 W/ c4 }( z% g7 ^4 O2 [& G1 `
9 l" A' A# R3 R
0 l9 \, _' x- g9 @: b6 v- U8 [9 [
3 n+ R3 b5 u9 x: B' f3 L h6 F- m0 P1 ^, A
0 w2 p; Y* g4 c, q% F; t. Z f4 h& n4 ]
|
; I1 y( u5 I& o# _6 k A$ m! C$ b( E 1 |
" J3 i) t6 J4 g4 V; B |
2 b+ D0 o6 Y& _0 _- f/ t" R/ G8 L+ U) K& ]. a
9 N6 h( `0 m: F# F2 b4 D/ t6 C; `
, M6 n5 U1 C4 c$ ~+ C0 d: Y% N
* p7 p' D$ ^$ x
. Q$ O: w* R* A1 u% h5 \0 [$ E. e& }2 c
, A! X: m" v2 R) }) m$ a- O
) k! X2 z" _+ W9 `
| # W' F# C6 {/ p7 F& ^
1 | ! ?* P8 j3 `* T
|
5 M* q# N+ C9 [5 W
+ B! ]2 Z( V q' Q: \8 f" f
' s6 }( ]7 U* ], C/ S* c3 A0 Z+ i+ I
. \% N0 i9 i8 ^3 e8 G6 T' s4 p$ m6 Q/ x/ f( P3 y0 X9 F% ?
2 m- q$ A( b" ?/ R# c! c+ I3 z' W, u& L! x2 }8 i! K5 ]
' a5 j( t* T5 D) K1 C+ D. U" I/ y/ n6 \
) ]) e3 x- V5 O% {, h5 P| & B Z& _3 c. `& r; a# }" w, ~
2 |
9 w* J* U: B) X5 ` |
& X" w- O1 @" J" S0 e8 b
: z, A) k' B+ ] V ^% x" }1 Q' O2 Z, b& i( v6 e% ^
. J: e# L# |8 j% B! X7 s
* x0 M0 a+ m6 G) F$ ^, H- ]
' R: f- [5 F1 k; ~, M) V
, L+ G& {) s/ h @2 v. F; F
& r9 y9 S D2 e
# J# |. ^7 R( a+ g$ ^0 ?5 ||
5 a# h# P# _2 V, P) Z' B: V 2 |
+ T/ p% H7 x& ]4 ~% n+ c4 Z& }. s6 J |
& ~- a( I+ I; }0 v% A8 t/ u* n& J) w# B
! e: _8 V5 L: r
@4 _+ \# A* ` R0 |# J& V7 F
# Z; T9 j" N' _5 c8 B8 m$ H* s( L8 }2 H/ y% G+ C0 f" w7 I
8 k; a( h: [% X- M( L1 Z/ g
' v. H7 J% e1 [7 t G# P/ Y2 i; d/ J/ K
| 6 L. {6 I1 L8 W: G) O) P
2 | 2 \1 K" `. `# v( X" o5 ^& l) E- Y- p( y. v
|
, I5 ]6 f' m' B7 \$ c: g2 v5 i9 F3 W3 B: }+ J7 |' Y5 B
/ F) E5 a8 U) W- a B2 B* p
& `/ R/ M/ w8 d; u( o$ H* m
8 R- Y# z! s7 @- g$ g8 b2 Z! V& q) S# h. y
) n$ S# k7 ^8 x2 W6 N
% R6 ^' b% s9 Q4 y
; ^% b+ C) y2 q( n8 C8 _$ B
|
: N/ d' y9 I: M6 |/ ]- r 3 |
, P! d% v: \' t- n r0 M3 F |
0 D' A) x. ?& Y1 V' z# ]% ~% s, W. h5 R( X% E. q7 s5 H6 R4 Z
' v9 o* }: V+ I$ M; Q4 v, L
$ a9 N2 k% M) d2 W
3 o: Z g5 [' p% L0 V# P6 d Y& N9 |! V
( i- ]1 ]/ q3 _" z2 k& T! z0 ~' ]2 ] c7 F& H" O! a& E/ D' c: q5 ^% N
+ Q; w/ D6 V3 |3 }& Q1 v|
. e& K4 [3 Z% B% K' \ 3 |
$ N6 f# @; }) u, g | / G, V+ G- a& x# k/ T
# N* T5 X, w+ c0 j: n
, V3 T- h% x8 X
1 T1 d7 l3 ?; T& F0 c; T& x
' b O& F( W# o- ?- R3 r, Y& i1 L+ y, s7 j' D7 V, V6 o4 \/ |5 m- `
* @" P7 L! c" u$ z: [% c% W) c' P& G. M7 L! t
) V: K& d6 x/ \4 G) e2 N
| 1 ~5 l# L6 @2 i
3 | 9 v; ^2 b/ G# U# L3 I7 K8 ?
| ) t( b9 N6 e9 T- [2 s9 `- a3 T
5 o1 P8 Q0 S& ^4 l1 I5 P8 U* z7 ^$ R" J
" \7 e: Z6 X3 E$ O3 e% l/ P2 b
" y' e ^. f; b E( A8 w. t7 ]/ \# ] P# _( W! \
% U5 M3 Y6 P) U2 Q/ T. @2 X% h) y) ^) Y8 Z
6 K, Z- J5 K# Y3 \|
9 D; { V9 d, S) l+ ?6 g 4 |
. j5 a( y9 k9 e0 _3 k |
# X, H! P7 Y, M" I$ Z! I0 M- b1 ]* H O, x7 h
$ n1 W' G m& |0 w: l
. r! G- P7 R2 c1 _0 z" F
& d2 d7 C5 E2 l! A4 [, s# {; X9 C1 H
, v& A- P: r! t4 f) ~
4 g5 W/ A9 D3 l2 H5 T, ~1 z
6 N, [5 J4 p) M4 m H' H$ I|
7 P7 [% V& O/ _9 n 5 |
$ o' e, x9 w9 M: m1 _: u( ` | val>val>val>val>val>val>val>val>val>val>val>val>为了便于计算机求解,特作如下规定:(1)节点V1表示树根;(2)当两个节点之间没有线路时,规定两个节点之间的距离为M(较大的值)。 $ I4 K2 K# e! \5 F, M3 Y+ ^
MST的整数规划模型如下: & B( D K% b- `; C
- L: Z; C" W" R# L) W) x" ]+ d- A% n
' ]2 w: l _4 N) G5 S0 O
% B+ R w- o% c1 s# h& s
) E7 J$ [( T D4 l, N ' r+ P1 o# N" w) {, h2 L, \" p
% |. k) k0 I2 i) n 例7.7 分配问题(指派问题,Assignment Problem)
! @' g# Z" O8 p, B这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间 。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下:
1 z% l# x: @$ F2 f9 R 0 }" C( A/ J& A0 U9 `7 O- d
显然,此问题可看作是运输问题的特殊情况。可将此问题看作具有n个源和n个汇的问题,每个源有1单位的可获量,而每个汇有1单位的需要量。从表面看,这问题要求用整数规划以保证 能取0或1。然而,幸运的是,此问题是运输问题的特例,因此即使不限制 取0或1,最优解也将取0或1。如果把婚姻看作分配问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为 的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。
) f/ P3 A8 Q5 d8 j! x* _model: 6 v) m- c0 P9 V3 g+ a
!7个工人,7个工作的分配问题; # v0 R; G) a: t# Z
sets:
8 X4 R8 g- v. _ workers/w1..w7/; 5 D K3 h( [1 ^/ \" b; m, n
jobs/j1..j7/; 7 V' F* D3 a) y
links(workers,jobs): cost,volume;
! y7 h) W8 Y3 w- ~$ Eendsets ( X* Q s# J( b" h# m: ^# |5 o
!目标函数; 1 `) z" u1 w5 d
min=@sum(links: cost*volume);
/ o2 q& m6 P n: _. P( Q0 K+ \ !每个工人只能有一份工作;
@; U" K `. h) h @for(workers(I): 2 x+ v. g: ~! H0 i$ o9 o
@sum(jobs(J): volume(I,J))=1; / A3 g6 Z( _6 t% G; w' s3 b5 `: J
);
# y( Y2 X! ?1 [- U8 a6 b1 @$ g !每份工作只能有一个工人; 2 v& v, F6 M" K0 Y; q! y; ?
@for(jobs(J): ! a2 v$ A' T* a3 R8 |
@sum(workers(I): volume(I,J))=1;
& d# F! t& @) q \& f ); ' j4 E2 k- u; ?3 f' G' M
data:
% n c8 }2 J1 q2 I; A# q7 N cost= 6 2 6 7 4 2 5 7 s D# X4 M" z
4 9 5 3 8 5 8
) W- L w; u6 i 5 2 1 9 7 4 3 7 X. Q" X+ ?- B* X( K+ Z
7 6 7 3 9 2 7 + x9 J2 l! Y4 q5 g
2 3 9 5 7 2 6 ( g, U% o8 \) P( F% V7 o
5 5 2 2 8 11 4
. b& ` R [4 Q) @ 9 2 3 12 4 5 10; : w4 @. J! P2 G- M7 V/ D
enddata 1 W& [% w( R$ @
end |