vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题

Euler 图和 Hamilton图 

基本概念 

定义

经过G 的每条边的迹叫做G 的 Euler 迹;闭的 Euler 迹叫做 Euler 回路或 E 回路;含 Euler 回路的图叫做 Euler 图。 

直观地讲,Euler 图就是从一顶点出发每边恰通过一次能回到出发点的那种图,即 不重复地行遍所有的边再回到出发点。 

定理 6 

(i)G 是 Euler 图的充分必要条件是G 连通且每顶点皆偶次。

( ii ) G 是 Euler 图的充分必要条件是 G 连通且

8a1a149cb8c1f461874bc99cf7b5051e.png

Ci是圈

fcd116afe7a847da8a01d65a33aad4d6.png

(iii)G 中有 Euler 迹的充要条件是G 连通且至多有两个奇次点。 

定义 

包含G 的每个顶点的轨叫做 Hamilton(哈密顿)轨;闭的 Hamilton 轨叫做 Hamilton 圈或 H 圈;含 Hamilton 圈的图叫做 Hamilton 图。

直观地讲,Hamilton 图就是从一顶点出发每顶点恰通过一次能回到出发点的那种 图,即不重复地行遍所有的顶点再回到出发点。 

 Euler 回路的 Fleury 算法 

1921 年,Fleury 给出下面的求 Euler 回路的算法。

 Fleury 算法:

  1. ∀v0 ∈V(G ),令 W 0 = v

  2. 假设迹 Wi = v0 e1 v1...ei vi = 0 1 1 已经选定,那么按下述方法从 E − {e1 ,... , e2} 中选取边e i+1 :

    (i) i+1 e 和 i v 相关联;

    (ii)除非没有别的边可选择,否则e i+1不是Gi= = G − {e1, ... ,ei }的割边(cut edge)。(所谓割边是一条删除后使连通图不再连通的边)。

  3. 当第 2 步不能再执行时,算法停止。

应用 

邮递员问题 

中国邮递员问题

 一位邮递员从邮局选好邮件去投递,然后返回邮局,当然他必须经过他负责投递的 每条街道至少一次,为他设计一条投递路线,使得他行程最短。 

上述中国邮递员问题的数学模型是:在一个赋权连通图上求一个含所有边的回路, 且使此回路的权最小。显然,若此连通赋权图是 Euler 图,则可用 Fleury 算法求 Euler 回路,此回路即为 所求。 

对于非Euler 图,1973 年,Edmonds 和 Johnson 给出下面的解法: 

设G 是连通赋权图。

(i)求

b283697ca436b3a689f96ebfdfcaeed9.png

(ii)对每对顶点  u,v ∈V0,求d(u,v)(d(u,v) 是u 与v 的距离,可用 Floyd 算法求得)。

(iii)构造完全赋权图K|V0|  ,以V0 为顶点集,以d(u,v) 为边uv 的权。 

(iv)求K |V0|  中权之和最小的完美对集 M 。 

(v)求 M 中边的端点之间的在G中的最短轨。 

(vi)在(v)中求得的每条最短轨上每条边添加一条等权的所谓“倍边”(即共端点共权的边)。 

(vii)在(vi)中得的图G' 上求 Euler 回路即为中国邮递员问题的解。

邮局有 k(k ≥ 2) 位投递员,同时投递信件,全城街道都要投递,完成任务返回邮局,如何分配投递路线,使得完成投递任务的时间最早?我们把这一问题记成 kPP。

 kPP 的数学模型如下:

vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第1张图片

 旅行商(TSP)问题 

一名推销员准备前往若干城市推销产品,然后回到他的出发地。如何为他设计一条 最短的旅行路线(从驻地出发,经过每个城市恰好一次,最后返回驻地)?

这个问题称为旅行商问题。用图论的术语说,就是在一个赋权完全图中,找出一个有最小权的 Hamilton 圈。称这种圈为最优圈。与最短路问题及连线问题相反,目前还没有求解旅行 商问题的有效算法。所以希望有一个方法以获得相当好(但不一定最优)的解。一个可行的办法是首先求一个 Hamilton 圈C ,然后适当修改C 以得到具有较小权 的另一个Hamilton圈。修改的方法叫做改良圈算法。设初始圈C=v1v2...vnv1

(i)对于1 < i +1 < j < n ,构造新的 Hamilton 圈:

d3b2e3b854456ecafeaef76afb6a27cd.png

它是由C中删去边vivi+1 vjvj+1,添加边vivj和vi+1vj+1而得到的。

6e845177b431a9bbc94e3e0ccf380c9b.png

,则以Cij 代替C ,Cij 叫做C 的改良圈。

(ii)转(i),直至无法改进,停止。 

用改良圈算法得到的结果几乎可以肯定不是最优的。为了得到更高的精确度,可以 选择不同的初始圈,重复进行几次算法,以求得较精确的结果。 

这个算法的优劣程度有时能用 Kruskal 算法加以说明。假设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) 的一个上界。

这里介绍的方法已被进一步发展。圈的修改过程一次替换三条边比一次仅替换两条边更为有效;然而,有点奇怪的是,进一步推广这一想法,就不对了。

例 

从北京(Pe)乘飞机到东京(T)、纽约(N)、墨西哥城(M)、伦敦(L)、巴黎(Pa) 五城市做旅游,每城市恰去一次再回北京,应如何安排旅游线,使旅程最短?各城市之间的航线距离如表 7。

vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第2张图片

解:编写程序如下:

向上滑动阅览

function main

clc,clear

global a

a=zeros(6);

a(1,2)=56;a(1,3)=35;a(1,4)=21;a(1,5)=51;a(1,6)=60;

a(2,3)=21;a(2,4)=57;a(2,5)=78;a(2,6)=70;

a(3,4)=36;a(3,5)=68;a(3,6)=68; a(4,5)=51;a(4,6)=61;

a(5,6)=13; a=a+a'; L=size(a,1);

c1=[5 1:4 6];

[circle,long]=modifycircle(c1,L);

c2=[5 6 1:4];%改变初始圈,该算法的最后一个顶点不动

[circle2,long2]=modifycircle(c2,L);

if long2

long=long2;

circle=circle2;

end

circle,long

%*******************************************

%修改圈的子函数

%*******************************************

function [circle,long]=modifycircle(c1,L);

global a

flag=1;

while flag>0

flag=0;

for m=1:L-3

for n=m+2:L-1

if a(c1(m),c1(n))+a(c1(m+1),c1(n+1))<...>

a(c1(m),c1(m+1))+a(c1(n),c1(n+1))

flag=1;

c1(m+1:n)=c1(n:-1:m+1);

end

end

end

end

long=a(c1(1),c1(L));

for i=1:L-1

long=long+a(c1(i),c1(i+1));

end

circle=c1;

旅行商问题的数学表达式

设城市的个数为 n , dij 是两个城市 i 与 j 之间的距离, xij = 0 或 1(1 表示走过城市 i 到城市 j 的路,0 表示没有选择走这条路)。则有

vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第3张图片

其中| s |表示集合 s 中元素个数。 

将旅行商问题写成数学规划的具体形式还需要一定的技巧,下面的例子我们引用 LINGO 帮助中的一个程序。

已知 SV 地区各城镇之间距离见表 8,某公司计划在 SV 地区做广告宣传, 推销员从城市 1 出发,经过各个城镇,再回到城市 1。为节约开支,公司希望推销员走 过这 10 个城镇的总距离最少。

vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第4张图片 vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第5张图片

解   

编写 LINGO 程序如下:

vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第6张图片 8fff299beecb428cc5ab20c5a2875201.gif

相关 · 推荐

如何构造最小生成树?prim 与Kruskal 算法实例讲解!

最短路问题和MATLAB实现

Matlab基本函数与绘图命令

真题 · 推荐

2019高教社杯建模国赛各赛题评阅要点

2019国赛A题解析及优秀论文赏析

2019国赛B题解析及优秀论文赏析

2019国赛C题解析及优秀论文赏析

2018国赛A题解析及优秀论文赏析

2018国赛B题解析及优秀论文赏析

2018国赛C题解析及优秀论文赏析

2017国赛A题解析及优秀论文赏析

2017国赛B题解析及优秀论文赏析

2016国赛A题解析及优秀论文赏析

•  END  •

模友们可能已经发现:现在公众号推送文章的顺序,已经不会按时间排列了。这种变化,可能会让各位模友错过我们每天的推送。

所以,如果你还想像往常一样,聚焦数模乐园,就需要将“数模乐园”标为星标公众号,同时在阅读完文章后,别忘了给一个“在看”哦。

星标步骤

(1)点击页面最上方“数模乐园”,进入公众号主页

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

16c3a3fe97381ab39c634dd4d8927333.gif vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第7张图片

扫码关注我们

vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第8张图片

2020国际赛QQ参赛群

vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第9张图片 vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第10张图片

球分享

vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第11张图片

球点赞

vrp 节约算法 c++_图与网络 Euler回路的Fleury算法讲解之邮递员与旅行商问题_第12张图片

球在看

你可能感兴趣的:(vrp,节约算法,c++)