数学建模Word文件下载.docx
- 文档编号:18132706
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:45
- 大小:56.07KB
数学建模Word文件下载.docx
《数学建模Word文件下载.docx》由会员分享,可在线阅读,更多相关《数学建模Word文件下载.docx(45页珍藏版)》请在冰豆网上搜索。
针对问题五,我们首先考虑第一档景点全部游玩,第二档景点大部分游玩。
根据题三思路找出对应的符合条件的宾馆,然后从中选出耗费最少的宾馆,之后考虑景点排序,最终得到多景点兴趣路线。
最后,对所建立的模型和求解方法的优缺点给出了客观的评价,并指出了改进的方法。
关键字:
更新路由表路由交换最优路径路线规划
一、问题重述
1.1引言
随着互联网信息愈加普遍、广阔与公开,自由行成为了一种新兴的旅游方式,也广受旅客青睐,但自由行没有导游随行,路线、住宿仅由旅客自行安排,因此制定一个科学、便捷、实惠的旅游计划是十分必要的。
为了实现这样的目的,通过对C城14个景点的开放时间、参观时间以及门票费用的交叉分析,并联系各景点间的公交站点、各景点的停靠站点情况,结合酒店的住宿价格,从最优乘车路线、最全游览路线、限时少花销路线、半价活动路线、多景点兴趣路线五个路线进行规划,使旅客获得更好的行程安排以及更优的旅游体验。
1.2问题的提出
围绕游客的旅游要求、酒店房价、景点与站点、车费安排,设计旅游路线,本文依次提出如下问题:
(1)给定酒店的相应站点(S1099、S0971、S1131、S0219、S0475),景点的停靠站点(S0045、S0881、S0917、S1059、S1171、S0995、S0757、S1187、S0025、S0771、S0471、S0761、S0009)、首末班车时间、相邻两班次间隔时间、票价。
要求建立模型得到从酒店(H004、H017、H028)到每个景点的最优乘车路线,并具体给出V001-V007、V002-V009、H003-V006、H008-V010四对目的地的最优路线。
(2)不考虑住宿,设计用最短的时间将所有景点都游览一次的旅游路线。
(3)给定旅游时间且假设该游客在旅游期间不会更换住宿酒店,设计花尽可能少的费用游览尽可能多的景点包括住宿安排和每天的旅游行程。
(4)给定游客在城市C旅游的3天中有一天适逢全市所有景点半价活动的条件,分析其对原旅游行程的影响,并制定出更为完善的行程计划。
(5)假设某个游客按照自己的游览兴趣将城市C的景点划分为三个档次,I档是该游客最感兴趣的景点,包括V002、V004、V007、V009;
II档是较感兴趣的景点,包括V001、V005、V006、V014;
余下景点为III档。
设计一个结合游客游览兴趣,包括住宿安排,费用最少并且能游览尽可能多景点的三天旅游行程。
二、模型假设
(1)忽略实际生活中的意外事件对行程的影响;
(2)假设不存在独立的交通网络,即从任意一个站点出发可以到达题目所给出的任意站点;
(3)假设公交到点时间十分准确,没有误差;
(4)假设景点游览不需排队;
(5)假设各站点间距离为1。
三、符号说明
符号
意义
V
景点
S
公交站点(均为奇数号站点)
H
酒店
Interests
景点信息
price
各线路价格
hotel
宾馆信息
times
各线路各站间隔时间
time
各线路各站发车间隔
四、问题分析
4.1问题整体分析
要得到最优路线,我们就要考虑从距离最短、花费最少、时间最短三个方面分析。
首先绘制出简易交通图,将数据以路径为单位分组,统计出中转站(两条或以上路径的交点),分析数据,通过路由交换与迭代法得出合适的路径。
编写数据处理函数,利用正则表达式处理出可用数据:
defdatareset(strings):
result=[]
b='
'
c='
d='
forvalueinstrings:
value=value.strip()
value=re.sub('
[-S\n。
]'
'
value)
result.append(value)
forainresult:
b=b+a
forxinrange(0,len(b),4):
c=b[x:
x+4]
iflen(c)==4:
d=d+c+'
d=d.split('
)
d.remove('
returnd
f=open(r'
附件1.txt'
r'
names=locals()
L=[]
foriinrange(1,20):
ifi%2==0:
a=int(i/2)
str=f.readlines
(1)
names['
L00%s'
%a]=datareset(str)
L.append(datareset(str))
else:
f.readlines
(1)
foriinrange(20,100):
str=f.readlines
(2)
L0%s'
f.close
首先求di,也就是路由表1,然后一步步更新:
deffind(start,end):
Include_start=[]#包含起点的路径
Include_end=[]#包含终点的路径
foriinrange(0,49):
ifstartinR_sum[i]:
Include_start.append(i)
ifendinR_sum[i]:
Include_end.append(i)
di={}#路由表1,结构为:
目的站点:
[[最后所需经过中转站],[间距],[目的站点所在车次]]
list1=[]#用于存储已遍历站点
forrinInclude_start:
foriinrange(0,len(R_sum[r])):
ifR_sum[r][i]==start:
continue
di[R_sum[r][i]]=[[],[],[]]
#初始化起点能直接到达的站点的路由表,即初始化路由表1
list1.append(R_sum[r][i])
#起始点跳过
elifR_sum[r][i]inlist1:
a=np.abs(R_sum[r].index(start)-R_sum[r].index(R_sum[r][i]))
ifdi[R_sum[r][i]][1]!
=[]anda>
=di[R_sum[r][i]][1]:
di[R_sum[r][i]][0]=start
di[R_sum[r][i]][1]=a
di[R_sum[r][i]][2]=r
然后,初始化路由表2(所有其余路由表的集合):
other_R=list(set(np.arange(49))-set(Include_start))#不包含起点的路径
list_of_destination2={}#路由表2结构:
中转站:
[[目的站点],[距离],[目的站点所在车次]]
foriinrange(0,len(transform_station)):
#初始化路由表2
list_of_destination2[transform_station[i]]=[[],[],[]]
forrinother_R:
list_of_transform=list(set(R_sum[r])&
set(transform_station))#该路径包含的中转站
foriinrange(0,len(list_of_transform)):
forjinrange(0,len(R_sum[r])):
ifR_sum[r][j]==list_of_transform[i]:
a=np.abs(R_sum[r].index(list_of_transform[i])-j)#中转站与该目的地间差距
iflist_of_destination2[list_of_transform[i]][0]!
=[]andR_sum[r][j]inlist_of_destination2[list_of_transform[i]][0]:
#该路径中元素是否在路由表2的目的站点中出现过
b=list_of_destination2[list_of_transform[i]][0].index(R_sum[r][j])
ifa>
=list_of_destination2[list_of_transform[i]][1][b]:
list_of_destination2[list_of_transform[i]][1][b]=a
list_of_destination2[list_of_transform[i]][2][b]=r
list_of_destination2[list_of_transform[i]][0].append(R_sum[r][j])
list_of_destination2[list_of_transform[i]][1].append(a)
list_of_destination2[list_of_transform[i]][2].append(r)
相应中转站信息示例(中转站:
[目的站点],[距离],[车次]):
513:
[[977,975,973,971,969,967,879,877,875,873,871,869,763,761,759,757,521,517,515,511,509,507,505,503,233,243,211,213,215,217,223,219,755,965,963,961,959,957,955,947,881,849,847,813,811,809,805,801,785,783,715,713,231,239,241,237,235,1103,1101,1095,1175,1169,1167,1115,1139,1135,1227,1245,1243,1247,1239,1249,1251,1253,765,543,545,547,549,527,525,523,311,313,315,307,309],[19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,10,11,12,13,4,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,7,8,9,10,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,4,2,3,4,5,6,7,8,13,14,15,16,17],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23]],
515:
[[977,975,973,971,969,967,879,877,875,873,871,869,763,761,759,757,521,517,513,511,509,507,505,503,233,243,211,213,215,217,223,219,755,965,963,961,959,957,955,947,881,849,847,813,811,809,805,801,785,783,715,713,231,239,241,237,235,1103,1101,1095,1175,1169,1167,1115,1139,1135,1227,1245,1243,1247,1239,1249,1251,1253,765,543,545,547,549,527,525,523,311,313,315,307,309],[18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,3,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,7,8,9,10,11,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,3,3,4,5,6,7,8,9,14,15,16,17,18],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23]],
517:
[[977,975,973,971,969,967,879,877,875,873,871,869,763,761,759,757,521,515,513,511,509,507,505,503,233,243,211,213,215,217,223,219,755,965,963,961,959,957,955,947,881,849,847,813,811,809,805,801,785,783,715,713,231,239,241,237,235,1103,1101,1095,1175,1169,1167,1115,1139,1135,1227,1245,1243,1247,1239,1249,1251,1253,765,543,545,547,549,527,525,523,311,313,315,307,309],[17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,2,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,8,9,10,11,12,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,2,4,5,6,7,8,9,10,15,16,17,18,19],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23]]
更新路由表:
"
更新路由表"
same_transform=list(set(di.keys())&
set(list_of_destination2.keys()))
rest_of_di=list(set(di.keys())-set(same_transform))
di_part={}
rest_of_x=list(set(x_sum)-{start}-set(di.keys()))
rest_of_x2=list(set(x_sum)-({start}|set(di.keys())|set(list_of_destination2.keys())))
foriinlist_of_destination2.keys():
#初始化路由表3(除起点、路由表1、路由表2中的中转站)
forjinrange(0,len(list_of_destination2[i][0])):
iflist_of_destination2[i][0][j]inrest_of_xorlen(list_of_destination2[i][0])==0:
di_part[list_of_destination2[i][0][j]]=[[],[],[]]
foriteminsame_transform:
foriinrange(0,len(list_of_destination2[item][0])):
iflist_of_destination2[item][0][i]notindi.keys():
distance=di[item][1]+list_of_destination2[item][1][i]
di[list_of_destination2[item][0][i]]=[item,distance,list_of_destination2[item][2][i]]
di_part[list_of_destination2[item][0][i]]=[item,distance,list_of_destination2[item][2][i]]
#根据路由表2更新路由表1(仅根据路由表2中与路由表1相同的中转站来更新,即核心算法)
foritem1inrest_of_di:
ifitem1==list_of_destination2[item][0][i]:
ifdi[item1][1]>
list_of_destination2[item][1][i]+di[item][1]:
di[item1][0]=item
di[item1][1]=list_of_destination2[item][1][i]+di[item][1]
di[item1][2]=list_of_destination2[item][2][i]
forkeyinlist(set(list_of_destination2.keys())-set(same_transform)):
#迭代初始化其余中转站
whilekeyindi_part.keys()andlen(di_part[key])==0:
foriinlist(set(list_of_destination2.keys())-set
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数学 建模