|
求解最小生成树的方法虽然很多,但是利用LINGO建立相应的整数规划模型是一种新的尝试。这对于处理非标准的MST问题非常方便。我们主要参考了文[7]。
( D1 J6 J! {+ b在图论中,称无圈的连通图为树。在一个连通图G中,称包含图G全部顶点的树为图G的生成树。生成树上各边的权之和称为该生成树的权。连通图G的权最小的生成树称为图G的最小生成树。
0 Z0 q1 m7 {& p$ E; ]许多实际问题都可以归结为最小生成树。例如,如何修筑一些公路把若干个城镇连接起来;如何架设通讯网络将若干个地区连接起来;如何修筑水渠将水源和若干块待灌溉的土地连接起来等等。为了说明问题,以下面的问题作为范例。 - z0 e6 B- q3 M/ g/ ` \; ?
范例:假设某电话公司计划在六个村庄架设电话线,各村庄之间的距离如图所示。试求出使电话线总长度最小的架线方案。 7 n: Y; D: B2 a+ A, E% E( e
- g5 i. c$ ]# M% X# o$ {4 _- n0 C5 m0 d
3 f) s* ], o3 j. O: z+ T' @
. P/ |! y+ i) u) G9 ]3 Q7 x* s! t5 H0 z: H- j2 ?
' a0 _7 v% G2 B8 j' c% c8 P1 m1 n0 i% t6 v. N! C
$ n, f, H# X3 m9 h4 f
7 ~6 X4 m6 U8 o# ~3 T5 x- _9 t& }/ e
|
9 g9 r8 B5 t R! B; T h V1 | u% h1 a# R z! j" `
|
+ D$ n( Z$ Z) ?
- `, t- P! C t2 C3 o
# y2 q6 t/ h7 m# E
$ o2 [3 r+ ~) M! H2 e( F( M4 |) V- d# L# Q; g6 z) p( W( |3 {3 S+ i. O
6 I4 D. a _! a3 L% B! C
, r6 w; f5 e' e
! T- A+ c0 W; q& ~+ P% Z& d+ H1 A# V+ y( `0 ]- b; i- K" N- i' `# ?
| , y8 f2 @" { x' D
V2 |
4 Y1 e* [, n9 {6 J4 Y |
! M1 l8 ]( J( j! k4 w, ]) J( q% Y6 B8 y
6 I/ R M* n( w
% |5 R$ L) A* D
+ }6 {/ q/ i c6 y$ T# z: ~% V1 U3 ?2 @- [. m' S* m/ E
0 B# Y: o* i, }7 M5 c3 k- @! F; k; _0 F, q7 _
b! f+ O$ l4 g. w6 [9 l8 X+ r
|
' k; V& P& L2 g% u) w& F9 ~ V3 | 9 i; s4 }- @# V
| + K, l( m: z: T0 ^7 J. P# R7 {$ i3 q
, U1 t2 {; d }1 h
, H0 W1 K: Q0 H
9 {+ G4 R1 f- d, k6 Z( A) y
2 S1 `8 V5 n. |3 r
! f: v$ _/ Y4 P. i) P+ E8 b! o9 W
! d7 v5 K. b6 W
2 A$ l5 Z1 m2 g! v6 {" S1 X* F; I
) b# s) u) a6 s# ?/ v; l! ]|
% M2 l1 s7 ~- b) f/ V; Z8 }) V V4 |
( A' H( y3 F& {4 s+ C6 a | : e& M! X' A3 Z1 I0 Q8 t4 T' C
3 L, [8 r" I" D0 x$ F: I2 I5 n, W' q2 a1 \9 C2 o" z) c
; X% _, H& Q: k! t1 ]8 [/ @4 t2 P k0 A7 O6 F" z6 F8 W8 _
L9 R# ?7 ?% t
2 L, a1 |9 v* N' H: I$ x! l
# L. C% ] U+ L. C; f/ B7 U( \1 {
" F8 O! R! {- M" u1 r/ M| 0 C% j4 f- d) k. B+ I1 ?
V5 |
+ V$ G& S" J4 V) c3 D( A. t | 3 w1 k, O- [/ d5 k) o& ^( B
" R/ B/ P5 M+ G- n' \
% ], g- c# C' X0 P/ i* z
& N, K8 x6 w5 d. n) c2 A
( G: u+ [$ H3 [3 q$ ~
b; l, u" w @& Z/ ~0 ^- d
/ k0 t3 r# `- l4 Y' E1 r; ]
5 c4 O% d' Y: w# S7 _
$ z- g9 V8 @: t! f9 Q( D" i| 8 ?$ Z, e, J2 ]6 s3 j' {
V6 | % ]1 `" u- ?4 I% e8 W2 h
| 0 z1 }6 |: A; x( z
0 |; T0 @+ B: n1 m$ {, f
) T/ K) O2 d& g/ r+ L% f0 J4 V, _2 [6 \3 C4 U# b
% p' D" |' F4 x5 ?+ Q. p! ]2 \
5 T7 M$ K- o/ x3 l2 f* @
+ d7 ?" q$ B9 ?: X% C" H
# i9 J6 x6 h" j7 g
( i- }6 ~; R3 o- ^, ~| 3 ~, }. s' d9 b6 T6 ^, Z
1 |
. s! m. s( F" H9 D5 n |
( S4 `) h8 C2 j7 `2 N' n+ m0 }9 G7 e9 ~. p
! q' k" @$ }- C1 X- K) T8 }5 }! T" v7 r
5 Q6 F g. j- p {3 \6 J
+ C3 [4 T2 _) _! I6 D
! z4 q' t l/ O: T, |, y3 a3 k( l) R4 k; I
7 d$ \" y( y& ?) ~* j: E3 U+ ~, P& t( z/ {
| ( `* M. D8 D: `. c0 Y/ p
1 | / p0 ~% y& @! ?! }0 L0 z
|
5 t1 I% [3 _ W K: d0 {4 b
! u1 f; p" h5 t0 |3 `1 i# m+ T1 l0 V
5 p' K- J( F1 d$ Q1 T! e1 }/ r5 ?9 r: q" e
% {& d* m9 ?6 {' O8 b& a6 U: B
" D) _4 e# S0 X( e1 o; F* |8 Y6 h. m
: _9 Y! Z( N! R5 t9 E
. g! \) B* Y8 D1 @|
6 T/ ?; |* n2 R( }2 R' v 2 | 9 b& R6 k% B7 y7 F1 s
| % N4 N0 g$ [8 v4 E3 u6 q9 B$ o
" g9 c6 i- Q4 [" Y P
! w1 m( r! F& U6 x& F# q
- ^' J. ^. p$ B8 T. ~# R% b9 }8 F4 F. @0 L
1 x. e: e% L' e( V5 |1 W2 i1 p, K
" W/ A1 g H$ Z5 |0 d# x" o8 e
# i0 K' Y3 H! ?6 y3 g8 z, D
8 T1 k& n! H) v|
5 A) K5 g8 q$ i( b0 o; z3 e 2 |
/ b% m. }/ p9 {& \ | 7 z+ i6 y* {- a( O
k6 m; a: m; ]" q4 A1 C5 B+ b+ T5 }1 O! L; R9 ?
+ x3 w! W# m0 x3 `: j4 i7 ]! _
/ i; t, H! h4 M- i
9 q& q9 H N6 e3 P' t4 H3 s
$ q# d# i- I9 v3 M3 D& b$ A
7 u9 J) e8 d# F. @3 e2 }
1 f; l$ m( q+ e8 C1 |+ n| % N! K/ J% F* g, i. [; F Z
2 |
/ |+ d1 A; G5 ? | 8 q" ^" u- s X4 M% F
) m: m- ^3 ]9 c
" b4 L* h, z$ _: x4 A' s0 A9 @% e u! R8 f4 i% R, x) e' e- ]
g3 S7 W# C8 L. L
0 D- I5 S y7 A) t0 a6 q" H3 A9 _
# |/ d: x; [# }% t
. n |- e, @( f u3 @# n( l! b
9 n8 }( i ^2 k; l) l5 ~|
1 f5 w' i% U% e5 R: p2 m* e7 y 3 | 7 v) c# H9 w& S# b! C! F
|
' t, D& F6 L7 v: }" @9 x' K! o7 q1 o6 C
- q' f: R4 x, `; ?" x
4 }; X; i* ^# E- U1 p9 r- t& X* n
, g0 J3 N/ P6 ]% B/ K* a( j2 r% `, Y+ u( {
: K, a! X/ n* ?$ U! D
+ r) L+ k% @* B+ g/ X
9 D4 A0 o; n3 k: B| 8 v5 x. T8 ]1 c/ U2 U
3 | & t6 ?; x% G% y" q: V6 K9 Z0 T0 d
|
- N- b# m! F1 q( e, v/ ]3 H* s% n- C5 K3 k# \
" x( T" R& \0 U* ?; i
* O+ r. |) g% _6 Y: [, I% d2 |1 m& ?* Q, g
- T, K: W' ~8 q0 G
" [% _! O1 P! A+ q2 r: v1 a: x; w
1 R. p' _& v& Y! q1 C
' U* A( P' i' L4 }& W. j; i|
# |" B+ M+ G6 \ 3 | & Z. h$ ~$ O# @; m/ @8 B- B1 D
| 0 w8 Z+ j, l2 ]6 b- t9 B
4 S1 t% v! I! O
/ l3 V( f5 A" J8 _
4 @( b6 _0 m3 B; ^$ S: d1 A7 r+ T% ?, j* d: M- O
4 X6 S; i# P( J/ I! \& |% |! m
* ~0 _, N& r1 V. f
% {' i) ~1 m6 @" A" m& c
$ t9 @7 w2 ?7 z
|
; P' R Y: f% L" ?% `' _ 4 | 5 @8 ~9 E7 e, @2 q+ h- h6 R! N
| 0 ^* v$ r0 C# l3 y% {7 k4 Y
9 ^) [' X0 F( w. {
+ }2 W: d. ]" Q; x1 ~) N+ N& E5 e
5 U$ ~* F3 L- {5 d- j: U: x% S5 h% `
9 S6 S- N) c# T: m/ l
8 ?8 G9 U5 Z4 |0 t
7 e$ L$ t0 Y, B- t+ K7 O7 \| 5 x3 B0 t& X5 M- |
5 | % Y* l/ ]. z8 ~1 k$ B* f! Y
| val>val>val>val>val>val>val>val>val>val>val>val>为了便于计算机求解,特作如下规定:(1)节点V1表示树根;(2)当两个节点之间没有线路时,规定两个节点之间的距离为M(较大的值)。
6 M$ }) f7 a+ [7 ?% d MST的整数规划模型如下:
) N9 z1 f9 Q. |% @- Z & o" c$ F/ N ^- @; d
/ j6 U- s. ^; s4 s7 O' R
$ l5 U. I- ?4 v# p" F8 C5 a# u2 i
" P0 B4 \( c- L# P# x
7 T! f! } _* Y+ E# V5 n7 J& R1 Z
; I: B. ?& M5 E* a" z# @! h 例7.7 分配问题(指派问题,Assignment Problem) 4 L" F, {; d: F1 |/ `4 D+ O3 R5 U
这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间 。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下:
! C- _( {' n; \* L5 r7 U : ?" q |, r0 M m& j: i
显然,此问题可看作是运输问题的特殊情况。可将此问题看作具有n个源和n个汇的问题,每个源有1单位的可获量,而每个汇有1单位的需要量。从表面看,这问题要求用整数规划以保证 能取0或1。然而,幸运的是,此问题是运输问题的特例,因此即使不限制 取0或1,最优解也将取0或1。如果把婚姻看作分配问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为 的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。
/ I1 v/ d! s9 [model: 2 _' A) o5 r9 W( D
!7个工人,7个工作的分配问题;
8 j$ ^3 n5 Q4 Csets: + S" A, e. G" ?
workers/w1..w7/; 5 ]$ _" x0 X4 A K0 y M2 C8 }
jobs/j1..j7/;
- {8 E6 }$ k U4 D2 z links(workers,jobs): cost,volume; % |9 h6 b4 K2 G
endsets 6 z" J. \9 h& M' ~
!目标函数; ; N- w; n" h+ B" l) u% P
min=@sum(links: cost*volume); / O2 O4 p2 y% }: N6 d3 ^' F% p
!每个工人只能有一份工作; , t V1 W" z8 ]+ b
@for(workers(I): ) Y& w5 a8 s Y
@sum(jobs(J): volume(I,J))=1; : \0 ?& N8 L$ k( l
);
$ `8 w3 w7 R8 ]- s* V+ P& B% H !每份工作只能有一个工人;
8 Y; L$ d& O% s# J @for(jobs(J):
5 C5 ]9 |6 R) v5 {; B @sum(workers(I): volume(I,J))=1;
0 p7 h: L e- ^# Z8 r" w- i( m ); $ f' k* v; ^ G& ~2 T
data:
: g' i# U9 Q' s) p! V cost= 6 2 6 7 4 2 5 ( [% y, j" X7 {
4 9 5 3 8 5 8
. ?' {8 c5 h5 ~ 5 2 1 9 7 4 3 ) L% E" G/ D' ~5 z) W- C
7 6 7 3 9 2 7
; F; b/ L4 G) f4 K1 `0 B) F, I+ \* N 2 3 9 5 7 2 6 ! j+ L, J* H4 F6 B/ P
5 5 2 2 8 11 4
" _ n& s0 {" ?# h# ] 9 2 3 12 4 5 10;
% y5 ]5 h4 t4 x5 Zenddata
4 ]5 r4 h8 i( m# bend |