|
求解最小生成树的方法虽然很多,但是利用LINGO建立相应的整数规划模型是一种新的尝试。这对于处理非标准的MST问题非常方便。我们主要参考了文[7]。
6 y0 n& k! G; n在图论中,称无圈的连通图为树。在一个连通图G中,称包含图G全部顶点的树为图G的生成树。生成树上各边的权之和称为该生成树的权。连通图G的权最小的生成树称为图G的最小生成树。
3 X& N( @" x2 F; ~0 [' X, Q! m许多实际问题都可以归结为最小生成树。例如,如何修筑一些公路把若干个城镇连接起来;如何架设通讯网络将若干个地区连接起来;如何修筑水渠将水源和若干块待灌溉的土地连接起来等等。为了说明问题,以下面的问题作为范例。 - w. F+ ]. ^) V
范例:假设某电话公司计划在六个村庄架设电话线,各村庄之间的距离如图所示。试求出使电话线总长度最小的架线方案。 \+ L6 p9 l/ a a5 F6 z# ?9 V
7 I- i& }2 |4 G5 H9 k8 b9 {% U' X- ]
6 G& e6 ^# g* @& L7 s8 d0 F% L( v1 D+ X# {- k4 U3 E
, p. D$ ]& T z2 V$ O8 {
' o1 i/ }' b- Z
- h+ c/ l6 t7 |7 l8 R
$ \+ s6 c, `; _; Q$ t0 a
; x8 {% w* n6 k$ z) n
* V& y3 @- p: M- n2 [: j| 0 U$ z2 i @# W, Z* P+ m% V: o9 E
V1 |
) r: \' K* h6 _# M7 u8 j T7 w | 7 h( J/ {) Q) W% E
" S. V2 o4 c) c0 N
S7 @" _: g A% W7 D* ]1 f9 ?
5 O- q! S" Q2 t/ i6 G
0 P; M4 M3 V& @% O( p. e9 M* G% _3 d8 m. e9 t1 a, g
8 z6 w8 x5 z5 J. ]; v9 H! o9 i, _
( h3 K, z D8 h2 ?/ Z' i! F
4 Z2 a0 k; _* l4 K5 R/ |) A0 \| 7 h. X$ d1 T, o; j |7 w6 {( X3 l
V2 | - g8 a0 h) I# ~3 `1 D" p/ c
|
$ ?8 O& J6 n3 u1 K3 b$ E E" s, v2 D5 s
4 G8 g+ `5 a. f% V2 k7 R* R! z9 d" }
% ]4 B, a3 x9 e3 h- j& w! M3 c, q4 X1 r5 k1 y& Z
5 f+ |& M' L8 x* O7 m" [
/ p8 c1 U3 r7 X3 \) w8 \
+ t) i, P: }+ y" C/ ~" ?' F
9 _. l8 }( Q7 ^) L) S8 c|
8 ^7 D8 q: C5 p V3 |
6 z; _* o7 v( H3 T5 G& c5 h4 Z |
; f) l4 V- m6 s) j" f8 t( S/ D. g7 k _- O) c7 [. u1 m
3 V5 O( R1 t8 S; `1 U
& M' b# r0 q# e! z+ ^
% A0 i+ k5 h7 g. e$ ^$ i4 B3 `" |2 q5 C" q5 e! j
' c# k1 L4 }) o$ K/ A1 a6 |- L& W8 ~. l4 u/ X# }' R
( v$ B6 U2 v5 g. y* t; ~' P* m
|
: \$ N, m% D: g0 f! Y V4 |
* t# ?( G& g: O) X7 ~+ U |
0 h' Q2 m6 s# k( S1 I( u8 u# o) U) m0 H0 N6 F' k( w4 `
6 Z; B& a) x1 u2 h( a: U
. p0 O+ w( a( r, U7 L% n* e6 s
1 X1 X6 }6 C: ~
2 w( w8 D2 \8 c, ]6 f4 t0 g C; i F* s1 V6 ^" A+ V0 P! N1 ]8 S
5 b' O# O6 {; l- b
) t: A% g0 h. |+ a
|
& |9 i& X$ M) _9 I" j, s) v2 l" P V5 | ' s# G8 M/ E; Z5 U
|
7 B+ Z- r6 [$ G- D* M: H+ G- _1 f. d" H* {5 T/ n# e& e! t
) D/ F9 Q; z) f. r: v
# V+ |' B( r" l: J# G, M: m
% E* j+ S5 g7 B# z% y
" H+ u9 ^/ w# u, c3 o
/ a" d7 E# T7 u1 T$ Z
: ]2 x, y; p" f4 M/ M* g! }5 @8 a
. j7 H: `9 U3 x8 p x|
, F$ ]* E# q" W4 p' }" N+ |0 m V6 | - R! ?% j6 a& d2 \" m; D
| " S5 V6 `0 Y' N1 b) H% a& b
9 d* r& P" A: L
1 N3 z8 C9 f" Q1 R9 n( o$ q) q1 w; g% y3 x
# r- v* D4 p- Z8 w7 C5 o
) _; E- ?4 Q, N; o" Y7 z
- g7 s) {; ^% ]- x9 X( I! A
0 a% A3 Q5 _ J
! Z$ J6 i8 ^/ l# I, Y; c|
8 z- e7 v* Q9 S, X" I 1 | 5 D7 N6 J; R; r6 n0 k, c/ W
| & F& R/ D' ?; [9 a' e9 [
) T. L* y# M' Q% y; N
* ^# l; Y. G3 K, V5 Q) v8 n7 }
) W, J" | k+ B3 G8 t& [& q+ m8 m! h* f$ x
% Y$ X/ G+ F7 _7 X; ~6 v. V! ~
; ?) c; h4 T! [$ h" X0 b# j- a7 u3 F3 ]
0 c- x9 L( ^3 w5 Y" A1 V, X4 C|
4 ~ Y3 a4 W0 p* r; Q 1 |
1 d4 e& ^+ ~9 I7 \; y |
0 o8 C5 o( Q) D3 ? g# k4 T& G- v$ z5 {0 S Y- ~3 `( @& b
+ F. E2 Q2 @3 h$ B% H+ I
$ K' M. {% N! @) n% `5 o* h9 A4 @6 T! ]; z' n" K. S
' [; F$ Y. w2 ]. h$ ^
" c- }: I( [0 t: ^' Z4 h8 O! e
; O! T( x* f7 V- P- L; m
/ D) {5 o; C; Y* V: g|
) a2 u1 U+ c; L) x# o 2 | ( v/ h4 J% e8 Z. n
| ) @ K% e* u& C9 t
) `1 B4 T1 o) l. o$ A
/ G% K0 l6 [2 G" a4 }' B4 G* Q9 {* e# G) M+ W4 e% r" C
6 I9 ?# O. A1 _8 V# Y
; V1 C' k) r% l
$ t3 f `4 H7 K2 i8 G7 |8 Y8 g+ `: Y- e. k" q5 c$ Y7 D7 y* l
: X( ] s) J$ e. x% ?! s|
7 m8 O5 J7 h; \8 s: V5 _' i$ X 2 |
; ^" n& Y2 Y9 O# Z# ?; { |
) ]* v5 H/ \8 q0 i8 p" a z
* I% i4 F1 H7 x+ F( T$ M. E6 P ^( [; p
8 L, L ]# o9 L& N6 v/ } p& q4 M# y8 D, S5 _
# N5 \7 Q, j0 Q# H3 d! B0 x; H
* w& b# _/ A! p: y8 }4 `+ H/ ?1 N7 S% r
; P. j9 K2 F6 J9 B1 u$ ||
0 s8 C) a; j$ p5 F. m$ m" z 2 | 7 M' X. V2 ?8 k. [
|
5 U8 k6 F/ u# F: A2 T
' t" x. r/ p- m7 r& y8 c# m
2 C2 R, w! w* Q+ n9 O4 p7 ~5 p; Y5 x9 r( w9 Q: O
8 v- l6 R2 K- {3 M% d
( c, b! }3 R, K" Y0 M& u8 m" j/ M {2 U# L% g+ a" g L5 t2 E
6 Q' f) r% T# `; [6 ]+ q
. Y1 S; d6 D, i, o# R|
, O! ~* x$ c, [ I+ |* ~ 3 |
, u6 K6 J" ^: X8 h | 5 ^5 f8 O! E I9 B8 t
7 }% S, N: i) X& U% V2 K3 D& }9 c
! g5 V4 f! g- X& N! s4 ^; q/ s0 ^1 ]5 y
' M3 c, |9 {2 P# ? T7 p
: W$ Y+ u0 M3 Z
. }, p! p* |& r @9 s3 i- }
# l) D5 V3 I- u: ~+ d: \4 v9 R. B' ^# e7 q2 ?2 n1 c
! w! h; H" o1 w) X" f
| , z9 ~# x6 H; G( T
3 |
( U# q; n. `: W5 E8 Q |
+ b% Z/ a# Y+ m2 I2 n- A7 B n X8 \; }) C
' |2 f( v$ I1 n' G w2 v% ~
\0 @. T. @# J; E7 o p) L: }) [1 w4 Z5 p5 k$ u
" @5 G6 I6 M5 K1 Y/ l$ z% l" Y- B A2 L* Y. J
! Q; p. G. @" |0 ]- ^) J% U/ X' o1 @9 v- }' b, [
| ! ]1 t5 Q+ N% W6 _3 y8 e; f/ l
3 |
u$ f) g2 f% Z |
$ p% d, g7 p' x
: q v4 c; {& C1 }2 g- `; t4 X! y( C) E. W0 v
8 L4 k3 _8 N' @0 f1 w# E" ]9 k
! S: B9 i g0 U0 ~& U3 v6 o7 O- m; K* F; c8 Z
* c( f* V0 ^6 w3 E9 i4 @/ i+ t3 W4 J) D- C3 v! M
* \0 {0 A: I5 Z* R| - L) i1 p/ i. ~
4 |
4 o; L7 [% s! S4 m | 3 k. b+ U! [, Q1 q, k; |) d
& p% r, A: X) D3 A
9 T$ u$ C6 g& F- Z4 ~( q; |
4 H R. u6 l9 ? t" E- n1 f
. B# h4 [3 d( k+ E" J2 D8 V/ L+ p
( ?0 U: ]) S+ E* h6 C, b4 q
) ^ E5 [. ?+ _( ^
9 G/ D& j9 A8 h) _; ]: k6 j|
+ V, o( `& a( \ Q 5 |
, D2 x: y" K) x: ?6 Q | val>val>val>val>val>val>val>val>val>val>val>val>为了便于计算机求解,特作如下规定:(1)节点V1表示树根;(2)当两个节点之间没有线路时,规定两个节点之间的距离为M(较大的值)。
' m; A8 @* Z- Y0 ]3 r8 f" i MST的整数规划模型如下:
# {5 U. E2 a& x& Y $ t# y Q6 f5 v( u. V$ l
) o% a& w; f0 D6 j
( x4 P! R+ y2 y1 ^" H
1 a- N. a7 g+ ?/ q
4 f8 ?6 p8 O! f- g- v 6 X! X5 C* U6 N# X: L( [
例7.7 分配问题(指派问题,Assignment Problem) * O; y- e/ f& p3 r# q: d2 g6 y
这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间 。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下: 5 C. I# T7 j5 j% Y
+ ~% o! {+ N. |: v* O$ k6 F 显然,此问题可看作是运输问题的特殊情况。可将此问题看作具有n个源和n个汇的问题,每个源有1单位的可获量,而每个汇有1单位的需要量。从表面看,这问题要求用整数规划以保证 能取0或1。然而,幸运的是,此问题是运输问题的特例,因此即使不限制 取0或1,最优解也将取0或1。如果把婚姻看作分配问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为 的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。
! N# e3 s& k0 smodel: 1 f3 R# O/ U0 w7 E( x
!7个工人,7个工作的分配问题;
. D' n0 C6 e4 t b0 u- Dsets:
5 k( u% c; u; H1 B) M workers/w1..w7/; 7 d3 i( B8 E/ y2 z
jobs/j1..j7/; ( i" ^! m3 J! j0 Q+ |( h" f
links(workers,jobs): cost,volume;
, ^6 Q. t' t% Q8 F$ W( Z4 ~endsets 0 D* T; V j" p
!目标函数; ' R9 e( w" [9 ^2 H: _& `
min=@sum(links: cost*volume);
! N" t1 Z$ X' a# r !每个工人只能有一份工作; 5 Y2 ]6 b+ R2 J4 ]6 ]$ f8 T
@for(workers(I): ! V" c0 e4 z9 I% `7 a: A% x
@sum(jobs(J): volume(I,J))=1;
y+ w3 y- S1 V2 c1 @6 [7 n, _ );
7 Z! H2 B" \. @. F' j- g !每份工作只能有一个工人; 6 p- O$ w9 j* q" n
@for(jobs(J): 7 P" p7 A( c& D8 d5 @5 L% w8 }
@sum(workers(I): volume(I,J))=1;
$ o% g" `" _+ i ); 6 F" b4 z1 s3 R1 S$ D4 m' m
data:
( j. `6 F& }7 o2 K( r) z cost= 6 2 6 7 4 2 5 6 \ W, }' V2 A
4 9 5 3 8 5 8 8 G. p W$ T U3 ^8 A
5 2 1 9 7 4 3
9 b6 ~) `) o. U/ V; g _6 h 7 6 7 3 9 2 7
% }. n( b' z! I( F0 D( s4 ? 2 3 9 5 7 2 6
( }4 P; Q! v% N. B) x: ` 5 5 2 2 8 11 4
: u/ i9 T5 n) m$ [/ { 9 2 3 12 4 5 10; , |9 W5 ?9 L7 S9 O8 g% ^
enddata
2 p$ G' Q; c) P+ g$ Lend |