Euler 图就是从一顶点出发【每条边】恰通过一次能回到出发点的那种图,【中国邮递员问题】的数学模型是:在一个赋权连通图上求一个含所有边的回路, 且使此回路的权最小。 显然,若此连通赋权图是 Euler 图,则可用 Fleury 算法求 Euler 回路,此回路即为 所求。 ! b& `" R- k! ~4 d; _9 m& a& |5 n' i/ l" A+ k
Hamilton 图就是从一顶点出发【每个顶点】恰通过一次能回到出发点的那种图。【旅行商问题描述】一名推销员准备前往若干城市推销产品,然后回到他的出发地。如何为他设计一条 最短的旅行路线(从驻地出发,经过每个城市恰好一次,最后返回驻地)?。用图论的术语说,就是在一个赋权完全图中,找出一个有最小权的 Hamilton 圈。称这种圈为最优圈。8 D4 A- c" j! E3 p) }
8 j- p. I* [( Q4 N/ k8 [
1 基本概念 * f8 P2 z- P j: w【定义】 经过G 的每条边的迹叫做G 的 Euler 迹;闭的 Euler 迹叫做 Euler 回路或 E 回路;含 Euler 回路的图叫做 Euler 图。 直观地讲,Euler 图就是从一顶点出发每边恰通过一次能回到出发点的那种图,即 不重复地行遍所有的边再回到出发点。 / b- w" V: E$ X( W# } u+ s ( T4 C8 P" [9 \ " Z+ N' H7 M6 a7 [8 W7 r+ S) E, x# Z8 T- t$ Q& }
【定义 】包含G 的每个顶点的轨叫做 Hamilton(哈密顿)轨;闭的 Hamilton 轨叫做 Hamilton 圈或 H 圈;含 Hamilton 圈的图叫做 Hamilton 图。 直观地讲,Hamilton 图就是从一顶点出发每顶点恰通过一次能回到出发点的那种图,即不重复地行遍所有的顶点再回到出发点。" B3 i2 X H% G% B) `8 @% ^ C
$ u* ~6 a+ \+ T/ A" S3 p( S
2 Euler 回路的 Fleury 算法6 \* ^% o! E# o
1921 年,Fleury 给出下面的求 Euler 回路的算法。 ; }. y' C& A& Y9 [4 S4 S
& i4 A- v+ h d7 i# j* o 1 L0 H; E/ I% K4 M9 g* N( p$ w
V8 ?1 g+ j3 U6 L, K) B! h G
- a( O( I9 k# L. k' F2 Q
. u7 P' K @: b' n2 T5 Z! b
例 :邮递员问题 7 l+ l# }4 K+ ~& H3 Z! d$ R中国邮递员问题 一位邮递员从邮局选好邮件去投递,然后返回邮局,当然他必须经过他负责投递的 每条街道至少一次,为他设计一条投递路线,使得他行程最短。+ k0 t; H$ _1 S# @
& d4 g$ y$ K0 |& s0 M8 t6 X9 e
上述中国邮递员问题的数学模型是:在一个赋权连通图上求一个含所有边的回路, 且使此回路的权最小。 显然,若此连通赋权图是 Euler 图,则可用 Fleury 算法求 Euler 回路,此回路即为 所求。 ( V) F% r( T( C) }( L2 A* Y6 t: Q2 Z& Q- B, x
非 Euler 图的权最小的回路的求解方法& C3 e; l8 v5 n
* [" Z$ D, G1 `对于非 Euler 图,1973 年,Edmonds 和 Johnson 给出下面的解法:; m8 G! ?( E$ \3 @' s( l + c9 g- P& o, \ g& Q & z$ _7 \: e, i0 C! b ) _) h: z6 L) {* y多邮递员问题- a& ?, B [% a: C3 {9 a4 F
邮局有 k(k ≥ 2) 位投递员,同时投递信件,全城街道都要投递,完成任务返回邮 局,如何分配投递路线,使得完成投递任务的时间最早?我们把这一问题记成 kPP。 kPP 的数学模型如下: ( p% ~7 S/ {$ I! b0 w& j, {& f9 r$ F! T6 @+ T; \9 G6 j ' k `/ ]. f6 v8 |9 d; A) s
, A7 i- X# O4 W! K0 z D
3 旅行商(TSP)问题 3 a' ?* Y8 u* ?( ~: Z一名推销员准备前往若干城市推销产品,然后回到他的出发地。如何为他设计一条 最短的旅行路线(从驻地出发,经过每个城市恰好一次,最后返回驻地)?这个问题称 为旅行商问题。用图论的术语说,就是在一个赋权完全图中,找出一个有最小权的 Hamilton 圈。称这种圈为最优圈。与最短路问题及连线问题相反,目前还没有求解旅行 商问题的有效算法。所以希望有一个方法以获得相当好(但不一定最优)的解。$ _$ T7 c( X: ^" M" g8 f- p3 K/ i
; y1 L; \ Q [: _5 @3.1 改良圈算法 ( ~( K! G w+ E. ^3 Q: c( G 6 s* l" J+ q9 o) G% X! ?2 y 3 C2 K( U4 f: v; A4 w& J- w) d& V% D
0 L) f2 o2 K: k用改良圈算法得到的结果几乎可以肯定不是最优的。为了得到更高的精确度,可以 选择不同的初始圈,重复进行几次算法,以求得较精确的结果。 这个算法的优劣程度有时能用 Kruskal 算法加以说明。2 O ]5 X2 p \+ R
( E, o" `4 M3 M/ ?
假设C 是G 中的最优圈。 则对于任何顶点v ,C − v 是在G − v 中的 Hamilton 轨,因而也是G − v 的生成树。由 此推知:若 T 是 G − v 中的最优树,同时 e 和 f 是和 v 关联的两条边,并使得 w(e) + w( f ) 尽可能小,则 w(T ) + w(e) + w( f ) 将是 w(C) 的一个上界。 这里介绍的方法已被进一步发展。圈的修改过程一次替换三条边比一次仅替换两条 边更为有效;然而,有点奇怪的是,进一步推广这一想法,就不对了。; L9 Z- {, c, \1 g
( n; }$ l0 z- f; M% S0 U: I; s' A例 15 从北京(Pe)乘飞机到东京(T)、纽约(N)、墨西哥城(M)、伦敦(L)、巴黎(Pa) 五城市做旅游,每城市恰去一次再回北京,应如何安排旅游线,使旅程最短?各城市之 间的航线距离如表 7。$ P3 Y2 T7 ^( t5 ]1 X
: a5 @- G& p: R( A " {) Y8 \% W. | ]6 x R7 I4 K
解:编写程序如下:* }. Q1 t0 a L2 K8 n8 |. X" {/ y
) x- Q3 Y( K* K! [! P3 e3 Gfunction main 4 p% B% D$ T# y2 r: j' Pclc,clear7 \" |6 e- C( L C( O
global a % T6 o+ t: [( [1 S0 _# A$ Va=zeros(6);7 @8 Q4 `( R. Q1 a3 D
a(1,2)=56;a(1,3)=35;a(1,4)=21;a(1,5)=51;a(1,6)=60;# I/ z6 k8 \- L; F* }' n$ z* H
a(2,3)=21;a(2,4)=57;a(2,5)=78;a(2,6)=70;. G2 n {& y1 c6 R
a(3,4)=36;a(3,5)=68;a(3,6)=68; a(4,5)=51;a(4,6)=61; % O$ ^7 m& l7 Z `3 h+ |a(5,6)=13; a=a+a'; L=size(a,1);2 e, C7 [' G( d
c1=[5 1:4 6]; ! R* K* {8 y% A1 i+ K2 N[circle,long]=modifycircle(c1,L); : j& I( u) g' R& L' N f. Bc2=[5 6 1:4];%改变初始圈,该算法的最后一个顶点不动 + a' p, x7 Q) G5 K- d2 R[circle2,long2]=modifycircle(c2,L); ; I* l* s2 k. b1 T; M; Eif long2<long1 s8 L. }8 Z9 M7 W
long=long2; ! x0 j8 L/ c8 Y" J4 y circle=circle2;% E9 S% p% l1 S M5 P
end 9 _' V; q, J; i8 ccircle,long 2 w3 S4 C2 y" U6 `% V4 Z%*******************************************3 n% B y/ I% j& P
%修改圈的子函数* }- m, t5 a# [% \; s. W8 i
%*******************************************! U7 H7 o' Y$ B7 `, c- ^
function [circle,long]=modifycircle(c1,L); 6 p5 w8 d8 C7 w
global a % M4 I( [+ E, X) i; s* c2 ` q- Yflag=1; ! i/ E3 c6 C1 U) wwhile flag>0 6 g+ D- g# b/ N0 p6 |! K( `: U% e6 u flag=0;* } U6 ]0 w; L4 T$ ]9 y4 v3 L
for m=1-3# c0 X0 s8 F" I; E8 B; B; B0 h( Y S
for n=m+2-1; y0 ~0 c2 Z2 h, ]! ` U4 P
if a(c1(m),c1(n))+a(c1(m+1),c1(n+1))<... 2 n8 [! }1 V. l" u a(c1(m),c1(m+1))+a(c1(n),c1(n+1)) : P; f! l! f' ? Q* j, } flag=1; 7 Y8 }* u( Q& @$ t( \" V c1(m+1:n)=c1(n:-1:m+1); & d9 j, J% j1 ]2 b" n3 u end7 S1 F/ g+ T- W2 ^; T
end $ k6 _: d% n9 ~7 O3 w end9 m0 i, P; c, u, K
end( Q& J% Z: c5 ]& H$ }7 P2 b
long=a(c1(1),c1(L)); ' e* O. G! Q2 t4 ^8 N' Nfor i=1-1' C) m- Y B+ Y3 O" Q4 b) e8 f
long=long+a(c1(i),c1(i+1)); x9 n5 X4 y8 c) ?& |7 @- qend 9 W* y: l% N7 A3 L+ J$ Hcircle=c1; ) C0 l0 {# s3 @5 Y( ?
. [1 f( L9 w* }! u! G
, |' Q5 L: _* @6 k
3.2 旅行商问题的数学表达式1 {0 v4 J) v3 ]9 ?
$ v0 L5 T m# j ; \2 F! T9 Q( T4 t3 T' b将旅行商问题写成数学规划的具体形式还需要一定的技巧,下面的例子我们引用 LINGO 帮助中的一个程序。0 w3 e- _! l8 c9 J; k) ?
4 A) X8 I! X7 Y1 ]3 Q7 E
例 16 已知 SV 地区各城镇之间距离见表 8,某公司计划在 SV 地区做广告宣传, 推销员从城市 1 出发,经过各个城镇,再回到城市 1。为节约开支,公司希望推销员走 过这 10 个城镇的总距离最少。* |9 W2 q3 \& x1 K1 ~, e
$ r: o( A" m! r2 O& m& z& r* W& u
3 E0 u3 A' D; ^2 v* Q7 g2 s3 f8 V5 [
' d9 t& k0 b- u解 编写 LINGO 程序如下:0 j9 n/ `" \7 S# @
6 [* C! a, H7 S; YMODEL: 0 y& m/ H% ~3 v# g" d c4 o1 {0 C* A2 ? SETS: # f+ K) ]% o) c( H! j# h- [7 o CITY / 1.. 10/: U; ! U( I) = sequence no. of city; % I7 y i( G7 B W/ O; N LINK( CITY, CITY): 7 p; j, u2 f) f; V& `' { DIST, ! The distance matrix;' t; `6 c! ?, H# b* t3 S
X; ! X( I, J) = 1 if we use link I, J; $ r* H" }/ P/ i) T2 z! v ENDSETS % { p' ?5 u$ {0 `( p DATA: !Distance matrix, it need not be symmetric; 2 ~. d) v, H; @ DIST =0 8 5 9 12 14 12 16 17 22 " M6 c& s" O! g 8 0 9 15 17 8 11 18 14 22, j7 D- U; E @: ^* t8 @6 r1 T
5 9 0 7 9 11 7 12 12 17 ' a [ o7 x! @; U 9 15 7 0 3 17 10 7 15 181 ^6 @* D3 r, d4 N
12 17 9 3 0 8 10 6 15 15( X7 J# \+ W0 H9 B6 _# k
14 8 11 17 8 0 9 14 8 16 ) b* Z% S5 G7 i 12 11 7 10 10 9 0 8 6 11+ w" g5 w0 ~6 _' C! l+ W
16 18 12 7 6 14 8 0 11 113 D- T- ]8 p h
17 14 12 15 15 8 6 11 0 10 }2 A5 ]+ H7 b. H) L) K/ Q) m 22 22 17 18 15 16 11 11 10 0; % \9 ^* O/ g) W/ j( L ENDDATA" ?* {2 B& D) C
!The model:Ref. Desrochers & Laporte, OR Letters,' ^1 y4 a2 X% @5 K1 ?5 E1 }- V
Feb. 91;7 p3 x8 v. {4 H$ ~8 y+ c
N = @SIZE( CITY); w1 ^, P- q j6 b MIN = @SUM( LINK: DIST * X);' G+ x5 h/ M3 |+ ?, f. C
@FOR( CITY( K): - u& j8 s Z! ~% `) s7 L, j! A ! It must be entered;( P- y1 f x6 y v% T4 B
@SUM( CITY( I)| I #NE# K: X( I, K)) = 1; $ D p3 u& k! x ! It must be departed; : A5 h8 A N! w0 { I @SUM( CITY( J)| J #NE# K: X( K, J)) = 1; . h X( A5 A) |2 y4 a3 m ! Weak form of the subtour breaking constraints;: P% x8 E; a' z% R
! These are not very powerful for large problems; , N! v+ j& t* @) @" q4 r0 p @FOR( CITY( J)| J #GT# 1 #AND# J #NE# K: 2 a' {' P/ L( L U( J) >= U( K) + X ( K, J) - 5 W* y' f: S% `0 U" n" u5 i! |3 _: R6 Q ( N - 2) * ( 1 - X( K, J)) + - z2 j* r* K% m7 L2 [! G ( N - 3) * X( J, K)));' {8 z+ F1 J" Z2 S2 S$ v$ \1 I! ~1 L
! Make the X's 0/1;4 ^1 R* e$ ]" Z8 K9 b) y# t q
@FOR( LINK: @BIN( X));0 C2 ^( g# g2 F/ W
! For the first and last stop we know...; 4 L0 d7 l3 q- b* ^+ r. a @FOR( CITY( K)| K #GT# 1:' C# U/ ?1 E% e6 W
U( K) <= N - 1 - ( N - 2) * X( 1, K);$ W1 P2 y% G* F' z( w& F5 S& N
U( K) >= 1 + ( N - 2) * X( K, 1));# {7 U! T7 h. U. ]' Y0 h, k
END 1 x! \% k' @2 C8 @9 ?4 \- i1 Y% m5 G
' Y5 g7 S4 D6 {- A& j7 g) u( T