文章目录
题目描述
本题为吉林大学数学学院2020级数学模型期末大作业
长春市的伊通河自南向北穿城而过,是长春人民的“母亲河”。伊通河全长342.5公里,假设长春市政府要在其中风景最为优美的225公里河段建设漂流露营区,建成之后游客们可以选择以乘船的方式畅游伊通河的这一河段。
目前的规划是每一次旅行都是从最开始的下水点出发到最终的结束点,开始点到结束点的河流长度为225公里,且是顺流而下的。游客可选择的交通工具总共有两种,一种是平均4公里每小时的脚踏公园游船,另一种是平均8公里每小时的螺旋桨电动游船。整个漂流旅行的总时长从6到18个夜晚不等,为了确保游客们在旅行过程中的安全,负责管理的政府机构希望每一艘游船在漂流的过程中都尽可能地避免遇到其他的游船。
目前的规划还包括在每年的五月到十一月可以进行全程的漂流旅行,在这六个月期间,共有X次旅行,225公里的伊通河游玩路线上共有50处露营区,露营区均匀地分布在游玩路线的河岸边。由于景区的知名度不断提升,前来游玩的游客数量也逐渐增加,因此管理机构计划增加每年的旅行次数以满足游客们的需求。
为了能够接纳尽可能多的游客,完成尽可能多的旅行次数,政府现在向你们征集一个最优的混合旅行方案,可以改变不同的旅行时间(单位为夜)与不同种类的游船,同时最大限度地利用露营区(两组游客不能同一时间在同一露营区里过夜)。
问题一
请制定一个最佳的乘船旅行计划,以最大限度地增加六个月中的旅行次数,假设在旅行的第25天,管理部门计划让四个游客团体从开始点出发,他们乘坐的游船种类和旅行时间分别为
g 1 g_1 g1 :电动游船, t 1 = 6 t_1=6 t1=6;
g 2 g_2 g2 :脚踏游船, t 2 = 18 t_2=18 t2=18;
g 3 g_3 g3:电动游船, t 3 = 12 t_3=12 t3=12;
g 4 g_4 g4:脚踏游船, t 4 = 12 t_4=12 t4=12。
请运用建立的模型分别为这四组游客设计旅行计划表。
问题二
管理部门计划未来将漂流河段的长度扩建到226公里,并将露营区数量增加到235个,请计算出在这样的条件下河流的承载能力,即六个月时间内最大的可能旅行次数。
问题三
请分析第二问的结果对于每天下⽔的脚踏游船与电动游船的⽐率和河流上露营地数量变化的敏感性。
背景介绍
长春市的伊通河自南向北穿城而过,是长春人民的“母亲河”。伊通河全长342.5公里,假设长春市政府要在其中风景最为优美的225公里河段建设漂流露营区,建成之后游客团体们可以选择以乘船的方式畅游伊通河的这一河段。
目前的规划是每一次旅行都是从最开始的下水点出发到最终的结束点,开始点到结束点的河流长度为225公里,且是顺流而下的。游客团体可选择的交通工具总共有两种,一种是平均4公里每小时的脚踏公园游船,另一种是平均8公里每小时的螺旋桨电动游船。整个漂流旅行的总时长从6到18个夜晚不等,为了确保游客团体们在旅行过程中的安全,负责管理的政府机构希望每一艘游船在漂流的过程中都尽可能地避免遇到其他的游船。
目前的规划还包括在每年的五月到十一月可以进行全程的漂流旅行,在这六个月期间,共有X次旅行,225公里的伊通河游玩路线上共有50处露营区,露营区均匀地分布在游玩路线的河岸边。由于景区的知名度不断提升,前来游玩的游客团体数量也逐渐增加,因此管理机构计划增加每年的旅行次数以满足游客团体们的需求。
为了能够接纳尽可能多的游客团体,完成尽可能多的旅行次数,政府现在向你们征集一个最优的混合旅行方案,可以改变不同的旅行时间(单位为夜)与不同种类的游船,同时最大限度地利用露营区(两组游客团体不能同一时间在同一露营区里过夜)。
模型假设
首先,假设每个游客团体团每天最多旅行 12 12 12个小时,那么电动游船每天最多旅行 96 k m 96km 96km,脚踏游船最多旅行 48 k m 48km 48km。
其次,假设出发点和终点不算露营点,则每两个露营点以及露营点距离出发点或终点之间相距 225 / 51 225/51 225/51。
又因为游客团体每天要在露营点暂停,所以电动游船每天最多旅行 [ 96 / ( 225 / 51 ) ] × ( 225 / 51 ) ≈ 92.65 k m [96/(225/51)]\times(225/51)\approx92.65km [96/(225/51)]×(225/51)≈92.65km,即每天最多到第 [ 96 / ( 225 / 51 ) ] = 21 [96/(225/51)]=21 [96/(225/51)]=21个露营点;脚踏游船每天最多旅行 [ 48 / ( 225 / 51 ) ] × ( 225 / 51 ) ≈ 44.12 k m [48/(225/51)]\times (225/51)\approx44.12km [48/(225/51)]×(225/51)≈44.12km,即每天最多到第 [ 48 / ( 225 / 51 ) ] = 10 [48/(225/51)]=10 [48/(225/51)]=10个露营点。 [ ⋅ ] [\cdot] [⋅]表示高斯函数,向下取整。
假设每天游客团体都必须去至少下一个露营点,即保证游客团体除了最后一天需要保证到达终点外,距离终点的剩余露营区数必须大于等于剩余天数。
问题一的模型
为了确保每一艘游船在漂流的过程中都尽可能地避免遇到其他的游船,我们需要确定游客团体漂流的优先级,保证优先级低的游客团体不能超过优先级高的游客团体,同时确保了不同优先级的游客团体每天不在同一露营区停留。
为了确保优先级低的游客团体不能超过优先级高的游客团体,我们需要根据游客团体走完全程平均每天需要经过的露营区数,当平均每天需要经过的露营区数相同时,我们就考虑游客团体的速度:
| 游客团体 | 平均每天需要经过的露营区数(个) | 速度 ( k m / h ) (km/h) (km/h) |
|---|---|---|
| g 1 g_1 g1 | 50 / 6 ≈ 8.33 50/6\approx 8.33 50/6≈8.33 | 8 8 8 |
| g 2 g_2 g2 | 50 / 18 ≈ 2.78 50/18\approx 2.78 50/18≈2.78 | 4 4 4 |
| g 3 g_3 g3 | 50 / 12 ≈ 4.17 50/12\approx 4.17 50/12≈4.17 | 8 8 8 |
| g 4 g_4 g4 | 50 / 12 ≈ 4.17 50/12\approx 4.17 50/12≈4.17 | 4 4 4 |
由上表我们可以得到游客团体优先级: g 1 > g 3 > g 4 > g 2 g_1>g_3>g_4>g_2 g1>g3>g4>g2
显然,优先级最高的游客团体会最早完成旅程,假如优先级最高的游客团体要开始下一次旅程,那么为了保证其不会遇到其他游船,则该游客团体不能超过其他团体,那么该游客团体的优先级就应当被设为最低。
决策树模型
为了找到最佳方案,显然最简单粗暴的方法就是列举所有情况进行比较,而由于我们把游客团体每天的旅行路程转化成经过的露营区数,将连续的变量转化成了离散的变量,因此我们可以使用决策树来列举所有的情形。
我们从优先级高到优先级低的游客团体的第一天行程开始列举,优先级最高的游客第一天可以选择到达的露营区有 21 21 21种,下一优先级的游客团体每天到达的可选露营区是前一优先级当天到达露营区和自己所在露营区之间的露营区。
当优先级最高的游客完成旅程后,假如其还有旅行次数,则重置其剩余的旅行天数,将其位置移动到出发点,并且剩余旅行次数减一。以下代码展示了假如每个游客团体都只有一次旅程的决策树,并且当完成第一种方案时会抛出异常以强制退出程序:
def travel(k, T, P, priority, times, max):
global count
global G, T0
if sum(P) == 204 and sum(times) == 0:
count += 1
if count == 1:
print(count)
raise Exception("done")
if sum(T) >= 1:
if T[priority[k]] >= 1:
for i in range(1, max):
p = P[priority[k]] + i # 用于记录下一天可能到的位置
T1 = T.copy()
P1 = P.copy()
times1 = times.copy()
priority1 = priority.copy()
if 51 - p >= T1[priority1[k]] - 1: # 如果剩余天数每天都至少有下一个营地能够到达
if p + (T1[priority1[k]] - 1) * G[priority1[k]] >= 51: # 确保旅行结束能到终点
if T1[priority1[k]] > 1:
P1[priority1[k]] = p
else:
P1[priority1[k]] = 51 # 最后一天必须到终点
T1[priority1[k]] -= 1
print(priority1[k], i, T1, P1, priority1, times1)
if T1[priority1[(k + 1) % 4]] == 0 and times1[priority1[(k + 1) % 4]] > 0:
times1[priority1[(k + 1) % 4]] -= 1
T1[priority1[(k + 1) % 4]] = T0[priority1[(k + 1) % 4]]
P1[priority1[(k + 1) % 4]] = 0
# 调整优先级,降为最低
priority1 = priority1[:(k + 1) % 4] + priority1[(k + 1) % 4 + 1:] + [priority1[(k + 1) % 4]]
k -= 1 # 回退
print(k)
if k != 3:
if P1[priority1[k]] < 51:
travel((k + 1) % 4, T1, P1, priority1, times1,
min([G[priority1[(k + 1) % 4]] + 1,
abs(P1[priority1[k]] - P1[priority1[k + 1]])])) # 不能超过优先级高的
else:
travel((k + 1) % 4, T1, P1, priority1, times1,
min([G[priority1[(k + 1) % 4]] + 1,
abs(51 - P1[priority1[k + 1]] + 1)]))
else:
travel((k + 1) % 4, T1, P1, priority1, times1, G[priority1[0]] + 1)
'''
else:
print("方案失败," + str(priority1[k]) + "无法到达终点,p=" + str(p))
print(priority1[k], i, T1, P1, priority1, times1)
print()
else:
print("方案失败" + str(priority1[k]) + ",51-p < T[k]-1,p=" + str(p))

文章探讨了如何优化长春市伊通河漂流露营区的旅行计划,以兼顾游客安全和旅行次数。通过建立决策树模型,分析了不同游船类型(脚踏游船和电动游船)和旅行时间的组合,以确定最佳旅行计划。模型对比显示,兼顾游客安全与旅行次数的方案可以在6个月内完成12次旅行,而全电动游船方案可完成8458次旅行。此外,敏感性分析揭示了露营区数量和游船比例对旅行次数的影响。
最低0.47元/天 解锁文章
1918

被折叠的 条评论
为什么被折叠?



