|
求解最小生成树的方法虽然很多,但是利用LINGO建立相应的整数规划模型是一种新的尝试。这对于处理非标准的MST问题非常方便。我们主要参考了文[7]。 " `/ d' ^2 H# P7 U* T' g
在图论中,称无圈的连通图为树。在一个连通图G中,称包含图G全部顶点的树为图G的生成树。生成树上各边的权之和称为该生成树的权。连通图G的权最小的生成树称为图G的最小生成树。 ) U* Q+ j& {8 _( U4 l
许多实际问题都可以归结为最小生成树。例如,如何修筑一些公路把若干个城镇连接起来;如何架设通讯网络将若干个地区连接起来;如何修筑水渠将水源和若干块待灌溉的土地连接起来等等。为了说明问题,以下面的问题作为范例。
9 q( P# [$ {' u2 Q2 S4 ~范例:假设某电话公司计划在六个村庄架设电话线,各村庄之间的距离如图所示。试求出使电话线总长度最小的架线方案。 0 G0 D* Q4 Y/ [2 X0 U% Y R4 k1 K4 C
2 }) V# k/ k2 I! L
( s+ ]+ u3 E( P2 u B
9 i0 h6 B }8 B* `- B; b& E: @/ F/ F
# w& I8 Z# t# A
$ u" U- k* A) `) r' i/ j0 G/ g# {5 L) u. n
7 M0 k5 K$ S9 k
, o! b6 \9 D3 L) G0 D* [4 } R1 B# H
| ; q: t0 n* H7 y- v$ ?% j8 J6 F
V1 |
( w2 |( z1 {4 n& l9 F |
! c8 P" Y, Y0 Z% i1 q4 a. A; t- O( s. t% G
% Y4 P: `! j/ L
3 R& E- \" N* D# I' ^
1 \2 e+ E* U" c: g% c4 S; t6 U) c( s; Q8 M- _( r( i8 Q
* M _7 p+ S# k
* B# @6 t1 w! j& I# e2 @) m, D: E ? X9 @+ b+ T& f" C
| - {! K: b4 [( N
V2 |
0 R3 I1 l, M0 L% `8 _1 }9 Y | 2 X8 C" A! _7 Q6 l' F
: _. r% q, n% K/ Z+ P8 _6 E- p$ d4 s) v E% j
0 |2 O8 c) M5 F6 {* G& B3 V- V3 l
" N/ x. v, s2 k3 q9 e7 l
. T: t" f8 j) u j" O; g- G5 m8 T7 b; O3 Q" x9 q; D
7 V6 p% P" D! K3 j" X1 ]
% W F0 B8 f2 {3 E7 }# P: o$ r0 [
| : ]/ Y( ` F2 [! x! ]" ~0 k3 f
V3 | 2 H. m2 O2 }. U* E- g
|
" w/ V0 ^$ n6 m; p, z+ F. s7 n/ j8 c9 b- j- z* }, [
( I' @$ a* G4 ^+ v3 a1 K+ N7 I1 u
. }+ P8 _# A( a: f8 W! t7 P9 n; o) R; V
$ G* \- H2 B* L2 c3 B. \
9 g: U4 _: Z/ u+ {: |1 @8 b5 K
5 P+ f3 U& v/ W. \3 \" i
/ V2 ], v% z% n; d% A|
3 s! B- { v: j( Y3 W: e1 n4 P V4 |
]- \- q7 v b3 Z |
/ ?9 b) C- z3 O* j7 y
4 A+ @# S2 r5 V& b5 h m; j% |# q4 W! r9 f# w3 P
* ]7 G, n; ]+ I5 _4 P9 W2 g% `" |9 w4 N5 s7 V4 @0 ?
* f, k2 T" ?) b% @' ^) c, g
! K& k/ z1 S/ X* C3 i5 t# \9 U: X5 n/ z( _
# V, W6 m- l3 Y3 m2 W+ u+ ?| 7 J) X4 O& {2 [2 f" t( [4 e
V5 | 8 M- L$ z, F, h& ^
| t8 O4 U7 m1 S, P
3 ~% Q: J3 ]2 W0 {" f' c
" [* V# W" e1 D" E
, o- v8 \4 z$ a" i, x+ B. @7 Z; o9 J( S0 u
, m$ E! P! c4 `; w. Q
# Q0 U' \/ `8 y( \! ?. W+ s4 t
3 _+ m w/ z" d; ^5 q: n S5 B' C, j2 W( m* I9 N0 B9 D* K5 a
| , [3 a" d4 u2 i' L3 e" L0 {0 c
V6 | ( `9 K- y% a$ b! d* n& B }
| " ^! l4 @9 w' t: u# [
) f) H- H# G/ N: }8 Q0 [: f
6 L' q7 o1 ^# b: i' n4 |# M8 q7 N) f5 d2 ?
6 ]* I) m& |$ k# T9 f" `' }6 W/ r4 Q6 z9 ^3 R& E1 o
, H& c) Q& H* Y, a7 I# F+ M: i5 v
p X9 k0 W5 Z6 h2 [8 T
* t3 K/ g1 x5 L7 m. j|
7 |) b' m: f( V. j- V% ]6 Z* G8 e7 m$ ? 1 | 9 f7 z- I" }; h* @, X! K8 R6 F
|
5 i8 @6 e R2 V# G ~" g t+ S, d8 R2 l1 h+ ~! D
7 L$ D/ ^# ]* e4 t
) _5 w5 a7 e% N% R0 S4 V
5 G/ ~( ?3 I2 G2 J) S4 ]! {& \. s/ L' s9 x: i
6 c' W: X9 Z" E! v
* _9 H. Y9 |8 W$ @( _! C2 g6 [6 ?! _; H, p( U" F
| N9 c& a t* Y
1 | / R' a% \7 X0 V1 C& J
| 2 y$ Z9 w4 l( k c
# b; ~1 }- ?% ?. z
x1 W: I: A# f+ m( D0 |; z5 [) c
) {$ B! @' C( ?8 V/ U+ Q
6 V# N+ z! z& c. ~8 ^: h
7 P3 t( c* D6 ~7 H* b* g! Z) ?/ ]( ]" L, s" e3 Y# X
' U9 T. `5 R7 @" A2 G' u; D* r|
8 M9 g4 i* ~3 Q- U2 w$ z( W6 |! G2 s 2 |
2 f: S4 l& R- w; m } | / ~# ^& j! d8 `
) N5 W( W& ^9 _+ d1 v' M
( Q' e. i4 p6 V9 P1 I
2 ^- V7 E1 |* {
' o" }$ |! {. N* ?8 _" B' }) v
* _6 v1 b5 V s2 h! }9 z2 Q
: U$ z. Q% c4 _; m0 N5 D
% l5 K9 [, ]! l# r# |( b x+ T
4 O; Z+ m* k2 P# e* Y# b! i# X|
H4 E& ^$ J- o9 o Q: ]% Q 2 |
6 A o% a X% E- ?- F: p | % t' J; y1 [) I* W( t5 [
" f7 O) [" G6 m* Z
/ c% d1 y( L! U2 ]. D! h( F3 u5 V( g& m3 d& ?1 A1 X
( z) Q) [7 M% L# E
, u! K) A! M* \, k
& o5 s7 [$ N5 `( e, c7 Y$ j/ i2 |3 Y* A
& X1 `! h' U( J L: t| ; R. U8 I+ j7 K4 k9 B! K' h6 t
2 | 0 @0 N( w# G! l) ]
| * C7 n3 T9 D* S+ X; u7 L
: ?0 K7 \' F; H: K7 I$ ^
- J7 o! u# R1 B) ^1 ]8 i& f
6 W) C% E5 X* m# k J; `2 R ^1 l! s! m7 Q
* N- p2 D; o, d8 C7 C9 B+ v
" {2 F4 Z. w( M* T% z9 V8 Z& I* D% B, r& |8 y1 P
) q# }' _$ c7 Q0 F/ s|
! U% g! S9 g2 K7 z m6 W 3 |
( ]7 P% f) u& P$ @1 I8 h; s | * g9 c/ s% S2 ?3 E8 F+ G' N; L2 q, \
5 H/ k8 ?* T3 V9 s5 G
# o; k8 V" c8 b$ K
4 e; j/ I4 l& A% k- m, t8 |- o' ~* p0 f) ~# D6 u9 {1 J! p
1 d2 r' r& C( t4 F1 d$ D% M
0 C0 n+ v/ C8 C& @: j+ n! R1 i# f! Q7 U& t7 K& p
6 i. L% x8 p" M0 e5 T5 x, Y|
# [/ Z8 a4 t5 \3 r 3 |
9 q7 n( i! d7 J0 Y! Y/ J$ `* ? | 4 a0 v5 `1 Y, G0 j/ `1 H" `
! ?! c7 P2 G) y$ E
. P/ e7 Y5 Y' y3 T! b, r3 G$ W; W; M( |1 |. u3 m0 Y! ?
( f5 K2 \. M5 R% ^6 i. g/ p. l% a3 M+ h4 G8 {
. u7 ?: `6 K4 W/ C. X$ @7 E& r4 z% A1 c
% W" r* \. Q* ?* T
| ) o# |- w4 i$ E9 {
3 | " c: f5 L% F4 k' t: R1 r/ ~
|
# w3 p" K, q' b
( ]7 d# O5 q+ y5 z+ |/ X! M
$ R& P9 o9 a, O) k; x4 s& L8 \* d1 [; n0 l" K+ U
* V7 z* I+ N6 f2 N Y7 p, D
2 N1 ~5 G$ ~1 P3 u; L3 `. W7 E* d' g
: O$ R9 v% I+ a1 a! S7 U5 e
0 }8 W; H6 q. l+ x
- g) z3 d1 O+ J" y- |$ @( j+ y3 r|
' r' P0 |- b" G 4 |
& Z7 h# Z) E; R3 b) ^ |
8 ^; O# [ r3 l0 c4 A! R5 S. y: G5 c
* K5 Z/ W! H$ @
9 j& `" Q ] c. j: j1 j# z. e+ N# o, G. V
e! u6 l4 B& q( e; I: g# f5 s+ U G7 s* H0 v7 G6 K
/ X. g- y) f* Q. [6 T* R0 A
" y" `3 c3 W: u+ Y* c+ ?
| ( r/ k( q/ n: e; L7 u1 M
5 |
3 E) a( `" B4 c, n* S | val>val>val>val>val>val>val>val>val>val>val>val>为了便于计算机求解,特作如下规定:(1)节点V1表示树根;(2)当两个节点之间没有线路时,规定两个节点之间的距离为M(较大的值)。 b( n+ m0 L$ Y7 p" E" O
MST的整数规划模型如下: - ] h3 M4 s% C2 r) k3 ~3 E( B/ E
4 U. `7 e7 J9 z& e2 z. E. h
% Y( I! n% {( a1 ^0 `8 q) M7 s
! a7 S8 ^9 O- z$ T9 E0 G
3 s6 Z6 t: q. G3 J9 O @5 ^7 H% x
5 Y( M9 E: _! j2 |: |3 {4 h# {/ r1 j
$ |" N% k( T; F) t 例7.7 分配问题(指派问题,Assignment Problem)
) O5 ]' u9 h2 ^$ P, ?这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间 。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下:
1 d6 l$ \7 s, t2 O- N- U/ \ 5 ?# d6 H$ \% M' D
显然,此问题可看作是运输问题的特殊情况。可将此问题看作具有n个源和n个汇的问题,每个源有1单位的可获量,而每个汇有1单位的需要量。从表面看,这问题要求用整数规划以保证 能取0或1。然而,幸运的是,此问题是运输问题的特例,因此即使不限制 取0或1,最优解也将取0或1。如果把婚姻看作分配问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为 的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。 0 `9 J- ^: M% j- `
model:
1 w; q- v3 U5 F, u& W !7个工人,7个工作的分配问题; . A# M2 g2 G+ W& O: V: k$ E. A& V: k
sets:
! x% Y$ x9 Z" B `( V( c workers/w1..w7/; : G/ v' C+ S1 ]8 X, S$ N, K
jobs/j1..j7/; " d& P* c! d* E& W" o
links(workers,jobs): cost,volume; 7 k# F0 y( C) u' E
endsets
0 c! B" c o# P. Y !目标函数; y# [( F4 o' l' o
min=@sum(links: cost*volume); 3 o2 D4 t& V- l* L2 s5 t
!每个工人只能有一份工作;
" }* A5 e0 C1 o- h* _5 e @for(workers(I):
5 ^8 W7 s' \8 l @sum(jobs(J): volume(I,J))=1; 9 T/ }- \. I0 a. q6 E
); ; A# U$ ~/ \; X
!每份工作只能有一个工人;
7 P# s. K7 }, S: b- h$ ` @for(jobs(J):
2 j* B! s9 L9 s7 @3 P/ X @sum(workers(I): volume(I,J))=1;
. T% K, e9 V1 D5 `6 | ); / Q1 r/ _" S8 ^4 ]. J" m6 a; M
data: 4 S9 u: Q r4 ?0 K6 B
cost= 6 2 6 7 4 2 5 % [- k) s! z3 k0 i
4 9 5 3 8 5 8 * L- ]" m& Y1 h) n4 M" P4 ^
5 2 1 9 7 4 3
1 a+ D( W& C# A: \ 7 6 7 3 9 2 7
1 ?7 C4 D* H& B# [# @3 s' f 2 3 9 5 7 2 6
8 x1 Z8 R& k* E, z( h( k& `- W 5 5 2 2 8 11 4
% E' r1 a9 h5 [# S$ g" S+ S 9 2 3 12 4 5 10;
7 D! Z6 P/ J! Z, b. Z, Benddata
* j) E& p9 \7 E* k; }end |