|
求解最小生成树的方法虽然很多,但是利用LINGO建立相应的整数规划模型是一种新的尝试。这对于处理非标准的MST问题非常方便。我们主要参考了文[7]。
% }) ]5 y$ C* }' ?9 I在图论中,称无圈的连通图为树。在一个连通图G中,称包含图G全部顶点的树为图G的生成树。生成树上各边的权之和称为该生成树的权。连通图G的权最小的生成树称为图G的最小生成树。
- U( U" i8 |9 G7 M- N许多实际问题都可以归结为最小生成树。例如,如何修筑一些公路把若干个城镇连接起来;如何架设通讯网络将若干个地区连接起来;如何修筑水渠将水源和若干块待灌溉的土地连接起来等等。为了说明问题,以下面的问题作为范例。
- G# I0 Z; A1 E+ `2 F/ y: w, N范例:假设某电话公司计划在六个村庄架设电话线,各村庄之间的距离如图所示。试求出使电话线总长度最小的架线方案。
k! t9 E# ~' }: k4 K. L, \! b
/ z- n3 z9 `" O3 ~/ d6 ]0 a8 G" P# P4 E
, M @1 g' a P% j1 R
0 D- d3 i, A) g f$ o7 @0 K1 Q
/ a* g3 a3 S/ H9 r& [, a# T
1 i/ i: B0 R8 x* g. _
* `# {: ~* D6 {% z+ }! D: t. t2 y R9 S) }" C/ a
' m, k& O L; o| 8 s: {$ p8 }: n e/ V1 r
V1 |
1 t( n( p8 k( n6 U& } | 6 a" J' t- v- u5 e0 j+ J" T
5 e$ k- v0 g C& q, s3 J/ w
' d2 d2 R: Y' |' c' _ q
% z9 {2 N) u' {* N& Q- ^- Y! z& m+ A& A
1 e- T$ S' P3 T! t. x' {9 P
3 T6 n* s" K+ }' t0 E
. U' y( H- |" f7 H4 {
# u2 a; d% M% y6 ?; w C| # J% c0 ~0 l: O" l. O' x5 Q3 Y4 A8 \' C
V2 |
; ~) G8 r @5 t5 x | 2 [" X3 w) D4 |3 O p4 d5 x4 C" H
( c2 O, n; T* j
5 k$ [1 c: X) G% T
6 }( k6 V/ r6 y& g% j' i
4 X( Z5 [2 C) A& U I4 j6 ^$ ?* ~, x
7 F |$ I/ v1 p
2 g; t7 B! m: \/ f1 Z
: ]& M* ] x, V$ M' \2 Y5 V# F| # a4 k: a" C) B9 B1 \
V3 | 8 V. x* M; f5 N/ Y$ p
| ' v5 z& C) A p0 j( D N
1 G" ?5 h, x& q) h' X( z V* w$ H; [% C% G
; e' L6 H1 q) [
" x; o# p' e5 ~, R7 C. h( C6 _) ^0 S0 q8 Z: z2 d7 Q$ J) H- _' Z
6 X3 T, |6 v# A/ _" @1 I7 w% a, |% ^1 b8 ?0 F; g* `; i
1 b8 ]$ _% T3 C* o|
" u' C, n$ d9 Q) n9 n) P7 Y( n V4 | 1 h" `* U' k& `) u8 U3 b6 {" C5 n2 }
| 6 Q G" E5 _0 o& N. l) s) i, z+ T
2 K& k! N3 Q0 v
: q$ r8 ?/ s% n( q* K- J, @
% X% i" l0 m& Z( o* _$ R$ c6 m4 Q* G
8 n8 A$ C% ~* {, T. {+ Q; u" r0 w- n$ [! _
4 u" s. I; B6 z
# b% c% n* y, @) [
( c o: ~7 x/ e; y! N|
1 L' @. O, o# ?' y$ L, s+ e! S7 | V5 | 6 I h8 u$ M6 ]5 r5 @. l
| 1 D; `& q! J& s; }
5 g; [# j F: u4 Z
3 c% |0 ^ b. g' Z( |* S5 B( M/ c
0 B. i8 a, [3 r. a$ Q4 p; y" N4 B" S0 K, N9 O \0 K4 g; X- ?
! ]3 Y0 {2 T+ Z4 V3 }, {
- G1 B ~& R6 g3 ]: B3 J4 I" A6 f5 b
5 W: e' ?& P& J! I0 J; z6 T" Q; I) o; V+ e
| - H; K: f' w8 t7 v* p
V6 | M1 \$ `* h7 A- j Z7 i( P
|
+ J8 U4 e. L, W- J1 ]
$ Z- K- c" F7 _: ]6 g
, w b! \' N* K! D& ~/ w
: N# l+ E4 o) G# h$ @& S
% \9 F; G! k( N3 m. M e& @ Z. r3 g2 |% A9 ]- f
k- J! V2 e/ Z8 C, i ~1 Y A A
' Z2 m: R# A# u; q|
" S6 a9 n, R- J) p0 }; Z Z; X 1 |
1 Z N! n) f# Q" u |
4 p5 t' x6 _+ n8 Y, q X* t) e5 }! |# ]6 U# x" z; F$ M) m
3 B$ x! H. Q+ i
2 H( K# {# `( Z$ J( d' Y3 ^
. H" h1 ?7 F) D: h& m
7 N: W( H, X2 K& X5 `" W0 e+ g& ]
* b7 `' U) w ~8 p
: ^ ~/ t. j' {, \! `5 K' H' a3 ^0 q
0 ?. c6 j$ D4 U3 M0 ?| ! m x# m9 [& N N* p& _3 s8 p
1 |
! ^7 c% p. i# i |
" X0 G- L& K; O6 c+ U* I) B3 X/ b6 D+ q$ H: Y v$ v
; K0 y* _- b& a9 g3 ^, n5 q+ T6 W" o; Q' N: b* `5 U4 t* F
: n2 x; O4 y# Y, G& ?+ D/ t( i
! E5 g4 O% h { K
& O( D9 l$ _2 C9 u v0 C
3 S3 T- [) j3 X, R f$ N' w) T% A+ B% _
| 6 Y: f3 g9 [- A- ~' r4 h
2 |
! g8 O# G- h l; n( `2 N8 r | 8 y& ~3 m: C( N3 ]3 G$ V
* K$ }! |( Y5 f* a' m" y
) {/ {; k0 k$ ~- p$ D
# U7 ] r) \3 G' Y
8 ~/ e# Z4 F3 c
: B9 L8 l) U7 o6 `; h, W4 A- f4 f/ [0 S! D' c
! m1 E _4 M$ n3 b, b% s, K
$ d" ]7 R5 h0 P3 {5 F& Q| . n+ q3 @# t2 ]' R+ W3 ]( n
2 |
8 s: Z4 v* B& _! S' \# Q5 m9 C | 7 O4 ~. d6 k! A9 j' l. x3 U
: J. @; S3 [; Q' V6 }6 w. [: j* W8 n; i( t# U4 D5 P
" Y' [% D6 q: I$ x! |8 j0 O# L8 C l; B! U7 d( X8 a
2 g1 l/ |0 Y8 Z2 P
/ S, [8 P4 y& A; P* w$ c; N
8 ]- b$ q- m) f' N
' ?; G; T9 Q( o" A' v| z2 k: t0 R. l; U6 B0 T
2 |
- X; e) x2 P# E' h+ C) ?3 H | 3 I6 l1 G0 a) V* S6 s) [
! P7 A6 u: r+ H ]/ o, {
: \1 _* @6 |, C, B2 {. |5 e2 J: l- r0 ?$ K
' n( L- q* W t* T e) N6 g
: p0 i) I* Y& Z0 I0 u A) M0 J% C; h" N3 C0 J7 B5 r. n. o
5 G; N1 S+ O# U+ L$ E
; k7 U8 o3 ~8 }2 T| / J4 q+ p; q+ Q. m7 q' N
3 |
4 D6 R) J! q+ L' a: _; V6 M% [ | N$ K( z4 f7 q( Y! x* X
2 C/ A$ L) N0 Z3 i8 {5 W8 P9 p0 o6 {; {9 h9 T0 Y) Z
8 B/ j: |+ ~/ j# @: B# i; h" }: z
0 q+ m/ i, t$ t6 o& l
& Q4 M7 w+ A4 z+ p. d9 V
2 |8 K0 I# s* K* D& j4 m+ O/ {3 h0 S/ y8 J, w9 m1 b
|
8 P0 h% \& E' ]% e" z 3 |
. w, X/ d0 L/ v. h9 T |
" o/ o5 Z& `0 ^5 u) E
# V# V$ Y$ H p' K! t
3 {/ l2 o( Z: l9 b4 W
9 ]7 P# `2 F7 e8 K0 \" s- j
0 ^! H8 |1 t0 N, R) U9 Z
8 |6 u# V1 W Z' [! w4 i
g! B% x3 W. d& ^- |- b7 K% J! E; z! v, i
" z0 N% ]# H0 G- f/ q8 v9 b|
4 w+ ]8 c( _8 ~+ \! S 3 | 1 |6 \; l- E+ ]. c5 E
| \3 B" d, ], N" s' _! n
9 l/ |# I! @3 N, H5 E* W! A4 ]
! g3 \: x4 T; E3 r' M. t d6 N* n& @4 w3 J) J0 Z
3 Z0 P1 e9 H/ J" W% l/ g; d/ k% V6 P) k5 V- @
3 e1 i+ K' x( M# k8 @. X, b% o' `4 u: z$ d( i
& {: ]& n& P/ J ~4 |# f
| ' T; [+ g# u4 ^8 ~2 j5 I* u
4 | 5 F/ o0 y/ ~; g: X
|
( J" P/ O9 i) X+ \% W8 J" q5 K/ d" u* D1 ^
+ T5 X/ W- I1 j* ?8 A/ O
, m9 \/ ?, D' f) O! S3 |* ^
" c4 B0 N X; ]; {; _% M
3 n9 M# Z" C1 e' t
/ G* e9 |% ?- {$ t% M, C7 |5 j0 }8 V5 @. `7 @4 F7 w
0 t( m/ d! o9 p# w! \' p/ m4 u| 1 u4 A3 X D& e. o: G0 w
5 |
- M, |# O4 ]; k/ P2 O | val>val>val>val>val>val>val>val>val>val>val>val>为了便于计算机求解,特作如下规定:(1)节点V1表示树根;(2)当两个节点之间没有线路时,规定两个节点之间的距离为M(较大的值)。
3 |, t5 _- F! x, I9 Q MST的整数规划模型如下: 9 {7 ~9 k! a9 K0 A. Q
8 P$ s' h7 r4 k7 Z B" u# y" z( N ( O+ m+ s: W1 C5 N* P
9 |& j5 p. J) y7 q9 G
$ g3 \! H1 O" J6 F% N) F 2 D! h2 v* O b1 ?& |
) ]0 a( B; z ~* W) X0 a/ H& i/ k+ V
例7.7 分配问题(指派问题,Assignment Problem)
) v% I7 k5 E! J4 q7 o3 h/ t这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间 。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下: ) b2 P1 M- S3 L, F) d
1 v0 D& B" _( T# H4 p) R/ q7 I
显然,此问题可看作是运输问题的特殊情况。可将此问题看作具有n个源和n个汇的问题,每个源有1单位的可获量,而每个汇有1单位的需要量。从表面看,这问题要求用整数规划以保证 能取0或1。然而,幸运的是,此问题是运输问题的特例,因此即使不限制 取0或1,最优解也将取0或1。如果把婚姻看作分配问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为 的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。
6 c' e( x z v, V" emodel:
! f! @4 Z8 }; Z7 t !7个工人,7个工作的分配问题;
5 H' X4 W" S. L! m3 osets: 1 B. s) @, P/ [- ]4 v6 l0 R
workers/w1..w7/;
, g. c1 c- P+ C) ?5 [3 P' l jobs/j1..j7/;
' t" A( n" t* N( U) }% K links(workers,jobs): cost,volume; % q8 X" n5 N7 Y g' T' |% z
endsets
: a, Y, X+ w/ ^; v& ` !目标函数;
4 w) f5 l' S2 ^7 C0 _ min=@sum(links: cost*volume);
8 p8 T: n" ~& J# |, h !每个工人只能有一份工作;
0 t( L1 [( \# p% M& C" p1 c @for(workers(I): 2 Z7 a \ a7 D! j" L7 [# @& l
@sum(jobs(J): volume(I,J))=1;
# F( m* A( b7 c9 {* N) Z/ \ );
& N# W: P7 X' v& J !每份工作只能有一个工人;
+ i3 {, M( `$ z/ v @for(jobs(J):
. `8 y* c, h" l# I% j @sum(workers(I): volume(I,J))=1; 6 N' B6 c6 v) u0 a- [
);
( J$ A# q: t+ ?% U2 ?" U5 P5 Ndata: % c' I* \; z7 O) B2 K: S5 {/ ~3 k
cost= 6 2 6 7 4 2 5
% r" ^& v2 M' I( N 4 9 5 3 8 5 8 , V' P- e* L- T5 l6 b( d) E2 ]
5 2 1 9 7 4 3 7 Q5 J3 i4 k! g
7 6 7 3 9 2 7
2 E- ~2 M. c( x8 r 2 3 9 5 7 2 6 ) n' E" i9 ~% c9 j8 B: o. I/ Y" f
5 5 2 2 8 11 4
3 Q# q( D' U0 z7 _# S* K: S 9 2 3 12 4 5 10;
+ L- Q$ E5 |* \) c# J/ Senddata . [8 w+ U; E' `# y8 L0 s6 N% A
end |