|
求解最小生成树的方法虽然很多,但是利用LINGO建立相应的整数规划模型是一种新的尝试。这对于处理非标准的MST问题非常方便。我们主要参考了文[7]。 - Z$ [: L! r, c! I% j# D {
在图论中,称无圈的连通图为树。在一个连通图G中,称包含图G全部顶点的树为图G的生成树。生成树上各边的权之和称为该生成树的权。连通图G的权最小的生成树称为图G的最小生成树。
. H, L% ?) @! b' z0 h许多实际问题都可以归结为最小生成树。例如,如何修筑一些公路把若干个城镇连接起来;如何架设通讯网络将若干个地区连接起来;如何修筑水渠将水源和若干块待灌溉的土地连接起来等等。为了说明问题,以下面的问题作为范例。 ( F8 N8 H) M; E5 e5 K( k
范例:假设某电话公司计划在六个村庄架设电话线,各村庄之间的距离如图所示。试求出使电话线总长度最小的架线方案。 4 c% g$ ?3 D" ]. U, I% v0 f1 d
# N1 F; }4 m) u# Z1 p2 [: `2 ?
. S" c% m6 Y7 b2 P9 W4 y7 `5 k6 T( k6 p
0 m2 _ I4 {. s: H
, v" p C; S$ B6 n, F# N
- B( L9 s6 `1 {- r6 ~: Z$ ~
# H: p- q% n H! H* F
9 z; B, l3 O; l5 t6 \
. R' `1 d j8 V. j|
/ v0 C9 K+ }# d- e+ }; ~( \ V1 |
8 d. A+ `4 `5 ^6 f4 R | 7 F4 ]5 x5 M, c, O
: S2 S5 x) U* R7 s- F
6 j6 L, H9 o$ _2 K
2 b+ g! A, `- y6 `! V4 ^" S8 D
* B& d8 d3 k5 B8 _
3 g3 S$ X! [4 j1 k4 Q2 G6 e
/ l6 @! T% s; a) F1 ]
c9 F6 ?; }3 Y; I( j3 B1 }; l! T: I3 U+ k3 e+ Q
| ; L Q( s3 [# f0 Y' Y
V2 | & e( L8 c# K8 _# a# o4 ^
|
: C( Z! L8 d( H! ]2 J7 @% G% c9 O7 Y1 |0 P( @2 A
' h9 H3 v9 B% _) W5 a, c
8 K# w6 t5 r: n- u4 T* s, V% w
9 R# w( N! `2 ^1 o6 p/ s. f/ q! C& F8 v) N( L
# w3 O' V: T4 n3 k% [4 }# K7 x* S- }9 C6 r3 V
) G: n% o) I3 m8 p8 }
|
& _# ~: L+ T# @6 W V3 |
& Q# p" @) A: ^, C | : O- N: k7 x* p G0 y1 g$ k) o
6 M6 G7 ^# \. [* ^
; N5 r) ^2 Q5 y2 v$ k$ c8 M9 M' o" P; {5 B- T5 J5 e% E& g
7 g- E* {7 T0 @( f$ G
- p3 `: ?8 n! Z/ y: ^; f' k$ c( ~3 J5 h7 @8 ]
+ K8 T4 ]( g( k3 V5 S$ H9 t
9 q: T% g% l- b4 J8 A|
( A$ L" {% J) D9 q V4 | 4 G6 Y( A9 K" k' v$ G# h/ \; ~. r7 S
|
! L& ^0 N3 }( R6 j+ Y ]& x+ c9 {+ A8 n$ m/ [/ T3 w7 m2 I8 h
4 s1 h3 {3 X, F2 J9 v
" n* G$ B. b1 Q4 u/ {- X
$ F7 _1 G3 ]5 P: P% e
1 C; u( q. P3 \: h+ B0 {) q& W' N7 |
) w+ w; |' X7 H# {! s3 `
* g/ _: V: ?9 l- L|
- I- ^' j( ~- q6 ^* Z8 v- ` V5 | / P2 ^# p8 T, e6 |' G
|
9 ?* n8 p* j V3 _5 h* B
8 L% J/ m& x( j# i, l
% s: m9 U8 Y2 ^5 C# B8 P' q7 `2 P4 J
* J! x( l" v+ M; I" P) [' n- N3 O
+ |& a; j9 B; l4 ]0 d
& r, b' p4 y1 {! r
* b8 R5 y. h" U, }0 u
$ |9 A/ ?- y7 J- d( @- }2 N, F|
" F; h* T. K/ p, e V6 |
- X* w* c# m! n! C7 [ | 5 [& x4 ^, g0 {8 x8 Z: J
, M8 O* Q. ~9 [# ~5 G2 G
5 b8 t! }1 o, G, z |; n+ G. c+ Y! k9 P5 Z1 A& e; ]
' O; Z, C& y6 X
# R7 h- F& a4 Q. ^: d2 ^1 K) w) Y7 S# Z
8 ^% w5 I# N- h6 ~- r; ^4 o0 t0 q) n) Z- d7 }9 r% f
|
6 r' _% v$ Q; Z 1 |
" D1 _+ n) Z! X1 i u3 E1 g |
& t2 R( C3 x# V# C; \; z# i5 l. h% W4 @8 u) Q8 }- }# f) v
! U" k3 K' \4 B& k/ @+ \( S8 L8 `$ a7 |
* t1 d. L) [ {
' z$ M. ^ L4 [& x [( c0 h T4 K/ H) \7 @- j' Q
8 s Z# @$ |* ~! y. \4 Y5 c# I# \/ n& u5 C2 d0 e/ O
| ; r! u3 O r% Z
1 |
O6 W4 O# O7 V8 K/ D9 z/ h9 O# ~ |
+ g* i, _$ u+ t" O* [" _" l) k9 A3 X7 Z3 b0 l7 W; |
0 i$ j: j, O* w( ]6 E. r% p2 I) F# r' ~9 f1 E
$ g& J: M1 T7 ]* O
! q! w) {$ }4 ]6 W/ z* Q) I& T
1 P# {! ^8 [! d: Q$ a0 Q+ k; Y* M
$ y" Z/ G' s, x( A/ j% Y: i, h4 K
4 g# Y4 {( B* P# }6 \ c| 8 I- b' j7 `& w9 {/ f4 ?$ t; F
2 |
" C8 W+ ]/ ^; L0 v2 @6 Q | * z4 d$ X1 N% A* B" [
& T" X* c. c! x8 A; I3 V$ s9 W* p7 H* M
" a9 J6 [$ p9 `
8 b1 v, @5 F8 S& G# c `1 T/ h
, _+ J: ?- f* @* u( C. ]2 d
4 W- `" O( {: u0 I4 D
+ x) T" V) L/ c; f# Q( A7 y7 f& }" g9 f5 S0 \9 Q' x3 K
|
* b( i; N) U4 ?# w5 v* z 2 | / o8 `+ c/ y2 R1 }# S- A1 R* t7 W, k
|
' N# ]! W: [' g5 ^4 p' C! N
/ ~% Q7 D% k+ ?' G, T
& Y; l" @( o- I2 }$ ~0 z6 b
0 T7 J% r- F. J8 K4 n8 \3 f' ^0 I1 d% @0 U8 ]
2 |- Y0 F( C# J' | n& T8 T* X* P! }7 K
& n7 ?! r- @$ K$ |7 v, U3 p# ^- ? |/ @8 y. q$ \5 }* z j
|
: {7 q3 R* g7 \5 d 2 |
8 x, I h; Y' p7 H, E3 u |
$ N6 C5 w! K) P) i. S# E6 H6 Z" Z$ w3 |% U4 e
6 n7 t0 l# {6 _1 ?/ r, n$ T% R1 z$ b7 W/ e
: O7 _' n3 m' h/ ?" c0 R2 `
( b' t6 i$ r" ?# B; X# Z" L, l+ E0 G/ d
* r9 C7 M; s ~7 n, ]2 `( ^5 h" T+ S3 l+ |7 v
6 K7 s% q7 q- f1 m
|
5 c% ~8 M' G. {- V3 ^& A 3 | " d$ z2 g+ u6 ~( A: }
| 7 f- R0 Z0 c4 _9 W% x; Y; C- N/ }
3 \ m: F% p; O% r8 D
5 A: h; F6 }) A! j4 `" z% l' f
& C4 l) I3 [4 X2 u% P3 x( ?2 P" S8 u: _9 @
5 ], s0 v$ W( b+ o6 i, n' g0 k( a7 `* {/ W: Y5 C
: w9 `$ t2 H& w" U7 |5 o; ?7 a
7 q O: [9 G, Z8 Q' p! `
|
* i) R, D" E2 ^ U8 d! L# B* G" i 3 |
0 y$ L: y# z+ P4 t | $ _/ d( _1 p% c* h8 W/ H6 O
: N5 W ?$ o" A8 k% m: A& u3 Z* ^/ v4 b0 g
- B5 a/ J" q# h" G6 F7 e# W4 H2 a8 D
/ `7 W8 F; T! E' ^& [
+ Z: x* @4 E4 Z7 R9 l
6 p5 r( s) `3 Z6 `
8 J. G/ n- U {- u" ]| 7 h; L) L* t$ j/ Y
3 | ' j# \7 w8 t: a/ S
|
, g* _" u k& l7 m/ P
0 R/ y8 n6 p5 N9 \' U1 V- g' r% k4 A1 y. y
% d. o: R" R/ P$ J4 L
+ O) Y; X8 M s7 B/ r. C# l9 }$ m, O6 a% O ^# }! g, E e3 n& o
, x3 ~# m; u0 Y! Z
- ~9 P( c2 @ P0 j9 l N7 s4 t7 Q# @: Q9 [+ c
| " p( [3 a0 B* F1 T: R
4 | 5 s" r/ r4 D7 [
| & f- e$ A: `2 p- U
' Z% j! g$ y$ K: Y; r& G
; w- z! U$ `- ^8 a" V% A
% b: I) [) v5 S8 o6 O/ E
+ c! |% `# Z5 @0 S$ i1 O3 M
0 j2 W) j3 ]: q6 H, l$ t
1 G) \9 m) E$ j- U" ~, P9 W O0 D4 K% @
3 x' U( D# c" }| 0 g3 J E7 L g" |0 X2 _9 o9 q! m) k
5 | ' |5 ?; D2 ~7 a" |; `
| val>val>val>val>val>val>val>val>val>val>val>val>为了便于计算机求解,特作如下规定:(1)节点V1表示树根;(2)当两个节点之间没有线路时,规定两个节点之间的距离为M(较大的值)。
1 Z7 v- U; c4 C& h. i9 _ MST的整数规划模型如下: / s7 K2 w+ R9 K' ?7 m, `% @
- S% y& l, }# S- I# e/ t' O 6 G6 Z/ K6 V* |8 N0 F6 ~
7 e: C9 M8 Z, Z" {) S# f* |
& \- o( d4 M6 J- _2 [; f. o/ V
5 y3 Y# | j8 } {2 K5 y# K- {
# p. ?7 ?( L# ~0 R: g! q5 G# i 例7.7 分配问题(指派问题,Assignment Problem) Z z$ z T1 q, i
这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间 。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下:
4 v8 ]$ Y* w% W( c2 b 2 y7 R& W. I7 Y" W- B6 ?7 n
显然,此问题可看作是运输问题的特殊情况。可将此问题看作具有n个源和n个汇的问题,每个源有1单位的可获量,而每个汇有1单位的需要量。从表面看,这问题要求用整数规划以保证 能取0或1。然而,幸运的是,此问题是运输问题的特例,因此即使不限制 取0或1,最优解也将取0或1。如果把婚姻看作分配问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为 的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。
" X& C" [2 G+ v/ @7 w# o; Xmodel:
8 k8 g7 p/ x' |" ~5 [8 O !7个工人,7个工作的分配问题; + }! ^+ N' [. o' V, h1 F3 G6 B% s" t
sets: . z& w3 J: \, G" h) \* n, n
workers/w1..w7/;
6 y8 U3 ^) F2 K8 x jobs/j1..j7/;
( i) |3 z; x1 e. y2 P links(workers,jobs): cost,volume; 0 D$ H: k/ h. F4 U
endsets
" v% R3 \6 n0 ?) C/ x1 K !目标函数; 7 F* p6 g! m6 M4 @
min=@sum(links: cost*volume); & O4 w# ^6 B) C5 x" C
!每个工人只能有一份工作; 3 D% m, R6 N3 Q+ \; Z' g3 J
@for(workers(I):
7 M; x7 [$ C9 G" ~! `" _; X/ g @sum(jobs(J): volume(I,J))=1;
; ]" z, n* Y3 u# q- i J8 G# {/ p );
8 _' u/ B- v& M( O) [( c0 I !每份工作只能有一个工人; " T0 f# X4 {) D5 [% }/ P. L
@for(jobs(J): ; c8 g7 P' w! ]5 M9 Y! y4 ?
@sum(workers(I): volume(I,J))=1;
" Y* g& r4 O/ ~) F8 A/ r D; Y );
2 r: n) M, |# Pdata:
' J5 t7 v8 i% J" Q cost= 6 2 6 7 4 2 5
0 h0 T+ M# t& z2 z 4 9 5 3 8 5 8
2 g9 \1 t9 q' o 5 2 1 9 7 4 3 - r2 J/ O i$ }0 P
7 6 7 3 9 2 7 - o' F X: A6 ^6 D( h9 C
2 3 9 5 7 2 6 ' O E# E+ {5 v' Z- K) }4 s7 D$ R/ D
5 5 2 2 8 11 4 ( B: y7 p) T% Z% X7 |# B. T
9 2 3 12 4 5 10;
: q- z9 n; g1 p: F% h7 D5 |" D% xenddata
: s& [; u% Y2 }2 Jend |