|
求解最小生成树的方法虽然很多,但是利用LINGO建立相应的整数规划模型是一种新的尝试。这对于处理非标准的MST问题非常方便。我们主要参考了文[7]。 # f8 r! T/ a' u
在图论中,称无圈的连通图为树。在一个连通图G中,称包含图G全部顶点的树为图G的生成树。生成树上各边的权之和称为该生成树的权。连通图G的权最小的生成树称为图G的最小生成树。
7 U# g- b3 v5 y许多实际问题都可以归结为最小生成树。例如,如何修筑一些公路把若干个城镇连接起来;如何架设通讯网络将若干个地区连接起来;如何修筑水渠将水源和若干块待灌溉的土地连接起来等等。为了说明问题,以下面的问题作为范例。 % T% }; w, x6 V0 i# \5 C
范例:假设某电话公司计划在六个村庄架设电话线,各村庄之间的距离如图所示。试求出使电话线总长度最小的架线方案。
& |1 A& i: R; P& P
6 Y3 m& [* ? `+ @( [& n7 d5 q" R c1 c$ ] j
; f. W' _! ?8 E/ S9 A! `! ?. K) I7 V% P
8 s' L: w3 R2 J3 |2 ]$ i8 f: ~8 _4 N
4 b! a2 d0 @8 E; W
4 ~1 \/ b" L2 u" `. f4 z* {% m4 D
% |+ K% a0 E% n V" B, \- Z3 x|
: ^0 z Y" \$ o/ l0 H' ]- J V1 |
9 ~+ o" ^* |( Q" j: D* X. l8 u" h |
6 h4 u8 B! Z- q5 R( l4 X7 I( O1 Y1 G/ g8 }# r, v6 U
5 d7 h- Z3 F$ |+ t6 P/ H& ^. y$ x1 M3 y
1 U8 G) H) c& e- K
' v2 r: G4 S# {( ?! f8 C3 C
! E5 {! ?$ o, ?5 ^& S) {7 f
* E3 x3 ?2 a* x' K: z4 d8 I3 V" ]# J/ t& `5 a
|
; e& v. \& H! f9 I6 b, D' S V2 |
6 C: \ _/ V5 g: L; h% R+ n1 o | 1 T! n) k7 ?% f1 p; G
- r! r: s& U; G, t- \1 N/ B
0 @7 _$ p$ X) i- [& c6 j
" G& R1 [; g& d1 _+ X' ~7 v4 z/ f) G; u9 e! b+ |; M+ l7 t' {/ A
4 h& P4 y% v% X/ X5 o0 D
; ]% {) }: P& Y4 d/ x7 U5 }; ?' s( w# J& S5 b' O
! j. f/ O0 G& r8 Q
|
" J% K" E( G2 O$ H6 w+ p" T2 [4 w V3 |
2 e: V- F2 q* X( S | : J$ T# ?( k. C- Q0 n9 X
; z+ G% h3 [! x' @5 ^
$ S7 h; S% b9 W" F5 z! q. V
: W9 o, a( l" u; b( {+ B
) Z) `8 `; M" I& M" a4 p1 `% }) S0 P0 A! L; u8 k, e. p
8 f. M, j( @' j
% c0 e7 D6 f1 K2 d
( ]; C- ~" s+ s8 \& V$ P2 I| / B/ ]* [1 b0 {% s/ A# W) D
V4 |
1 g( j; _" h, F5 d5 B | . U5 s. m6 U2 T# a9 s
- T1 y4 Z! S `$ Y' ~& U0 O# ~
! `2 |9 z, F# D0 K# P( u
; t- b- p- N& _% h' V8 m$ r. s1 e% q) U! g, b5 b7 V, t
4 T, i" R, x+ D
N% `1 n+ z$ L1 T1 @. ]7 u1 A2 Q4 U4 }: Y7 N, f
$ D, B( }: R* a- b, I' f( j6 m+ b+ G' f' `|
4 r0 T D: N. P2 c; [ V5 |
( ^ g5 q* x; `- ], I9 C$ o |
! Y; h1 l! l: z! l8 `5 x
# I5 f$ r! U: N! @& H
$ M& _ S0 c5 J. n9 ^- P' [6 ^8 f% Y4 ]
/ w3 b; X6 R! P' c
7 ~% ^7 ?$ y/ A z- U, X+ ^% E' N1 q6 o+ U. U8 ]
: b& \! Y% n# Q1 H, } \$ J3 p
- t2 _5 p: D; U1 U/ [ Q/ `+ `|
% w/ A7 `; ^3 l+ s V6 | 3 k5 `1 L* R% q
| ( P. c0 V. Q7 U
2 P" @ X+ |/ D
7 H% ]$ L( t) O& X, U9 @3 R M/ o6 [5 P% [* d
8 u& T& O# ?- ?7 O! u
( X$ W( Y4 C0 e8 T( s# n( S J4 V' p5 r! a5 T6 Z1 F- M8 c
& i. ]$ D+ c6 w7 d* d* Z+ \: G
; ^9 x9 y9 c8 q* } I$ x|
/ ?5 c. I# H1 K* M. [: ] 1 |
5 h P* k: \) p5 r |
X+ ^5 b6 j& C% ~4 }! f0 X3 v: {5 h
0 s( n; a4 J7 a c5 t) G/ E Y
& ?8 ~! k2 `6 X7 j% f6 E
5 Z7 S( }, R. r$ v9 }# D& f
1 {% _% |! p& d" \. b. ]+ D# I
4 e3 a: V2 c2 t' q* [# q9 \3 q, ^) [: }' Q
0 V1 g. N, X1 c1 O| $ H4 n1 \; x4 B) J* g3 T
1 |
; `( \/ ~9 S2 C |
7 @- r. t/ ]" O* }( F+ p3 f! r9 |0 f) S& ?) T3 w0 L- M
: b9 e% b1 ^! J9 g
0 |( g4 D" r, J& a- n- b; s+ t3 y5 x( e% G9 o' V- U
( C4 K# y; [1 N- W
( c' P' Y( r% g Z6 j, @1 I7 b+ i9 Q$ Y# r1 n1 R& U5 d
- H0 M% M3 p1 \ |' u& r| # Q0 m& D4 X. v( P, t2 b
2 | . e- E( J) z$ |/ L
| . L5 P6 i4 `; q5 K/ m
0 {2 c% Z+ |; k5 I2 g, {0 C
6 `2 K- ^6 [ S% p7 o/ g- q6 |, b2 q, }0 b7 y. Q+ f' n! [+ a
' Y, P; {" _$ y3 T( h
2 Y& q2 ^1 T7 p% T; d% ~
" t0 d2 q# F3 d' O
1 |( z4 f# n- C: O- P- l1 O' R9 `9 C% B/ u- q. h2 }
|
2 Y( z. a7 G. i7 R 2 |
R/ G7 i1 f8 E& Y' o* u( e |
- v2 O1 n! ~3 C' ~2 W- P! q& T% O5 M# w
' ^1 K3 B6 B/ ~1 F) r3 A! k; [0 D( D# G/ n# t& w0 Q
7 S2 F; e& t2 }3 f6 ^4 }- d
2 V5 H' L) E! r1 c! X9 X
. R1 g/ [: W! a' x3 N
1 L/ J8 c$ X+ d/ a2 D8 z! H
) \" Y7 ^/ b( F' A$ D1 X|
, u9 _% N8 d, i5 I& p. s ? 2 | 6 I( [) ]0 O3 ?
| $ t# k. r- n% O2 m, K; W4 w3 I
) {1 I! E0 Z# a
) n: ]/ l8 y5 N1 D8 h4 v
$ g# {* |9 S( S' T0 z" i, L3 M' `+ m% Q9 U& n' g3 O# \, t) Q
: a( y. G. B& b: Q/ L
/ t+ Z# O! }+ i; W6 X
/ Z1 _; z9 d1 e; [* Y0 Q" h+ |2 h7 M+ x8 j
| 6 C# Z4 w, {1 i1 K' M0 S# M+ O0 A
3 | # j' ?) T5 ~! H/ s w! b. h4 P$ N' K
|
0 z% ~ J& a5 ~
- P9 d9 g$ t) f* V' Q+ @9 F* s; }
J, E% ^! Q% ?9 [* Q
% f- ]" Z2 Y8 b+ N y1 U/ i& {) e4 a: t5 h
1 u7 Y" H$ @- A c+ N9 Q* ~
! A! ]# i- B# N8 |3 z
7 S/ D4 x2 P h p! P @$ R| 2 r! V. P) `! M: ` B5 B
3 | ; X% Q! G- i y9 b! V. z
| - G( _7 ^" o+ K/ Q& @& A: m* N
0 h. G, b* r$ P ?) {4 o6 d
) k' l& N" f+ V" l0 R) a+ G
, }, ?5 \- n* X1 H& \: v( K* R( A
' V, I6 ` \ j6 A+ a7 f
! [: ?6 E" i# T+ c% A: N# C* e$ i" ]: C8 x" G: _5 r+ I
B, h$ K& \& w4 \# }$ b5 M5 C# }: t G" V! G: S
| " W3 L8 _, Q. [5 _. K4 E" i- `
3 |
9 k+ Z; ~7 V/ T8 D0 } |
! f$ x# Y- n# s
8 I2 Y' G& d/ x9 F8 L0 p
3 b% ?# p/ Z9 ~3 W, s6 J! a* ]& v0 D, n
$ J: ]; S1 g2 N7 e
/ @- _7 ^1 ^- k) Q, G; x5 Z/ l/ Z4 H
_1 u8 X; P+ q% A
, C/ m2 X- A2 a |1 F) \4 o$ q| 9 }3 q1 l# `6 _& j& p# C
4 | 2 }$ E) V9 [% Z# J1 }8 s
| 2 b( \- z/ e# i$ y. J6 Y6 f
% V$ r1 U/ ^1 ~6 g/ B+ n8 s
% a$ x& h5 x6 M$ Y
. [! m h4 j1 x1 l& _5 y T+ D: E) q9 Q. `) H
) x4 U% p* C# w+ o2 p
6 Z1 K( P# V9 ]5 _6 L5 F$ @& i' |2 y/ U4 e. X, k4 P
% x, |8 g1 u6 [8 G, S
1 n- z3 c; a: o! a( v9 `; z |' ]# f| ) ` h5 \: G. l& D$ [8 D0 i
5 |
/ @; E; Z, D8 y6 {, n: W! A4 B | val>val>val>val>val>val>val>val>val>val>val>val>为了便于计算机求解,特作如下规定:(1)节点V1表示树根;(2)当两个节点之间没有线路时,规定两个节点之间的距离为M(较大的值)。 7 b( S, s6 ^+ Z. w3 x) n
MST的整数规划模型如下:
* f* A4 v/ q" O
$ _# n% I$ E1 I9 w3 E2 F& f " Z$ l: n8 w$ U: N! ?( _$ R' J0 j
( L1 ?' o, W1 _
$ J' Q, t8 S: y& C
c9 T2 J' U! s t f( T- ^6 @+ Q
! W$ k# H& W2 m 例7.7 分配问题(指派问题,Assignment Problem) 9 G/ W' L) g" H& V2 t' o
这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间 。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下:
, k8 C+ k( R {
0 t4 B6 B5 f" H4 W3 _( V h8 g 显然,此问题可看作是运输问题的特殊情况。可将此问题看作具有n个源和n个汇的问题,每个源有1单位的可获量,而每个汇有1单位的需要量。从表面看,这问题要求用整数规划以保证 能取0或1。然而,幸运的是,此问题是运输问题的特例,因此即使不限制 取0或1,最优解也将取0或1。如果把婚姻看作分配问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为 的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。 7 M |2 @ v5 y7 a# o2 A
model:
1 j$ c7 d, J! E& \3 b& p !7个工人,7个工作的分配问题;
- \& B8 I2 @4 _sets: 0 v' u+ L, ~$ X! z
workers/w1..w7/;
5 d+ Y0 w, ?8 Y; W! u jobs/j1..j7/;
% G6 b$ O( u6 g2 A, t6 {$ E links(workers,jobs): cost,volume; 5 k5 I+ b. L0 C* j; o
endsets 5 k# T3 T$ o1 Y3 @
!目标函数;
; v* O! T8 O; @; g1 i min=@sum(links: cost*volume); 4 B7 q5 y. Y: _4 t! _6 ?! U
!每个工人只能有一份工作;
b7 m0 Y: l. n" W6 Z @for(workers(I): 1 t2 h) d- d" q; X% s3 k1 [
@sum(jobs(J): volume(I,J))=1;
& i3 @; n9 E2 a! d8 M+ `3 b' x- K );
3 a4 r9 L! [8 q !每份工作只能有一个工人;
! c: g" @% v0 t2 l# ~9 _; q1 Z @for(jobs(J): ) R% {# `, ?! h) C1 g: z* W
@sum(workers(I): volume(I,J))=1; 2 L3 K- k1 F0 [' T
); % i: a: h1 d, }4 j
data: 3 f3 u4 J) f6 y- T- W" \0 X1 J
cost= 6 2 6 7 4 2 5 # f- o# @' \4 C* @3 V
4 9 5 3 8 5 8 9 k" ]+ y+ r/ t7 Q: d' `9 ?
5 2 1 9 7 4 3
9 b# f2 N, W7 N$ k, @ 7 6 7 3 9 2 7
) v' T: c, j7 \9 n6 h& { 2 3 9 5 7 2 6 2 m2 N4 p9 v& t# P- G3 Z2 O; X
5 5 2 2 8 11 4
0 ]% V* ?$ J3 f2 t6 h0 P4 J. l 9 2 3 12 4 5 10;
8 J0 u' j r" b, venddata
6 G" G/ t7 d, y# d2 _end |