网站策划知识,wordpress 伪静态设置,广州建设工程造价管理网站,用织梦做的网站怎么管理系统2023年第十三届MathorCup高校数学建模挑战赛
B题 城市轨道交通列车时刻表优化问题
原题再现#xff1a; 列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。列车时刻表规定了列车在每个车站的到达和出发#xff08;或通过#xff09;时刻#xff0c;其在实际…2023年第十三届MathorCup高校数学建模挑战赛
B题 城市轨道交通列车时刻表优化问题
原题再现 列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。列车时刻表规定了列车在每个车站的到达和出发或通过时刻其在实际运用过程中通常用列车运行图来表示。图1为某一运行图的示例图中每一条线表示一趟列车横轴表示车站纵轴表示时间每一条线反映了一趟列车在不同时刻所处的相对位置也称为运行线。比如图中红色运行线表示列车于902分从D站出发于905分到达C站停留1分钟后出发于909分到达B站停留1分钟后出发于1003分到达A站。 实际运营中在铺画列车运行图之前首先得先确定列车开行方案列车开行方案包括列车编组方案、列车停站方案和列车交路计划三部分。 列车编组方案规定了列车的车型和编组数量即列车的节数在本问题中采用统一的车型和编组数量。 列车停站方案是规定列车在哪些站点停站的方案在本问题中均采用站站停的停站方案即列车在每个经过的车站都会停车。 列车交路计划是指列车在规定的运行线路上往返运行的方式即规定了列车在哪些站点之间运行以及开行的数量。大小交路模式是城轨运营中常用的交路模式是指城市轨道交通运行线路的长短区间。通俗讲大交路是指列车跑完全程小交路是指将全程中的某两个站作为临时起点或终点来跑需要注意的是只有具有折返能力的车站能让列车调头的车站才能作为交路的起点或终点。图2为某大小交路方案示意图表示以A站为起点的D站为终点大交路区间开行10对列车以A站为起点C站为终点小交路区间开行5对列车。 在大小交路方案中大小交路列车开行列数通常为1:n或n:1两种模式即每开行n列大小交路列车后开行一列小大交路列车并且小交路所经过的车站数量需有一定限制小交路区间过短会导致列车的折返频繁使运营成本增加小交路区间过长则无法体现大小交路运营模式的作用。 在大小交路的运营模式下乘客通常会被分为6种类型如图3所示 其中1 −n为大交路区间a −b为小交路区间。 第ⅠⅡⅢ类乘客起点均位于[1 , a ]终点无论位于哪个区间乘客都只能乘坐大交路列车。 第ⅣⅤ类乘客起点均位于[a , b ]。其中第Ⅳ类乘客终点位于[a , b ]乘客既可乘坐大交路列车也可乘坐小交路列车第Ⅴ类乘客终点位于[b ,n ]乘客可以乘坐小交路列车之后到b进行换乘也可直接乘坐大交路列车。 第Ⅵ类乘客起点位于[b , n ]终点位于[b , n ]乘客只能乘坐大交路列车。 在列车开行方案的制定中需要以最小的企业运营成本和最大的服务 水平(乘客在车时间和乘客等待时间)来满足客流的需求企业的运营成本包括固定成本所需车辆的数量和变动成本列车总走行公里两部分组成。受到车站通过能力的制约和服务水平的要求在一定时间内列车的发车数量也有一定的限制。 在制定好列车开行方案后可根据该方案同样以企业运营成本最小化 和服务水平最大化为目标铺画列车运行图即确定每趟列车的出发和到达的具体时刻。现有的列车时刻表通常为等间隔的平行运行图即发车间隔如每5分钟开行一趟列车和在同一站点的停站时间相等。发车间隔的长短会有一定的限制发车间隔过短则会影响列车运行的安全发车间隔过长则会增长乘客的平均等待时间从而影响服务水平。同样地停站时间也需受到一定限制一般来说列车在车站的停站时间正比于在该站上、下车的乘客数量。另外需要注意的是两列车在同一区间追踪运行时需保留一定的安全间隔追踪间隔时间。 采用大小交路运营模式的列车运行图大交路列车和小交路列车一般 会交替开行比如当大交路列车与小交路列车的比例为21时则会以每3 列车为一个组合前 2 列车为大交路列车第三列车为小交路列车滚动发车。 在下列问题中只需制定单向的列车时刻表即可。 问题一在满足客流需求的条件下以企业运营成本最小化和服务水平最大化为目标制定列车开行方案。即确定大交路区间列车的开行数量小交路的运行区间以及开行数量。输出格式详见附件6 问题二在问题一制定的列车开行方案下同样以企业运营成本最小化和服务水平最大化且尽量满足客流需求为目标制定等间隔的平行运行图。输出格式详见附件7并将附件7单独上传到竞赛系统中 问题三对于降低企业运营成本和提高服务水平你们团队有哪些好的方法或建议基于客流和车站数据提供相应的量化分析支持。 输入输出数据 所给数据为某实际轨道交通线路的真实数据沿途共有30座车站客流数据的时段为7:00 - 8:00。数据详见附件。 附件1车站数据.xlsx 附件2区间运行时间.xlsx 附件3OD客流数据.xlsx 附件4断面客流数据.xlsx 附件5其他数据.xlsx 附件6问题一输出示例.xlsx 附件7问题二输出示例.xlsx
整体求解过程概述(摘要) 随着城市化进程的加快轨道交通成为人们出行的重要一环。列车运营商在提高服务水平的同时为尽可能的降低列车的运营成本则需要对列车的开行方案进行优化。本文利用提供的数据针对目前的问题做出以下工作 针对问题一在满足客流需求的情况下为达到企业运营成本最小和服务水平最高。首先对提供的数据进行处理得到每个时段的客流量和列车基本参数。其次以运营成本和服务水平为优化目标建立多元优化模型。其中运营成本和服务水平展开为车辆成本、车辆里程、运营成本和车辆运行时间、乘客等待时间、乘客出行成本、乘车舒适度七个权重不同的相关因素。最后使用优化GA-SA(遗传-模拟退火)算法结合约束条件求解开行方案为大交路(1-30车站)开行列数为9、小交路(5-14站)开行列数为4、小交路(8-14站)开行列数为4、小交路(8-17站)开行列数为3、小交路(10-14站)开行列数为6和小交路(14-22站)开行列数为8并以图例展示。 针对问题二在问题一求解的开行方案下为达到企业运营成本最小和服务水平最高。首先确定开行方案中的车辆里程。其次以运营成本和服务水平为优化目标建立多元优化模型。其中运营成本和服务水平展开为每站发车时间、每站到达时间、每站停车时间以及追踪间隔时间等权重不同的相关因素。同样采用优化GA-SA(遗传-模拟退火)算法结合约束条件求解列车平行时刻表如小交路(10-14站)第一辆列车于70000时从10起点站出发于70136到达11站停留0219后出发于70509 到达12站停留0115后出发于70837到达13站停留0114后出发于71113到达14终点站。并以平行运营图展示。 针对问题三为进一步降低企业运营成本和提高服务水平。根据数据可得不同时间段的客流量差异巨大。以此为依据从发车间隔、停站时间动态调整、列车站点起/终点优化出发设定客流量阈值将其划分为客流高峰、中峰和低峰时段做出优化如下 (1) 发车间隔客流高峰6分钟、中峰10分钟和低峰时段15分钟 (2) 停战时间客流高峰110s、中峰74s和低峰时段15s (3) 起/终点列车车站6、7、11设置为起始车站、车站27设置为非起始车站得到了进一步降低企业运营成本和提高服务水平的开行方案。 最后提出采用先进技术、加强客流管理等建立以及对模型进行了评价。
模型假设 假设1车辆在运行时不会发生交通事故。 假设2无论在车站还是区间都不允许列车发生越行或避让。 假设3乘客在上车时遵守规则。 假设4本文中车次的区间运行时分和车站停站时分均是提前给定好的。 假设5车站中的基础设施不存在损耗。 假设6列车编组固定后不再改变。 假设7列车在行驶路线中匀速行驶。
问题分析 问题一中提出在满足客流需求的条件下以企业运营成本最小化和服务水平最大化为目标制定列车开行方案。首先结合问题和实际将影响企业运营成本和影响服务水平的主要因素提取出。建立多目标优化模型对问题一进行求解。 问题二要求在问题一制定的列车开行方案下同样以企业运营成本最小化和服务水平最大化且尽量满足客流需求为目标制定等间隔的平行运行图。与问题二不同的是问题一中满足客流量需求是前提条件问题一中制定的方案必须满足客流量的需求问题二中要求尽量满足客流量的需求。因此结合问题一中的基于多元优化的SA-NA模型将设置满足客流量的目标函数将其输出的结果赋予较高的权重。最后任然使用加权平均的方式来制定出等间隔运行图。 问题三中提出提出相关建议以及方法以更好的降低企业运营成本和提高服务水平同时基于客流和车站数据提供相应的量化分析支持。结合第一第二问建立的多目标优化模型以及结合对实际生活中列车发车的观察我们提出了如下建议 1.动态调整发车间隔 2.优化列车停站方案 3.优化列车起始点
模型的建立与求解整体论文缩略图 全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码
import numpy as npimport matplotlib.pyplot as plt# Read data from fileimport pandas as pdimport numpy as np# 读取Excel文件
df pd.read_excel(附件 3OD 客流数据.xlsx, sheet_nameSheet1, headerNone)# 将DataFrame 转换为NumPy数组
df df.fillna(0)data df.to_numpy()[1:, 1:]num_stations len(data)# Calculate the total number of passengers getting on/off at each stationpassengers_get_on np.sum(data, axis1)passengers_get_off np.sum(data, axis0)# Create x-axis values (stations) and y-axis values (passengers)x np.arange(num_stations) 1y_get_on passengers_get_ony_get_off -passengers_get_off # 将负数转为正数后面在y轴上显示负号
plt.rcParams[font.size] 14# Plot the dataplt.rcParams[font.family] SimHeiplt.plot(x, y_get_on, label上车)plt.plot(x, y_get_off, label下车)#Add labels and legendplt.xlabel(车站)plt.ylabel(人数)plt.title(每个车站上下车人数)plt.legend()#Add minus sign to y-axis ticksplt.gca().yaxis.set_tick_params(whichboth, directionin)
plt.gca().yaxis.set_ticklabels([f{abs(tick):.0f} if tick ! 0 else 0 for tick inplt.gca().get_yticks()])plt.gca().yaxis.get_ticklabels()[0].set_horizontalalignment(left)plt.gca().yaxis.get_ticklabels()[-1].set_horizontalalignment(right)plt.gca().yaxis.get_ticklabels()[int(len(plt.gca().get_yticks())/2)].set_horizontalalignment(center)plt.gca().yaxis.get_ticklabels()[int(len(plt.gca().get_yticks())/2)].set_verticalalignment(bottom)plt.gca().yaxis.get_ticklabels()[-1].set_verticalalignment(bottom)# Showthe plotplt.show()import matplotlib.pyplot as pltplt.rcParams[font.family] SimHei# 定义车站类型
stations {1: square,2: square,3: circle,4: circle,5: square,6: circle,7: circle,8: square,9: circle,10: square,11: circle,12: circle,13: circle,14: square,15: circle,16: circle,17: square,18: square,19: circle,20: circle,21: square,22: square,23: circle,24: circle,25: square,26: square,27: square,28: circle,29: circle,30: square}# 定义车站之间的连接关系
connections [(1, 2), (2, 5), (5, 8), (8, 10), (10, 14), (14, 17), (17, 18),(18, 21), (21, 22), (22, 25), (25, 26), (26, 27), (27, 30)]# 绘制图像
fig, ax plt.subplots(figsize(10, 5))for i in range(1, 31):if stations[i] square:ax.scatter(i, 0, markers, s300, colorblack)else:ax.scatter(i, 0, markero, s300, colorgray)for c in connections:ax.plot([c[0], c[1]], [0, 0], linewidth5, colorblue)ax.scatter(24, 0.8, markers, s200, colorblack)ax.text(25, 0.8, 可作为起点/终点, fontsize12, colorblack)ax.scatter(24, 0.6, markero, s200, colorgray)ax.text(25, 0.6, 不可作为起点/终点, fontsize12, colorblack)ax.set_xlim([0, 31])ax.set_ylim([-1, 1])ax.set_xticks(range(1, 31))ax.set_yticks([])ax.set_title(车站示意图)ax.tick_params(labelsize14)plt.show()import pandas as pd# 假设您已经将文件读取到了以下数据框中
station_data pd.read_excel(附件 1车站数据.xlsx)section_time_data pd.read_excel(附件 2区间运行时间.xlsx)od_data pd.read_excel(附件 3OD 客流数据.xlsx)section_flow_data pd.read_excel(附件 4断面客流数据.xlsx)other_data pd.read_excel(附件 5其他数据.xlsx)# 提取车站间距离数据station_distances {}for i, row in section_time_data.iterrows():section f车站{i1}-车站{i2}station_distances[section] row[站间距/km]# 提取区间运行时间数据
section_times {}for i, row in section_time_data.iterrows():section f车站{i1}-车站{i2}section_times[section] row[区间运行时间/s]# 提取OD客流数据
od_matrix od_data.to_numpy()# 提取断面客流量数据
section_flow {}for i, row in section_flow_data.iterrows():section f车站{i1}-车站{i2}section_flow[section] row[断面客流量/人]# 提取其他数据
min_max_departure_interval [120, 360]min_tracking_interval 108min_max_station_stay_time [20, 120]train_capacity 1860min_max_small_circuit_stations [3, 24]avg_boarding_alighting_time 0.04def decode_individual(individual):big_circuit_start max(1, int(individual[0]))big_circuit_end int(individual[1])small_circuit_start max(1, int(individual[2]))small_circuit_end int(individual[3])while big_circuit_end big_circuit_start or small_circuit_end small_circuit_start:big_circuit_start max(1, int(individual[0]))big_circuit_end int(individual[1])small_circuit_start max(1, int(individual[2]))small_circuit_end int(individual[3])big_circuit_distance sum(station_distances[f车站{i}-车站{i1}] for i inrange(big_circuit_start, big_circuit_end 1))small_circuit_distance sum(station_distances[f车站{i}-车站{i1}] for i inrange(small_circuit_start, small_circuit_end 1))solution {大交路: {运行区间:(big_circuit_start, big_circuit_end),运营里程:big_circuit_distance,开行数量:individual[4]},小交路: {运行区间:(small_circuit_start, small_circuit_end),运营里程:small_circuit_distance,开行数量:individual[5]}}return solutiondef calculate_service_level(solution):big_circuit_start, big_circuit_end solution[大交路][运行区间]small_circuit_start, small_circuit_end solution[小交路][运行区间]big_circuit_service od_matrix.iloc[big_circuit_start- 1:big_circuit_end,big_circuit_start- 1:big_circuit_end].sum().sum()small_circuit_service od_matrix.iloc[small_circuit_start- 1:small_circuit_end,small_circuit_start- 1:small_circuit_end].sum().sum()service_level (big_circuit_service small_circuit_service) / total_passenger_flowreturn service_leveldef objective_function(individual):solution decode_individual(individual)if solution is None:return float(inf), float(-inf) # 如果解决方案为空不满足限制条件返回
极大的成本和极小的服务水平
big_circuit solution[大交路]small_circuit solution[小交路]# 计算成本
big_circuit_cost big_circuit[运营里程] * big_circuit[开行数量]small_circuit_cost small_circuit[运营里程] * small_circuit[开行数量]cost big_circuit_cost small_circuit_cost# 计算服务水平
service_level calculate_service_level(solution)
return cost, service_level全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可