2023MathorCup B题城市轨道交通列车时刻表优化问题
By:公从号 : 数模孵化园
问题一:在满足客流需求的条件下,以企业运营成本最小化和服务水 平最大化为目标,制定列车开行方案。即确定大交路区间列车的开行数量
没什么好说的,规划模型,非常明显
首先我们需要明确问题的目标和约束条件。在本问题中,我们的目标是在满足客流需求的条件下,以企业运营成本最小化和服务水平最大化为目标,制定列车开行方案。即确定大交路区间列车的开行数量,小交路的运行区间以及开行数量。
1. 定义变量与参数:
• x1:大交路区间的开行数量
• x2:小交路区间的开行数量
• L1:大交路运营里程(如50km)
• L2:小交路运营里程(如30km)
• C1:大交路运行成本(每列车)
• C2:小交路运行成本(每列车)
• D:总客流需求
2. 目标函数: 我们希望最小化企业运营成本。在此问题中,运营成本可以表示为大交路和小交路的运行成本之和。
Minimize: Z = C1 * x1 + C2 * x2
3. 约束条件: 为了满足客流需求,我们需要确保大交路和小交路所承载的客流之和大于等于总客流需求。根据题目描述,我们假设大交路和小交路承载的客流量与其运营里程成正比。
a) L1 * x1 + L2 * x2 >= D
同时,我们还需要确保开行数量为非负整数。
b) x1, x2 >= 0 c) x1, x2 ∈ Z
4. 求解模型: 在确定了目标函数和约束条件后,我们可以使用线性规划(Linear Programming)方法求解模型。可以使用专业的求解器(如CPLEX、Gurobi)或者利用编程语言(如Python的PuLP库)来求解线性规划问题。
求解后,我们将得到最优解 x1 和 x2。
这里可以给出求解代码示例
导入必要的库
import pandas as pd
from pulp import LpProblem, LpMinimize, LpVariable, LpInteger
读取数据文件:
station_data = pd.read_excel('附件 1:车站数据.xlsx')
section_time_data = pd.read_excel('附件 2:区间运行时间.xlsx')
OD_data = pd.read_excel('附件 3:OD 客流数据.xlsx')
section_flow_data = pd.read_excel('附件 4:断面客流数据.xlsx')
other_data = pd.read_excel('附件 5:其他数据.xlsx')
根据读取的数据确定参数:
L1 = other_data.loc[0, '大交路运营里程']
L2 = other_data.loc[0, '小交路运营里程']
C1 = other_data.loc[0, '大交路运行成本']
C2 = other_data.loc[0, '小交路运行成本']
D = other_data.loc[0, '总客流需求']
创建线性规划问题:
prob = LpProblem("Train_Scheduling", LpMinimize)
定义决策变量:
x1 = LpVariable('x1', lowBound=0, cat=LpInteger)
x2 = LpVariable('x2', lowBound=0, cat=LpInteger)
定义目标函数
prob += C1 * x1 + C2 * x2
定义约束条件:
prob += L1 * x1 + L2 * x2 >= D
求解
prob.solve()
optimal_x1 = int(x1.varValue)
optimal_x2 = int(x2.varValue)
print(f"大交路开行数量: {optimal_x1}")
print(f"小交路开行数量: {optimal_x2}")
5. 结果输出: 根据求解得到的最优解 x1 和 x2,我们可以得到以下结果:
运行区间 运营里程 开行数量
大交路 50km x1
小交路 30km x2
将求解得到的最优开行数量 x1 和 x2 填入对应的单元格即可
问题二:在问题一制定的列车开行方案下,同样以企业运营成本最小化和服务水平最大化且尽量满足客流需求为目标,制定等间隔的平行运行图。(输出格式详见附件 7
在这个问题中,我们需要制定列车的开行方案以及相应的等间隔平行运行图,目的是让列车运营公司在最大程度上满足乘客的出行需求的同时,降低运营成本。具体来说,我们希望在不同车站之间的列车开行数量和时间安排能够提供便捷、准时的服务,让乘客能够在合理的时间内到达目的地。我们首先制定列车开行方案,即确定大交路和小交路的开行数量。
大交路是指列车在整个运行线路上的往返运行,而小交路则是在某两个车站之间进行往返运行。通过合理安排大交路和小交路的开行数量,我们可以更好地满足不同区间的乘客需求,提高运营效率。在确定开行方案后,我们需要制定等间隔平行运行图。这个运行图展示了每趟列车在每个车站的到达和出发时间。我们选择等间隔的平行运行图,是因为这样的安排能够让乘客更容易预测列车的到达时间,同时也有利于列车之间保持安全的运行间隔。通过合理设置列车的出发间隔和停站时间,我们可以进一步优化运营效率,提高乘客的出行体验。
这个问题的求解过程是为了帮助列车运营公司在满足乘客需求的前提下,实现运营成本的最小化和服务水平的最大化。通过合理的列车开行方案和等间隔平行运行图,我们可以为乘客提供便捷、准时的出行服务,同时降低运营成本,提高运营效率。
企业运营成本最小化和服务水平最大化体现在以下几个方面:
列车开行方案:在确定大交路和小交路的开行数量时,我们需要考虑企业运营成本。这包括固定成本(所需车辆的数量)和变动成本(列车总行驶公里)。在制定列车开行方案时,我们需要在满足客流需求的前提下,最小化这些成本。
乘客的出行需求:在制定列车开行方案和运行图时,我们需要尽量满足乘客的出行需求。这意味着我们需要在不同车站之间合理分配列车开行数量,以便在高峰时段和非高峰时段都能提供足够的运力。
服务水平:服务水平主要体现在乘客在车时间和乘客等待时间。在制定列车开行方案和运行图时,我们需要关注这两个指标。等间隔的平行运行图有助于保持较短的乘客等待时间,同时合理的出发间隔和停站时间可以确保乘客在车时间较短。
安全性和稳定性:在制定运行图时,我们需要保证列车之间的安全间隔。这意味着在计算每趟列车的出发和到达时间时,我们需要确保两列车在同一区间追踪运行时有一定的安全间隔。
看了这么多,不如用数学语言描述:
设大交路区间为 L1,小交路区间为 L2;
设大交路列车开行数量为 n1,小交路列车开行数量为 n2;
设大交路区间运营里程为 D1,小交路区间运营里程为 D2;
设乘客等待时间为 T_wait,乘客在车时间为 T_onboard;
设固定成本为 C_fixed,变动成本为 C_variable;
设客流需求矩阵为 P,其中 P_ij 表示从车站 i 到车站 j 的乘客数量;
设区间运行时间矩阵为 T,其中 T_ij 表示从车站 i 到车站 j 的运行时间;
设安全间隔时间为 T_safe;
设每趟列车在车站 i 的停站时间为 S_i。
在这个问题中,我们的目标是最小化企业运营成本和最大化服务水平。数学表达如下:
目标函数:
minimize C_total = C_fixed + C_variable
约束条件:
满足客流需求:n1 * D1 + n2 * D2 >= sum(P_ij) ,其中 i 和 j 都在大交路区间 L1 内;
乘客等待时间最小化:minimize T_wait;
乘客在车时间最小化:minimize T_onboard;
列车安全间隔:在同一区间追踪运行时,保持安全间隔 T_safe;
停站时间与乘客数量成正比:S_i ∝ (上下车人数);
通过求解上述优化问题,我们可以在满足客流需求的前提下,找到使企业运营成本最小化和服务水平最大化的列车开行方案和等间隔平行运行图
求解:
这是一个多目标优化问题。为简化问题,我们可以采用加权法将多目标转化为单目标优化。假设固定成本和变动成本的权重分别为 w1 和 w2,服务水平指标(乘客等待时间和乘客在车时间)的权重分别为 w3 和 w4。其中我们使用遗传算法(Genetic Algorithm,GA)进行优化。
代码:
import numpy as np
import pandas as pd
from scipy.optimize import minimize
from pygad import GA
# 读取数据
stations = pd.read_excel("附件 1:车站数据.xlsx")
section_time = pd.read_excel("附件 2:区间运行时间.xlsx")
OD_flow = pd.read_excel("附件 3:OD 客流数据.xlsx")
section_flow = pd.read_excel("附件 4:断面客流数据.xlsx")
other_data = pd.read_excel("附件 5:其他数据.xlsx")
# 参数设定
w1, w2, w3, w4 = 0.25, 0.25, 0.25, 0.25
# 目标函数
def fitness_function(solution, solution_idx):
n1, n2 = solution
D1, D2 = other_data["大交路运营里程"].values[0], other_data["小交路运营里程"].values[0]
C_fixed = other_data["固定成本系数"].values[0] * (n1 + n2)
C_variable = other_data["变动成本系数"].values[0] * (n1 * D1 + n2 * D2)
T_wait = calculate_wait_time(n1, n2)
T_onboard = calculate_onboard_time(n1, n2)
cost = w1 * C_fixed + w2 * C_variable + w3 * T_wait + w4 * T_onboard
return 1 / cost
# 计算等待时间
def calculate_wait_time(n1, n2):
# 假设根据实际情况计算等待时间
T_wait = 0
return T_wait
# 计算在车时间
def calculate_onboard_time(n1, n2):
# 假设根据实际情况计算在车时间
T_onboard = 0
return T_onboard
# 遗传算法求解
ga_instance = GA(num_generations=100,
num_parents_mating=5,
fitness_func=fitness_function,
sol_per_pop=10,
num_genes=2,
gene_space=[(1, 20), (1, 20)],
parent_selection_type="rank",
keep_parents=2,
crossover_type="single_point",
mutation_type="random",
mutation_percent_genes=10)
ga_instance.run()
solution, solution_fitness, _ = ga_instance.best_solution()
n1, n2 = int(solution[0]), int(solution[1])
print(f"大交路列车开行数量:{n1}")
print(f"小交路列车开行数量:{n2}")
第三问:对于降低企业运营成本和提高服务水平,你们团队有哪些好的方法或建议?基于客流和车站数据,提供相应的量化分析支持。
这里方法太多了,我给出几个方面,大家自己实际操作下:
调整发车间隔:通过调整发车间隔,可以平衡客流需求与运营成本。较短的发车间隔有助于降低乘客等待时间,提高服务水平;但过短的发车间隔可能导致运营成本上升。我们可以使用数学建模方法(如线性规划或遗传算法)来寻找最优发车间隔,使得运营成本和服务水平达到平衡。
优化列车停站方案:列车在车站停留的时间也会影响服务水平。我们可以根据车站的客流数据,为每个车站确定合适的停留时间。例如,对于客流量较大的车站,可以适当增加停留时间以减少乘客在车站的等待时间。同时,我们需要保持总的运营成本在一个可接受的范围内。这也可以通过数学建模方法来求解,如遗传算法、粒子群优化等。
考虑交通需求管理:我们可以通过分析客流数据,识别高峰时段和低谷时段。在高峰时段,增加列车开行数量以满足更高的客流需求;在低谷时段,适当减少列车开行数量以降低运营成本。这可以通过时间序列分析和预测模型实现,如 ARIMA 模型、指数平滑法等。
引入动态定价策略:根据客流数据和预测,我们可以在高峰时段提高票价,从而抑制部分客流需求;而在低谷时段降低票价以吸引更多乘客。这有助于平滑客流需求,降低运营压力,提高服务水平。可以使用数学建模方法(如多目标优化)来确定最优的动态定价策略。
优化列车编组方案:根据客流需求变化,可以调整列车编组方案以提高运营效率。在高峰时段,可以增加列车编组数量以容纳更多乘客;在低谷时段,可以减少列车编组数量以降低运营成本。这可以通过整数规划或其他优化方法实现。
个人感觉引入动态定价策略:根据客流数据和预测,我们可以在高峰时段提高票价,从而抑制部分客流需求这个是最实际的,也比较好操作。
作者是nus计算机专业在读硕士,喜欢数模,欢迎各位关注:gzh数模孵化园
会一直更新各个数模比赛思路,免费。包括资料。