|
求解最小生成树的方法虽然很多,但是利用LINGO建立相应的整数规划模型是一种新的尝试。这对于处理非标准的MST问题非常方便。我们主要参考了文[7]。 8 O" X1 a- F& v4 [5 D
在图论中,称无圈的连通图为树。在一个连通图G中,称包含图G全部顶点的树为图G的生成树。生成树上各边的权之和称为该生成树的权。连通图G的权最小的生成树称为图G的最小生成树。
: }( p% N- ^# `; p7 b/ F2 `许多实际问题都可以归结为最小生成树。例如,如何修筑一些公路把若干个城镇连接起来;如何架设通讯网络将若干个地区连接起来;如何修筑水渠将水源和若干块待灌溉的土地连接起来等等。为了说明问题,以下面的问题作为范例。
# ]6 O, `- E# C* Q/ `范例:假设某电话公司计划在六个村庄架设电话线,各村庄之间的距离如图所示。试求出使电话线总长度最小的架线方案。 1 a1 G' c4 M. k' m$ G
R0 W4 K+ K* r B
# ^+ N, ]! @! a% i
2 l! \4 F3 o7 w4 d* f$ R6 d# W; |5 f4 M) \( E. q
0 q- \' O8 u7 `4 u% h5 M- H
% p3 }( y( z+ Y! {9 U* J% G1 {* B4 J- L4 E# i2 `
+ Z7 O# G) H( `! h' k7 {9 I& u0 o' g, s7 ?( ]) S- F
|
\0 f/ w4 y5 _ V1 |
. ^( M3 w) f6 ^ | + S+ H( n4 k- S- R
% Q5 Q1 Y" _! z, o
) V( G+ k; J. m$ B7 d0 ^; H$ s% W1 }( H# {/ G4 `& {
5 X' |7 k7 T" _1 f# |* e& o
2 n. u) U) Z' y+ h4 z V8 K2 |# k5 k% f9 R) R1 k
& p. ~, j; B% M1 m& J' o
/ V. M9 g0 z. g| $ P R% ?0 T4 T) S9 i, N
V2 |
. U9 J2 f4 j9 h2 h$ O( E | " V3 V* S7 Q4 W+ }
* Y) h+ o, m0 i% _2 H% O
% ~* o( {$ B; O* O# @7 _2 h+ H& b; q0 j- A, d% P6 K
+ D. R+ M3 @) z+ T8 s% Q+ h9 a U; M
& l& d: t/ y1 y, `; s& C4 @$ z/ e- g- N0 ]# d
* E5 p3 m. v, k3 d' b
3 n' G% I( w5 ?) J+ X+ j
|
* i2 @$ w" S. \. u( U" K% ]* m V3 | 4 ]* c$ [& A T1 s8 a, D8 p
| * W2 o x: h# @
% ~& C9 m, U8 F/ [) w' R6 g' ?
' ?5 s9 A# N7 Y9 ?2 O, A% d9 w
, \6 A1 ~+ B- i5 A6 }, [# B# ]0 s6 ~1 O- g6 @2 g% i
; H* } c/ a( t
& e6 r0 P* [" @5 Y2 o$ T( |1 N7 Y% g( ~ S3 g4 a
k# e5 y0 Z; X5 X: ~| ' W! U4 ~$ i7 O9 }" ^/ o
V4 |
! S5 K0 K: A+ G0 g | 9 U# l. ~" p: r# V! ]3 q- f
# q$ c% Y) W9 b& G( [9 F/ P* H6 ~3 Q4 M, X* ^8 r- }
0 x) p+ }* e+ y! T" m4 \+ M+ N/ J! |& j6 u0 x% r
2 D/ ~; h0 K! b- M# @. W' m# {; A) Z0 m
: n& ~# l q' m' ]8 r
# c7 s% J0 Y' P r" Y+ x
|
" G8 y4 g2 u, o5 w. N& ~1 o# V V5 |
2 m' q2 ^5 I4 m! R | 4 M6 N2 A6 j5 Y: S1 P+ u0 i) ]
6 {1 P4 N) P4 K. f
0 z! Z! }+ r3 j$ Q' _1 c, z9 l, _1 B7 A! l$ y. S( C/ l' U; L
4 r' ~9 u& _4 |! Z
7 a" e6 N" B5 s6 D! |
' f" n8 w+ J- z& D3 H6 F, Q
" E( A9 f) J; Y' w& `
- i! p7 A; ^! j2 e1 [| 3 ?( k1 K1 N! m/ x; m" B
V6 |
6 ?, l- S2 ^8 p, w7 B% B7 b% h2 y |
. S1 _4 G) _3 U5 l: A; j. v
7 a0 \4 L( i; U5 U- y: ^
, v6 I$ C# m. _* G. E7 N: R9 Y- R, T, u+ _ H0 G
k! f* W+ X; U( w, P" C: u
5 @' h3 \- g+ h5 p+ V. L8 q* S
, o* i, ~) s+ A$ l3 l1 P, B
, S2 G$ Z( k8 D5 c! k/ o6 m2 o3 G" m" c) w; M
|
) j/ P6 K( t7 j% b 1 |
$ y) i" A0 M" s) J | 0 e z* m; L( g" d% n
# J c7 O( r. w
" {5 z* @; @" l* H9 X
& Y$ H# C+ [; a+ {, ~% g& r
. i) t5 B- `' d1 A8 b! J7 h5 B! w; }8 t7 O; ?7 h9 Y
8 S( D5 s* D% n
2 W H7 [, Z- P/ _! ?" I/ P
# k8 N3 _/ U) p+ S' U! o| 7 |) S1 x& B( O) }
1 |
. y! ^2 J9 S( |1 Y; C0 u9 S4 w8 z2 ^* ` | 0 u& v5 M, q; G Y- \
1 c5 z) c+ n% j0 x2 I- ^3 m( b( x
8 V e8 |: I/ J9 |: `6 f) s; p
$ M$ j0 a+ M( s' p2 T1 b
% C' Y" I2 o( ~: l: t8 E; S9 W' m( o4 J4 m) t! z. R
( f7 V. {, u R& ~
3 Q3 u) e- C, _) s) w$ U
$ N; ^$ e7 X# |- I2 A|
1 n4 Y5 i1 v% d 2 |
8 p- R3 N2 j. C% l | # r( p( k$ u- `' s
K/ W9 e' O! a" e! ] J1 u3 U+ |2 n# z9 z9 s2 A f
4 R; e; T! H# U, z% P% p1 g# R- k4 l9 h3 l+ ]7 q) C
' f: f. R5 H7 Y3 U' ~# X5 l% b
/ s+ ? S7 O, g+ Q* u+ q% Z# a$ Z3 u- a6 H% \
2 M3 B. ~2 W, K
|
: I' k3 F: x Q% Z) v/ C( Q+ D 2 |
! w) q) d( B4 A8 T- o4 C |
0 Q% u. p& A# m! `, Z& G& W
# N6 K0 i/ m( J- v! `; l: D$ `4 w. d( M! p' t9 R3 x2 O1 t& K0 }
+ O N# B. Z% O0 u+ E
9 p# x. s- U0 d9 V) `+ ?0 g2 V) R
6 J9 m! c, e% |$ @% n" _5 T" N5 P
4 ?5 P4 @/ d) Q& a0 [
$ X: [5 M$ T: U$ z
* D- ?0 [0 @3 x; w" q3 s/ k- ^
| 7 k) \, E2 D& `) p3 M
2 | 1 @ E6 A( f9 |- b6 q
|
! a# o5 g) P8 v# P
- y7 L9 p0 g0 g) q
, _% E. }& c) W" s" y: _. ^+ V
- U( V+ S7 v6 G* t3 c( Y e, A+ E
N; [0 B! x2 C1 _) }/ j3 y5 f9 y1 j( {7 P% q0 w
2 F9 i6 a: k! H# G; t# I+ Y u% Q9 Y3 N5 G9 ^
& y- x5 w5 Y* m7 H+ V A|
, n r% J, q5 X; v 3 | ) l) I7 d6 U: G: g$ M+ c
|
% d$ K4 V( X$ U% j
$ j" p9 U' y3 F. ~- v: R! o* ]% F4 r
: n& C' \- Y$ [$ C G' @
$ q: c8 M3 U; F I# N" j4 s
5 G+ N2 ?% R e- X' S5 v- a' |) F8 f& R: W- a0 q. s' _/ }/ I
; F* A0 y4 _$ }" W3 ^' |
2 `2 i$ P) h# e! r' _3 k
|
. U/ R) U0 ~; Z1 D* l 3 | % X; y' ]6 c) i3 s+ c% L6 `
| / i. {! c* ~. W8 l
, ]9 K# K. u9 V. k& n( k
' f" c& O0 p( [( h7 Z; o- E
9 \7 r: I2 D1 t9 p( u! W/ G3 y* S, D! h% c- p0 |; g
$ _: a# l4 \9 X
3 C0 J* n5 ?/ m9 i6 d+ A3 ~1 ?! K% o. ?6 r
7 [5 a% _0 c! ^' k/ A|
1 H# P- x L0 Q+ b" ` 3 | 9 l1 W2 w4 }& r- G+ O
| 8 T, `9 u# p4 ?! S9 G" h! y- `
* u! g% `- d/ F5 {
- {% [. a w: V9 U3 H3 J r5 V+ K' [# n5 K% H
) Y, ~ d' [# l& v* {3 Z
1 e- n% P, g2 _7 l/ I2 s% x8 `% X5 K9 h. y- U- g; f* N/ e# h
( U; x+ T7 b; _6 R" v) {2 b F; e, z6 j/ D1 y+ z# F$ Z
|
" D8 u0 t" f7 `5 @* o 4 | # V, ?5 k1 Y) C$ s E3 _
|
9 i/ |' K- b8 N1 |' m9 b2 m3 U7 r
% _2 `2 V" p, _, R
. F& C5 H, L& v0 U. b3 I0 h
/ I U c3 x& `: z( f; F. N: {; s7 a" g
- e7 Z* Y: N) p; _2 U
5 Y/ l" L8 l6 Y" g7 X9 z
0 [) `8 z- m( s| 3 j% V' b6 i3 N6 U! ]
5 |
1 [* w7 X( C1 |! L: w D6 _. C& N | val>val>val>val>val>val>val>val>val>val>val>val>为了便于计算机求解,特作如下规定:(1)节点V1表示树根;(2)当两个节点之间没有线路时,规定两个节点之间的距离为M(较大的值)。 % X" {6 t" n5 x9 W8 V) H9 j: W ^
MST的整数规划模型如下: " A$ D" u: H0 G0 Q- J: Y
- n0 Q% M/ {% h& q% Z$ V) o
1 S7 w; v: V( E' Q$ ?9 g8 c0 o2 S' U
Y. d8 i- p2 ^* o) }
5 L3 E9 A% F; @' j+ q3 |) f3 s
* w* x9 B+ g$ D; _: n
0 ^9 N) P! n7 S2 i- K! E
例7.7 分配问题(指派问题,Assignment Problem) & ?$ q* k$ l$ @) K- Q+ G- |
这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间 。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下: + o6 n7 L" U* y. F
1 C& {8 p7 J: G' J6 w 显然,此问题可看作是运输问题的特殊情况。可将此问题看作具有n个源和n个汇的问题,每个源有1单位的可获量,而每个汇有1单位的需要量。从表面看,这问题要求用整数规划以保证 能取0或1。然而,幸运的是,此问题是运输问题的特例,因此即使不限制 取0或1,最优解也将取0或1。如果把婚姻看作分配问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为 的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。
' o. ^& f! K+ D/ ^ Jmodel:
/ ]9 ?/ N9 n! e& s1 O, s !7个工人,7个工作的分配问题;
( q: w1 V6 u( l+ @sets: ! `$ q/ v$ f8 e3 `2 g
workers/w1..w7/;
, i% o% n, i2 i) n% L0 q% x jobs/j1..j7/; & A/ [5 P* ]9 t
links(workers,jobs): cost,volume;
1 }# _( O1 f: c* F; ^+ Rendsets . `" Z" b0 n' j, J6 S% c& j+ p6 I
!目标函数; 0 Y [% v) t4 ^! a$ Y6 X; a
min=@sum(links: cost*volume); ' Z8 U B+ I2 F/ Q. _3 a9 X4 Q; K5 G
!每个工人只能有一份工作;
1 O6 t0 J* w9 Z; \. k @for(workers(I):
4 h* V2 [* k) R: t @sum(jobs(J): volume(I,J))=1; $ o! y( M* f3 W1 k& c
);
7 w/ m5 ]/ o5 D !每份工作只能有一个工人; 6 w. f/ e' R" E# d; X3 [! Q
@for(jobs(J): 9 J3 Q9 E' ~4 N0 d" c
@sum(workers(I): volume(I,J))=1; - }, r. `0 z# P6 l Q
);
) N7 x& H" T( A4 l, N. vdata: " ?4 H0 |) Y) [
cost= 6 2 6 7 4 2 5
1 Y5 F; a5 W2 {4 O6 @3 w, R 4 9 5 3 8 5 8 * {& p4 N& y/ u3 Y
5 2 1 9 7 4 3 9 k, F5 r& S# S' ?: U$ A- H ?9 S
7 6 7 3 9 2 7 7 |: t& N% K3 o C; k$ m# |
2 3 9 5 7 2 6
1 [9 N# z. r; o0 S$ B1 B% h5 c R 5 5 2 2 8 11 4
6 |1 N; m& [& ]$ n8 C6 b" [ 9 2 3 12 4 5 10; * j$ H6 _7 Y N& G! E
enddata
: @* I! Q. L) X5 Xend |