数学建模最佳旅游路线的选择模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2012高教社杯全国大学生数学建模竞赛
承诺书
我们仔细阅读了中国大学生数学建模竞赛的竞赛规则.
我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、
网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。

我们知道,抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其他公开
的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处
和参考文献中明确列出。

我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。

如有违反竞赛
规则的行为,我们将受到严肃处理。

我们参赛选择的题号是(从A/B/C/D中选择一项填写): B 我们的参赛报名号为(如果赛区设置报名号的话): 12 所属学校(请填写完整的全名):鲁东大学
参赛队员 (打印并签名) :1. 张亭
2. 任雪雪
3. 卜范花
指导教师或指导教师组负责人 (打印并签名):
日期: 2010 年 8 月 2 日赛区评阅编号(由赛区组委会评阅前进行编号):
2010高教社杯全国大学生数学建模竞赛
编号专用页
赛区评阅编号(由赛区组委会评阅前进行编号):
赛区评阅记录(可供赛区评阅时使用):
全国统一编号(由赛区组委会送交全国前编号):
全国评阅编号(由全国组委会评阅前进行编号):
最佳旅游路线的选择模型
摘要:本文研究的是最佳旅游路线的选择问题,此问题属于旅行商问题,我们建立了路径最短,花费最少,省钱、省时、方便三个模型。

根据周先生的不同需求,我们用改良圈算法和多目标规划解决了该问题,之后我们结合实际情况对三个模型进行科学地误差分析,并分析了该算法的复杂性。

针对问题一,题目中给出了100个城市的经纬度,要求我们为周先生设计一条最短的旅行路线,即从驻地出发,经过每个城市恰好一次,再回到驻点。

由此可知,此问题属于旅行商问题。

首先,我们按附件所给各城市的顺序编号1,2,,100,以两城市间的直线距离代替实际距离。

然后,我们运用改良圈算法求解旅行商问题,以任意两点之间的最短距离矩阵为权重,利用1100100(,)w i j ⨯邻接矩阵构造无向图1UG ,据题意不知周先生的起始地点,因此利用Matlab 软件重复进
行100次改良圈算法即以每一个城市为出发点,从100个Hamilton 圈得到了最优圈1circle ,即最短的旅行路线。

其最短的旅游线路长度为87376公里。

针对问题二,该问题的目的是为周先生设计最经济的旅行方案,我们同样运用问题一所建的改良圈算法模型,将模型一中的权值矩阵“最短距离”换为“最少花费”,建立模型二。

本题规定周先生旅游的起始城市为第一个城市,同样利用费用矩阵2100100(,)w i j ⨯构造无向图2UG ,再利用Matlab 软件进行1次改良圈算法,就会得到最优圈2circle ,即花费最少的旅行路线,其最少花费为140430元。

针对问题三,这里根据周游退休后以享受为主,在模型一、模型二结果的基
础上,我们设定原则:优先考虑方便,当两地乘坐飞机所用的费用比乘坐豪华大巴所用费用高不出某个范围时,则乘坐飞机。

此处通过动态规划来实现此方案,在最经济、最短的路线的基础之上,通过改换乘坐方式,使最终的花费偏离出最小花费的值在我们的允许范围内,从而达到了省钱、省时又方便的目的。

最终得到满足周游先生自身需要的旅行方案。

之后我们结合实际情况对三个模型进行科学误差分析,并分析了所用算法的复杂性,同时对我们解决旅行商所采用的算法进行了评价,这使我们对旅行商问题有了更深一步的理解。

关键词:旅行商问题;改良圈算法;动态规划;误差分析;
1 问题重述
周先生退休后想到各地旅游,计划到100个城市旅游。

需要我们按下面要求制定出行方案。

(1)按地理位置(经纬度)设计最短路旅行方案。

数据见Matlab 的mat 数据文件(文件名为第2题B.mat ),其中0x 表示对应点的经度,0y 表示对应点的纬
度。

(2)假设任意两个城市之间都有豪华大巴和飞机航线,乘坐飞机的价格是两点间距离1.5倍(单位:元),豪华大巴的价格是分段的,在500公里之内是距离的2倍,超过500公里且在1000公里之内的是距离的1.4倍,超过1000公里的是距离的1.1倍,如果2010年5月1日零时周先生从第一个城市出发,每个
城市停留24小时,可选择航空、豪华大巴,设计最经济的旅行方案。

(3)假设豪华大巴和飞机都可以随到随走,飞机的速度是1000公里/小时,豪华大巴的速度是100公里/小时,要综合考虑省钱、省时又方便,设定你的评价准则,建立数学模型,修订你的方案。

(4)对算法作复杂性、可行性及误差分析。

(5)关于旅行商问题提出对所采用的算法的理解及评价。

2 条件假设与符号约定
2.1条件假设
(1)假设在旅途中的车速一定,且不考虑突发事件干扰飞机或豪华大巴的行程;
(2)假设本题所涉及的城市中,每两个城市之间都有直达的航班和豪华大巴;
(3)假设两城市之间距离用城市之间的直线距离来表示;
(4)假设不考虑买不上票和机车晚点等情况;
(5)假设不考虑机票和豪华大巴打折情况。

2.2 符号约定
n :表示城市的个数;
ij d :两个城市i j 与之间的距离,11100i j <+<<;
C :初始圈;
ij C C :的改良圈,11100i j <+<<;
100100(,)F i j ⨯:任意两点之间所花费的最小费用构成的距阵;
3 问题分析
3.1问题一
题目中给出了100个城市的经纬度,要求我们为周游设计一条最短的旅行路线,即从驻地出发,经过每个城市恰好一次。

由此可知,此问题是属于旅行商问题,我们可以考虑运用改良圈算法求解此问题。

按附件所给各城市的顺序编号1,2,,100,用两城市间的直线距离代表两城市的距离,我们可以考虑以任意两点之间的最短距离为权重,利用100100(,)w i j ⨯构造无向图1UG ,考虑到没有给出起点,
如果以某一城市为出发点,利用改良圈算法得到的最优圈未必是最优解,所以我们将利用Matlab 软件编程重复进行100次改良圈算法,将会得到最优圈1circle ,从而保证最优解,即最短的旅行路线。

用终点返回起点构成的闭合回路最为最短路线的长度。

这样就会为周游先生设计一条最短的旅游线路。

3.2问题二
本问题的目标是给周游先生设计最经济的旅行方案,我们考虑可以同样运用问题一所建的模型,将模型一中的权值“最短距离”换为“最少花费”,建立模型二。

本题规定了周游先生旅游的起始城市为第一个城市,因此同样利用100100(,)w i j ⨯构造无向图2UG ,再利用Matlab 软件进行1次改良圈算法,就会得到最优圈2circle ,即花费最少的旅行路线。

用终点返回起点构成的闭合回路作为花费最少的旅游路线。

这样就会为周游先生设计一条最经济的旅游线路。

3.3问题三
针对问题三,这里根据周游退休后以享受为主,在模型一、模型二结果的基础上,我们可以考虑设定原则:优先考虑方便,当两地乘坐飞机所用的费用比乘坐豪华大巴所用费高不出某个范围时,则乘坐飞机。

考虑通过动态规划来实现此方案,在最经济、最短的路线的基础之上,通过改换乘坐方式,若最终的花费偏离出最小花费在我们的允许范围内,则接受此方案,达到了省钱、省时又方便的目的。

最终得到满足周游先生自身需要的旅行方案。

之后我们会结合实际情况对三个模型进行科学误差分析,并分析所用算法的复杂性,同时对我们解决旅行商问题所采用的算法进行评价,这使我们对旅行商问题有更深一步的理解。

4 模型建立及求解
4.1 问题一
4.1.1 旅行商问题的基本理论
某旅行商欲往n 个城市推销货物,从某个城市出发,沿途经过各个城市一次后返回出发城市,要确定一条行走的路线,使得总路径最短。

这个问题称为旅行商问题(TSP )[1]。

用图论的术语说,就是在一个赋权完全图中,找出一个有最小权的Hamilton 圈C 。

称这种圈为最优圈。

与最短路问题及连线问题相反,尽管目前还没有求解旅行商问题的有效算法。

但是却有一个可行的办法是求一个Hamilton 圈,然后适当修改以得到具有较小权的另一个Hamilton 圈。

修改的方法叫做改良圈算法。

设初始圈121n C v v v v =。

(1)对于11,i j n <+<<构造新的Hamilton 圈:
它是由C 中删去的边1111,i i j j i j i j v v v v v v v v ++++和添加边和而得到的。


1111()()()()i j i j i i j j w v v w v v w v v w v v +++++<+,则以ij ij C C C C 代替,叫做的改良圈。

(2)转(1),直至无法改进,停止。

用改良圈算法得到的结果几乎可以肯定不是最优的。

为了得到更高的精确度,在不给定起始位置的前提下,可以选择不同的初始圈,重复进行n 次算法,以求得精确的结果。

4.1.2 旅行商问题的数学表达式
设城市的个数为n ,ij d 是两个城市i j 与之间的距离,01ij x =或(1表示走过城市i j 到城市的路,0表示没有选择走这条路)。

则有
(各起点和终点外,各边不构成圈)
4.1.3 模型一求解
按附件所给各城市的顺序编号1,2,,100,用两城市间的直线距离代表两城市的距离,我们以任意两点之间的最短距离矩阵为权重矩阵,利用1100100(,)w i j ⨯构造无向图1UG ,据题意并不知周先生的起始地点,因此利用Matlab 软件重复进行100次改良圈算法,尝试以每一个城市为出发点(算法见附录),首先设121,n C v v v v =,按改良圈算法求出此时的最优圈后,改变初始圈212,n C v v v v =依次进行下去,求出符合要求的最短距离的最优圈1circle ,保证了从终点返回到出发点的距离也最
短,即周游先生的最短旅行方案,如下:
51→62→72→7→86→33→70→74→60→35→40→34→3→96→45→11→55→6→69→77→38→81→42→17→28→76→47→63→84→46→90→5→48→21→52→27→19→15→1→36→23→65→75→12→66→13→57→20→95→4→39→85→9→10→24→2→73→61→25→26→37→53→14→41→58→67→18→22→68→54→91→32→92→16→30→78→100→89→83→8→79→88→44→94→31→64→87→43→82→71→50→49→29→59→97→93→56→80→98→99
我们运用Matlab 软件模拟出了周先生最短的旅游线路,见图1。

其中每一个‘*’表示每个城市,折线表示旅游线路,标有51的城市是周先生旅行的起点,标有99的城市是周先生旅游的终点,由终点99返回起点51所构成的闭合回路就是周先生最短的旅行路线,其长度为87376公里。

图1 模拟最短旅游线路示意图
4.2 问题二
对于问题二,我们同样运用问题一中所建的模型一,将模型一中的权值“最短距离”换为“最少花费”,建立模型二。

利用下面的分段函数求出花费最小的矩阵100100(,)F i j ⨯:
问题二中规定了周游先生旅游的起始城市为第一个城市。

因此利用100100(,)F i j ⨯为2100100(,)w i j ⨯构造无向图2UG ,再利用Matlab 软件进行1次改良圈算法(算法见附录),就会得到最优圈2circle ,即花费最少的旅行路线。

如下:
1→15→36→71→82→43→87→31→64→50→49→29→5→48→21→52→27→19→23→65→75→12→66→13→57→20→95→39→4→94→44→88→85→9→10→24→2→73→61→25→26→37→53→67→18→22→68→54→91→32→58→14→41→83→8→79→97→93→56→98→80→59→63→84→90→46→47→76→86→33→70→74→60→7→72→62→51→28→17→42→81→38→77→69→11→45→3→96→35→40→34→55→6→92→99→16→30→78→89→100
我们运用Matlab软件模拟出了周先生最经济的旅游线路,见图2。

其中每一个‘*’表示每个城市,折线表示旅游线路,标有1的城市是周先生旅行的起点,标有100的城市是周先生旅游的终点,由终点100返回起点1所构成的闭合回路就是周先生最经济的旅行路线,其长度为140430元。

图2 模拟最经济旅游线路示意图
4.3问题三
4.3.1多目标规划思想
基于选择既省钱、省时又方便的最佳旅游方案,我们建立了用序贯式算法求解多目标规划[2]的模型。

序贯式算法的核心是根据优先级的先后次序,将目标规划问题分解成一系列的单目标规划问题,然后再依次求解。

求解目标规划的序贯算法:
对于1,2,,,
求解单目标规划
k q
其最优目标值为k z *,当1k =时,约束(4)为空约束。

当k q =时,q z *所对应
的解x *为目标规划的最优解。

4.3.1模型的求解
题四
4.4.1科学地可行性、误差分析
上述算法思想是理想化的模型,在实际的旅游问题中,不仅要考虑路程的长短,还要考虑时间和费用。

通过建立数学模型的机理进行了深入剖析后,我们有效的掌握了解“旅游线路”问题,即为周先生寻找出一条既省钱、省时又方便的最佳旅游方案。

现在就根据上述算法做出较科学可行性和误差分析。

在实际问题中,我们考虑的不只是问题中所给的交通工具,现实中各交通工具的速度、票价也各不相同,甚至有些城市之间没有直达车,从省钱的角度考虑,可以全部选择飞机旅行,由于所有客运价格均由铁道部规定,而模型一采用的是
城市间的直线距离,根据城市的经纬计算出两两城市之间的距离,不考虑突发事
件干扰飞机或豪华大巴的行程的情况下,可以在出行之前按照最短路径,可以预算出旅行所花费的最短时间和费用,具有一定的可行性,实际性。

但是一般情况下路程越长花费的时间越多,所花的路费也越多,但在实际情况中飞机并不是按直线的航路飞行,两城市之间的直线距离可能是最短的,但按照豪华大巴运行的轨迹来看并不一定是最短的,因此所花费的时间和金钱就不一定是最少的。

而模型一是按照两城市之间的直线距离来求最短路径,这样模型一中必然存在着较大误差。

一般情况下,所采用的交通工具确定,两城市间的旅行时间就确定了。

所以用时间来计算既省时又经济的旅行路径,产生的误差更小,因此模型二与实际联系更加紧密。

使模型贴近实际,通用性强。

4.4.2复杂性分析
本题中,所旅游的城市数目较多,我们用动态规划方法求解,毫无疑问,计算量和储存量都很大,在求解时耗费了较多的时间。

4.5模型的评价
本文研究的是最佳旅游路线的选择问题,此问题属于旅行商问题,我们建立了路径最短,耗时最少,经济、省时、方便三个模型,根据周先生的不同需求,我们用改良圈算法和多目标规划解决了选择最佳路线的问题。

针对问题一,知此问题属于旅行商问题。

首先,我们按附件所给各城市的顺序编号1,2,,100,用两城市间的直线距离代表两城市的距离,简化问题。

然后,我们运用改良圈算法求解旅行商问题,以任意两点之间的最短距离矩阵为权重,利用Matlab软件重复进行100次改良圈算法即以每一个城市为出发点,得到了
最优圈,即最短的旅行路线。

针对问题二,我们同样运用问题一所建的模型用到的改良圈算法,将模型一中的权值矩阵“最短距离”换为“最少花费”,建立模型二。

同样利用Matlab软件进行1次改良圈算法,就会得到最优圈,即花费最少的旅行路线。

针对问题三,这里根据周游退休后以享受为主,在模型一、模型二结果的基础上,我们设定原则:优先考虑方便,当两地乘坐飞机所用的费用比乘坐豪华大巴所用费用高不出一个范围时,则乘坐飞机。

我们给任意两地之间耗时最少的矩阵和花费最少的矩阵赋不同的权值。

通过动态规划来实现,最终得到满足周游先生自身需要的旅行方案。

之后我们结合实际情况对三个模型进行科学误差分析,并分析了所用算法的复杂性,同时对我们解决旅行商所采用的算法进行了评价,这使我们对旅行商问题有了更深一步的理解。

5模型的改进
模型一中我们把问题简单化,以两城市间的直线距离代替实际距离。

这种假设只是为了解题方便,模型进一步完善就要把路程更接近于实际得到的路程,这样才更有说服力。

建模型一、模型二、模型三的时候,都忽略了政府的宏观调控,市场经济,石油价格等对票价的的影响,事实上,在我国政府的策略,市场经济,石油价格等因素都会对旅游票价有影响,所以,模型的改进也要考虑政策的影响。

参考文献:
[1]司守奎.数学建模算法与程序[M],第五章图与网络:P87-89,2007.
[2]司守奎.数学建模算法与程序[M],第二十三章目标规划:P397-400,2007.
[3]王振龙,时间序列分析,北京:中国统计出版社,2002年。

[4]韩中庚,长江水质综合评价与预测的数学模型,工程数学学报第22卷第7期:P47-P52,2005年。

附录:
********************************************************************
问题一最短旅行方案的Matlab源程序
********************************************************************* clc,clear
%主函数:
function main
load mydata
global d
d=zeros(100);
C=zeros(100,102);
for i=1:100
for j=1:100
d(i,j)=6378.140*acos(sin(y0(i)*pi/180)*sin(y0(j)*pi/180)...
+cos(y0(i)*pi/180)*cos(y0(j)*pi/180)*cos((x0(i)-x0(j))*pi/180)); end
end
xlswrite('juli',d,'sheet1')
[i,j,y]=find(d);
a=sparse(i,j,y);
a=tril(a);
L=size(d,1)
for i=1:100
c1=[i 1:100 100];
[circle,long]=modifycircle(c1,L);
c2=[i 100 1:100];%改变初始圈,该算法的最后一个顶点不动[circle2,long2]=modifycircle(c2,L);
if long2<long
long=long2;
circle=circle2;
end
changdu(i)=long;
C(i,:)=circle;
circle,long
end
[zuiyou,I]=min(changdu);
circle0=C(I,:)
xlswrite('luxian1.xls',circle0,'sheet1')
x=[x0(circle0(1:end-1)) x0(51)];
y=[y0(circle0(1:end-1)) y0(51)];
scatter(x,y,'*')
hold on
plot(x,y)
xlabel('经度')
ylabel('纬度')
gtext('51');
gtext('99');
%被调用函数:
function [circle,long]=modifycircle(c1,L); global d
flag=1;
while flag>0
flag=0;
for m=1:L-3
for n=m+2:L-1
if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<...
d(c1(m),c1(m+1))+d(c1(n),c1(n+1))
flag=1;
c1(m+1:n)=c1(n:-1:m+1);
end
end
end
end
long=d(c1(1),c1(L));
for i=1:L-1
long=long+d(c1(i),c1(i+1));
end
circle=c1;
*********************************************************************问题二最经济旅行方案的Matlab源程序
********************************************************************* clc,clear
d=xlsread('juli.xls');
w=zeros(100)
for i=1:99
for j=i+1:100
if d(i,j)<=1500
w(i,j)=1.5*d(i,j);
end
if d(i,j)>1500
w(i,j)=1700+(d(i,j)-1000)*1.1;
end
end
end
w=w+w’
xlswrite('feiyong',w,'sheet1');
function main
clc,clear
load mydata
ug=xlsread('feiyong')
[i,j,y]=find(ug);
a=sparse(i,j,y);
a=tril(a);
L=size(ug,1);
c1=[1 2:99 100];
[circle,long]=modifycircle(c1,L);
c2=[1 100 2:99];%改变初始圈,该算法的最后一个顶点不动[circle2,long2]=modifycircle(c2,L);
if long2<long
long=long2;
circle=circle2;
end
circle,long
x=[x0(circle) x0(1)]
y=[y0(circle) y0(1)]
scatter(x,y,'b','*')
hold on
plot(x,y)
*********************************************************************问题三动态优化的Lingo源程序
********************************************************************* *********************************************************************。

相关文档
最新文档