|
求解最小生成树的方法虽然很多,但是利用LINGO建立相应的整数规划模型是一种新的尝试。这对于处理非标准的MST问题非常方便。我们主要参考了文[7]。 5 q* J1 a8 R/ Y t: C
在图论中,称无圈的连通图为树。在一个连通图G中,称包含图G全部顶点的树为图G的生成树。生成树上各边的权之和称为该生成树的权。连通图G的权最小的生成树称为图G的最小生成树。
1 c T# t3 |$ r3 a% S, J许多实际问题都可以归结为最小生成树。例如,如何修筑一些公路把若干个城镇连接起来;如何架设通讯网络将若干个地区连接起来;如何修筑水渠将水源和若干块待灌溉的土地连接起来等等。为了说明问题,以下面的问题作为范例。 ! v2 E7 I, r7 }0 k5 K: e$ L- Z( l' V
范例:假设某电话公司计划在六个村庄架设电话线,各村庄之间的距离如图所示。试求出使电话线总长度最小的架线方案。 4 C! J( T4 y% x% r" f
8 j5 n( R1 d' j q( Z
) Z4 u1 {* W2 N* h5 f0 |
7 x; K, I4 f1 o. w* k3 }. H
: ]: f. `8 N% ~( c. m1 O; F
* R7 X- o5 Q! o0 y- F9 u& x( v$ m5 Y
9 u2 E0 }/ C0 y& o! O
+ K6 r: T* E% m# H6 J
; y0 E. S2 h/ n& A( U! l3 }, }8 Q h) n( {4 z! P6 @* X3 g% y F
| 0 ^8 Y& o* _5 |3 B% a, z
V1 |
- |; v* x7 |$ m, K$ a | 5 V/ j6 G: o; N: e
" B) v& p M3 V! u( V: I7 |8 U, C- x% N- F' f, }* G+ A
- p/ R' @4 l' L3 ^. \
! Y- w: ?$ g- C/ x% c: `( k! k
8 H: q" \/ h6 u& m9 K! R6 }( f: j3 G5 @
! z- T) t* o, y! u8 K) Q
' n0 F& u8 ]" O5 p O o
| ; S+ g; t# Z. G5 R3 I6 q1 X9 s
V2 |
v, j4 q/ P: Q" }) _% o* V |
: `$ d6 E! C, L* Y; F
8 I+ P6 q3 d, N ]
! f) T# E; N. {0 I9 B& f O0 z) J7 B2 {* Q, U% q. I
7 G3 G& r; k" m1 X! ?; t* ?% @! h' o9 e5 w( _8 n
. Y+ `$ h! n) v8 O! {
8 x) h" l. e3 h* Y. b
' T& S. p+ W' Y1 q+ k6 n| % u- Y- Z. z3 y; H/ c
V3 |
+ f( R! j* T% z |
+ D& I7 i2 u& K$ z7 V
7 r i* _/ A) u" a* Q; R
$ ]: Z. Z4 p& m5 q& K( R8 l$ V5 C! k$ L7 U& \9 B% }; |
0 E# `" @+ |; ^1 j, z& }$ a& H
' j; P4 z- z: E5 @/ {
4 i9 m1 E9 {9 e1 `
. V0 z; D. E# @' u" y. p8 i" a! O/ t2 @3 w1 w
| 8 w, g0 w$ b* M1 [) @7 s: |
V4 |
2 Q2 a! B7 ?: y | $ g! y0 \+ _ N$ e9 m1 h0 X
' ]" v# o' c+ O9 F a6 n) {
0 C' H# l; f( E) F& c9 l; i1 c# T/ D* x
; |$ d$ p6 t" `7 k7 }/ I+ q4 i B' u
* I( H @4 c: \, R0 b( {+ Y3 p
$ T2 K% p: P- e) i3 n
k' V- l% C2 X
) b8 T7 C; n7 \8 h) {5 J. {% U+ S|
# F. W- I0 x/ Z! R) j V5 | 3 G2 o3 w! Q u; }. N$ j4 t% E
|
7 t, {1 z$ B/ ^# v4 j, H: S; j& a7 g, U6 w7 W) s3 ~
: w* m5 c4 o% F! q
7 s3 X$ v9 A( e/ B, `" k! P& R, s; v1 M. ~4 t3 u# j( d9 u# u
; y) U$ } B# i4 v4 E( H6 ?1 x2 R: V, [) j- p) d" G" s
: g. J$ d, }+ ^& m3 y1 A
6 c. v$ J' P7 c% F| 9 @& [& G/ i' f8 m \- M* a
V6 | : O( l& k( p. e! r4 ?8 @% {- z
| - j8 y! Z4 g" x2 v6 r7 @
1 ~5 x$ R h0 |# B
4 t/ ]; ?, Z, S6 `% j+ ~( o" C8 o
9 }+ D. y9 R- x) J0 p" I
: R" T+ o; ^, c/ r* W; Y) o- L" e" I- e) K a1 N" c) t9 P
0 Y( Z0 {& \; j3 z( E
3 H( o: ]% B; G7 ^ Z* W: b' P| / r3 n+ n% u1 }( {' @
1 | ' v# C4 y* r' L9 G7 G9 v+ R
| " t& e3 W3 @. u
, a6 [& t2 Z2 \1 I$ Y
6 K1 b0 Z: o, f" q7 t# {4 [2 p8 }: B6 X1 U+ Q _, Q
9 g, U" X* R$ A9 T
! }% [. j# U7 q( I; m
! `" x$ T3 I4 o5 T9 s
3 L7 x: V, H; g* ]$ S, r/ ?$ ]: z* W/ o# \) W" |0 @
|
0 J/ B [4 M$ p Z, B- |0 A 1 |
$ O, \4 @9 a* ?6 B% F |
% H7 ~3 |) z; ^" f* w5 L# { t/ z5 K7 K$ Q+ v
# d9 a7 K. i; e5 @% S0 q
; @! S2 `! f$ a% _* @- H# m2 c. p( C/ e6 Q! b0 m- S* W
6 z6 q$ U1 Q( Q* f3 m/ O8 m) q2 |" f" F) R: w
2 I) v+ v; G2 ~4 G3 P( m
8 X5 @5 K/ T+ U% p5 P4 a|
+ u* I$ Y% ~, m4 m4 T0 r: f, q 2 |
+ b5 F" p, Q3 X; W8 X" l4 ?5 t6 F4 F |
6 i. }$ y3 e! \$ x& v, L
$ \! _3 o3 i0 S& A6 Q) s) `
$ B( H( K2 D9 W" t. g( |( Z, A, \
7 s6 {* i7 G5 f& Z$ r
' n- q( }4 H) ] o/ y' m( o# F) o- Q- ~) K
+ m Z7 v& u# b0 r2 z y3 r! O9 S
| ; ]$ b, B8 n: p G) u7 A
2 | . m6 T$ Y; Q2 {% c* Y$ f
| ' g( s9 i; V! a1 O6 R+ o% o
$ y$ ~% h! B" c! e# _
4 @0 J! Y! V1 A T& \2 C( _. U9 M
2 Y* S- k2 D6 K! N* R3 I5 a/ D) ?! s6 Z: Y9 O5 a/ R, h3 F, R
9 D0 K f9 F1 ]' |6 W/ t. G
% I0 L8 _! J- Q" A7 f( F- L$ s) t7 C0 T# h4 a! w: ^5 C
6 Q& R6 h6 ]* }2 ~|
4 o E. r2 X m! G" \( M( C- `9 V 2 | & N) ?6 j" L% A& X+ L8 d9 r
| 7 x9 _) |- _ w" @; v! V4 z1 d
3 ?/ b4 m3 Q2 W' I7 c5 |' C
# @$ M: C( A% w' j; X( h! X* V/ ]. _1 i1 V1 K6 _+ _2 F7 R
2 F$ _7 J, x- G5 A
( M( U# H/ }9 b5 E. L4 [( Q
5 k6 D! H; k9 I( Z$ e2 g/ a
" i" B; U. Z: \- h1 m( w4 j, W. T# X5 D Y) J, D
| # X( f9 Q. j* `! a+ o0 E; v n
3 | , d* T8 C$ A; Q K5 n
| 5 q4 H0 b* z5 ~' ^, j7 ~$ z2 ^
# \8 [ M' q/ C- ?- Q" @
! G, R: i' o$ }1 m. r* F
& a( s m# r* L2 {) o! B
3 F6 U8 }! w; ?, w0 @, f6 d8 j3 M5 @9 i! \$ j, J
9 A% i6 e) b; ^$ j' R R1 a
3 P1 e( I$ T2 S" b5 E
% I, p- @" _0 T% c8 O| 2 a* G8 K( k3 V: _+ e- O% d$ W# i
3 |
4 z" O) {$ }3 Q' T# _ | : B0 A" T4 q) X2 [9 R2 f
' r% u) z9 m: Q2 e5 i$ G
3 c* \2 g ? A4 d6 L* c- Z2 t# j6 X4 D( w T1 v% l
4 _ X+ B7 f: U7 @4 u; `
. y7 {! \/ }3 W G, v
; a# ~: B- Q `) {: q" f4 f/ M3 v L- W7 g% h
+ j6 f' @; Y+ r' y. ~" o; ?2 y/ d|
" e6 ^6 q7 Y: E! s 3 | 2 K* t, `) t6 k& ]9 q. z3 b; P
|
$ d0 j* l& A6 v. V9 u+ @( d+ ?4 V9 {! k* B$ O$ d1 B! q, m
3 o1 z1 A0 Y& G e' w( K, |, p9 _7 D' O# ]
6 ~3 Z* u# i5 a+ U% h$ X/ ^# D2 a4 \6 R0 c. m; P1 H
4 h; a0 M2 F; ?2 s0 C0 u
& A: S& v" {" ^8 \+ W: G+ r
8 I% s; c# `+ k& N* Y$ d* ~. y+ W|
+ W" s1 G* G7 e. G" q3 r+ \- u& N& W 4 | 4 e$ r% T6 U8 j% ~/ ?+ N. a
|
7 c' h! p0 |! E* G1 Z; |$ q7 ?/ x0 x4 K6 q6 o; ?7 U
& V4 @# G8 U' ]7 y3 v4 v' S; d% g: [) P2 O Q1 P
; l+ |, M, t& v: d9 [
L& J1 C- s4 ?5 p+ E# g& q5 f
, j9 K, ~8 H, Z/ n1 [ ?
# I0 w5 ~8 L% G+ X6 H
) ^5 m. _. w7 v8 B, ]) M| ) V. X( f8 w; K! X: E1 \
5 | 9 X: `9 e& Z7 |: D
| val>val>val>val>val>val>val>val>val>val>val>val>为了便于计算机求解,特作如下规定:(1)节点V1表示树根;(2)当两个节点之间没有线路时,规定两个节点之间的距离为M(较大的值)。
0 G" Z% a% k8 `7 j2 d' L; R MST的整数规划模型如下: $ r# w8 f3 @$ M' G- ~2 F
- ^% F* }- m$ b9 h" |. U 7 ^! h8 R. q8 M/ k
7 Z3 |1 c- ?) T, k4 R/ f/ n - n% @' s9 f5 s) s9 [9 j
5 ]/ x8 B4 }- {0 R+ s
. |" [8 [- K' s& p) m2 k/ t
例7.7 分配问题(指派问题,Assignment Problem) / t7 R. m2 ]! z' U4 M2 Q" C
这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间 。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下: 7 A0 }& m1 R) s
1 E1 r7 C; a/ v" w5 e! r2 J6 s
显然,此问题可看作是运输问题的特殊情况。可将此问题看作具有n个源和n个汇的问题,每个源有1单位的可获量,而每个汇有1单位的需要量。从表面看,这问题要求用整数规划以保证 能取0或1。然而,幸运的是,此问题是运输问题的特例,因此即使不限制 取0或1,最优解也将取0或1。如果把婚姻看作分配问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为 的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。
/ i* E% s. @3 Zmodel: ( g8 l$ j5 X, u3 C C" D N
!7个工人,7个工作的分配问题;
, D4 m1 A @: S. f' esets: 2 V3 Z9 h$ a3 ?/ Z$ S+ \6 z, w
workers/w1..w7/; + J" q; |( x3 K# R7 {7 i7 D
jobs/j1..j7/; 4 N; {' g! e$ i9 l5 o
links(workers,jobs): cost,volume;
% W/ k9 W# p5 Q- Zendsets - {4 m$ o# c S C1 Y8 a
!目标函数;
- q2 l$ e0 a$ R: m9 C3 l min=@sum(links: cost*volume);
[8 Z$ }4 q. j {. V !每个工人只能有一份工作; 5 w, q: f& O( |, A
@for(workers(I): $ R6 G4 L# P% m8 y7 ]
@sum(jobs(J): volume(I,J))=1;
5 N9 [0 m" m. h& G ); " f, [1 M" }3 H6 j; u, A
!每份工作只能有一个工人;
y4 S" {0 G7 \( M% W: ] @for(jobs(J):
3 M d6 f+ r& H& B9 I/ E @sum(workers(I): volume(I,J))=1; % |+ ~$ I2 ~" t# b5 p; J
);
7 ~; G. l% r/ N. C7 y$ fdata: ) {* I: n2 L# x
cost= 6 2 6 7 4 2 5 ; E4 [$ G, u8 ?
4 9 5 3 8 5 8 . F Z+ W* y2 P1 R- Q+ T7 _8 B
5 2 1 9 7 4 3 & B9 P1 r4 A9 M9 P
7 6 7 3 9 2 7
6 V; j+ ~* A6 v3 N 2 3 9 5 7 2 6 & V& {6 s! B k- i J6 a
5 5 2 2 8 11 4
- A' ~1 O& T0 F# R 9 2 3 12 4 5 10; 1 a" \8 k8 T4 N9 k* |; p+ [. i, b8 t
enddata
$ R! p! I4 ~5 F' G' Xend |