当前位置:   article > 正文

2023年mathorcup数学建模大赛C题电商物流网络包裹应急调运与结构优化问题论文思路分析与代码

2023年mathorcup数学建模大赛C题电商物流网络包裹应急调运与结构优化问题论文思路分析与代码

1 题目

        

        电商物流网络由物流场地(接货仓、分拣中心、营业部等)和物流场 地之间的运输线路组成,如图 1 所示。受节假日和“双十一”、“618”等促销活动的影响,电商用户的下单量会发生显著波动,而疫情、地震等突发事 件导致物流场地临时或永久停用时,其处理的包裹将会紧急分流到其他物 流场地,这些因素均会影响到各条线路运输的包裹数量,以及各个物流场 地处理的包裹数量。

        如果能预测各物流场地及线路的包裹数量(以下简称货量),管理者将 可以提前安排运输、分拣等计划,从而降低运营成本,提高运营效率。特别地,在某些场地临时或永久停用时,基于预测结果和各个物流场地的处 理能力及线路的运输能力,设计物流网络调整方案,将会大大降低物流场 地停用对物流网络的影响,保障物流网络的正常运行。

        附件 1 给出了某物流网络在 2021-01-01 至 2022-12-31 期间每天不同物流场地之间流转的货量数据,该物流网络有 81 个物流场地,1049 条线路。其中线路是有方向的,比如线路 DC1→DC2 和线路 DC2→DC1 被认为是两条线路。假设每个物流场地的处理能力和每条线路的运输能力上限均为其历史货量最大值。

        基于以上背景,请你们团队完成以下问题:

        问题 1:建立线路货量的预测模型,对 2023-01-01 至 2023-01-31 期间 每条线路每天的货量进行预测,并在提交的论文中给出线路 DC14→DC10、DC20→DC35、DC25→DC62 的预测结果。

        问题 2:如果物流场地 DC5 于 2023-01-01 开始关停,请在问题 1 的预测基础上,建立数学模型,将 DC5 相关线路的货量分配到其他线路使所有包裹尽可能正常流转,并使得 DC5 关停前后货量发生变化的线路尽可能少, 且保持各条线路的工作负荷尽可能均衡。如果存在部分日期部分货量没有正常流转,你们的分流方案还应使得 2023-01-01 至 2023-01-31 期间未能正常流转的包裹日累计总量尽可能少。正常流转时,请给出因 DC5 关停导致货量发生变化的线路数及网络负荷情况;不能正常流转时,请给出因 DC5 关停导致货量发生变化的线路数、不能正常流转的货量及网络的负荷情况。

        问题 3:在问题 2 中,如果被关停的物流场地为 DC9,同时允许对物流网络结构进行动态调整(每日均可调整),调整措施为关闭或新开线路,不包含新增物流场地,假设新开线路的运输能力的上限为已有线路运输能力的最大值。请将 DC9 相关线路的货量分配到其他线路,使所有包裹尽可能正常流转,并使得 DC9 关停前后货量发生变化的线路数尽可能少,且保持各条线路的工作负荷尽可能均衡。如果存在部分日期没有满足要求的流转方案,你们的分流方案还应使得 2023-01-01 至 2023-01-31 期间未能正常流转的包裹日累计总量尽可能少。正常流转时,请给出因 DC9 关停导致货量发生变化的线路数及网络负荷情况;不能正常流转时,请给出因 DC9 关停导致货量发生变化的线路数、不能正常流转的货量及网络的负荷情况; 同时请给出每天的线路增减情况。

        问题 4:根据附件 1,请对该网络的不同物流场地及线路的重要性进行评价;为了改善网络性能,如果打算新增物流场地及线路,结合问题 1 的预测结果,探讨分析新增物流场地应与哪几个已有物流场地之间新增线路, 新增物流场地的处理能力及新增线路的运输能力应如何设置?考虑到预测结果的随机性,请进一步探讨你们所建网络的鲁棒性。

2 建模思路

问题1

步骤1:数据预处理

目标: 准备好数据,以便进行后续的时间序列分析和建模。

  1. 导入数据:将附件1中的数据导入pandas DataFrame。
  2. 数据清洗:处理缺失值和异常值,确保数据质量。
  3. 数据重塑:按照线路和日期将数据重新组织,以创建每条线路的时间序列数据。

步骤2:差分和平稳性检验

目标: 将数据变得平稳,以便适用于ARIMA模型。

  1. 差分:对每个线路的时间序列数据进行差分,以消除趋势和季节性影响。差分的次数可能因数据而异,要确保数据平稳。
  2. 平稳性检验:使用Augmented Dickey-Fuller (ADF)测试验证数据的平稳性。确保p值小于0.05,表明数据已经平稳。

步骤3:参数选择

目标: 确定ARIMA模型的阶数(p, d, q)。

  1. 使用自相关函数(ACF)和偏自相关函数(PACF)图来确定p和q的值。
  2. 根据前面的差分步骤确定d的值。

步骤4:模型拟合和评估

目标: 拟合ARIMA模型,并评估其性能。

  1. 使用确定的p, d, q参数值拟合ARIMA模型。
  2. 使用均方误差(MSE)或其他适当的误差指标来评估模型的性能。
  3. 可以考虑使用交叉验证来更全面地评估模型的泛化性能。

步骤5:预测

目标: 使用拟合的ARIMA模型对未来时间段(2023-01-01至2023-01-31)的货量进行预测。

  1. 使用拟合的ARIMA模型对指定线路(如DC14→DC10、DC20→DC35、DC25→DC62)的货量进行预测。
  2. 可视化预测结果,以便更好地理解模型的性能和未来趋势。

以下为示例代码:

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from statsmodels.tsa.stattools import adfuller
  5. from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
  6. from statsmodels.tsa.arima_model import ARIMA
  7. # 步骤1:数据预处理
  8. # 导入数据
  9. data = pd.read_excel('d.xlsx')
  10. # 数据清洗(示例:填充缺失值为0,处理异常值)
  11. data['货量'].fillna(0, inplace=True)
  12. data['货量'] = np.where(data['货量'] < 0, 0, data['货量'])
  13. # 数据重塑(示例:创建每个线路的时间序列数据)
  14. line_routes = data['场地1'] + '→' + data['场地2']
  15. data['线路'] = line_routes
  16. line_routes_data = data.pivot_table(index='日期', columns='线路', values='货量', aggfunc='sum')
  17. # 步骤2:差分和平稳性检验
  18. # 差分
  19. diff_data = line_routes_data.diff().fillna(0) # 一阶差分示例
  20. # 平稳性检验
  21. def check_stationarity(timeseries):
  22. result = adfuller(timeseries)
  23. print('ADF Statistic:', result[0])
  24. print('p-value:', result[1])
  25. if result[1] <= 0.05:
  26. print('数据平稳')
  27. else:
  28. print('数据不平稳')
  29. # 示例:检验一阶差分后的数据平稳性
  30. check_stationarity(diff_data['DC3→DC5'])
  31. # 步骤3:参数选择(示例中使用ACF和PACF图)
  32. plot_acf(diff_data['DC3→DC5'], lags=30)
  33. plot_pacf(diff_data['DC3→DC5'], lags=30)
  34. # 步骤4:模型拟合和评估
  35. # 示例:拟合ARIMA模型
  36. p, d, q = 1, 1, 1 # 示例的p, d, q值
  37. model = ARIMA(line_routes_data['DC3→DC5'], order=(p, d, q))
  38. model_fit = model.fit(disp=0)
  39. print(model_fit.summary())
  40. # 步骤5:预测
  41. # 示例:使用拟合的ARIMA模型进行未来时间的预测
  42. forecast_periods = 31 # 预测的天数
  43. forecast, stderr, conf_int = model_fit.forecast(steps=forecast_periods)
  44. print('预测结果:', forecast)
  45. # 可视化预测结果(示例)
  46. plt.plot(line_routes_data['DC3→DC5'], label='观测数据')
  47. plt.plot(range(len(line_routes_data), len(line_routes_data) + forecast_periods), forecast, label='预测值')
  48. plt.legend()
  49. plt.show()

问题二

步骤1:数据准备

目标: 获取问题1中的预测模型结果、受影响的线路列表、候选替代线路信息以及线路的运输和处理能力。

  1. 使用问题1的预测模型,获得2023-01-01至2023-01-31期间每条线路每天的预测货量。
  2. 识别受DC5关停影响的线路,创建受影响的线路列表。
  3. 基于问题2的描述,获取线路之间的距离信息,以便后续选择候选替代线路。
  4. 获取每条线路的历史运输能力上限(最大货量)和每个物流场地的历史处理能力上限(最大处理货量)。

步骤2:确定决策变量

目标: 定义决策变量,即每条受影响线路的货量分配。

  1. 对于每个受影响线路,引入决策变量,表示该线路的货量分配。

步骤3:建立数学模型

目标: 基于线性规划建立数学模型,最小化未能正常流转的包裹数量,并确保线路工作负荷均衡。

  1. 定义目标函数:最小化未能正常流转的包裹数量,这是一个最小化问题。
  2. 添加约束条件:
    • 确保每条线路的货量分配不超过其历史最大货量(运输能力上限)。
    • 确保每个物流场地的处理货量不超过其历史最大处理能力(处理能力上限)。
    • 确保所有包裹都被分配到一个线路,防止包裹丢失。
    • 确保线路工作负荷均衡,避免某些线路过度负荷而导致其他线路闲置。
  3. 定义决策变量的范围(通常为非负数)。

步骤4:求解数学模型

目标: 使用线性规划方法求解数学模型,获得货量分配方案。

  1. 使用线性规划求解器(例如Python的SciPy库或CVXPY库)来解决定义的数学模型,获得货量分配方案。

步骤5:分析结果

目标: 分析数学模型的结果,包括受影响线路数量、未能正常流转的包裹数量以及线路的工作负荷情况。

  1. 根据数学模型的结果,计算受影响线路的数量。
  2. 计算未能正常流转的包裹数量,以评估模型的性能。
  3. 分析线路的工作负荷情况,确保各线路均衡负荷。

步骤6:结果呈现

目标: 将分配方案和分析结果以清晰的方式呈现,以便决策者理解。

  1. 可视化分配方案,显示哪些包裹从DC5重新分配到其他线路。
  2. 提供受影响线路数量、未能正常流转的包裹数量

示例代码如下:

  1. import pandas as pd
  2. import numpy as np
  3. from scipy.optimize import linprog
  4. # 步骤1:准备数据(无需额外的代码)
  5. # 示例数据(需要根据实际数据进行替换)
  6. # 预测的货量数据
  7. predicted_data = pd.DataFrame({
  8. '日期': pd.date_range(start='2023-01-01', end='2023-01-31'),
  9. '线路': ['DC5→DC10', 'DC5→DC14', 'DC20→DC35', 'DC25→DC62'], # 假设受影响的线路
  10. '货量': [100, 150, 80, 120] # 假设的预测货量
  11. })
  12. # 受影响的线路列表
  13. affected_routes = ['DC5→DC10', 'DC5→DC14']
  14. # 距离数据(示例,需要根据实际数据替换)
  15. distances = pd.DataFrame({
  16. '场地1': ['DC5', 'DC5', 'DC10', 'DC14', 'DC20', 'DC25', 'DC35', 'DC62'],
  17. '场地2': ['DC5', 'DC10', 'DC14', 'DC20', 'DC25', 'DC35', 'DC62', 'DC5'],
  18. '距离': [0, 10, 15, 20, 30, 40, 25, 5] # 假设的距离数据
  19. })
  20. # 步骤2:识别受影响的线路
  21. # 无需编写代码,已有受影响的线路列表 affected_routes
  22. # 步骤3:为受影响的线路找到候选替代线路
  23. alternative_routes = {} # 存储受影响线路及其候选替代线路的字典
  24. for route in affected_routes:
  25. start, end = route.split("→")
  26. # 找到候选替代线路,避免包含DC5并确保距离尽可能短
  27. candidates = [alt_route for alt_route in distances[(distances['场地1'] != 'DC5') & (distances['场地2'] != 'DC5')].itertuples() if
  28. alt_route.场地1 == start or alt_route.场地2 == end]
  29. alternative_routes[route] = candidates
  30. # 步骤4:建立线性规划模型
  31. # 构建线性规划模型
  32. # 定义决策变量:每个受影响线路的货量分配
  33. num_affected_routes = len(affected_routes)
  34. c = np.ones(num_affected_routes) # 目标函数系数,最小化未能正常流转的包裹数量
  35. # 构建不等式约束矩阵 A_ub 和约束右侧向量 b_ub
  36. # 约束1:每条线路的货量不能超过其历史最大货量
  37. max_transport_capacity = np.array([200, 300]) # 假设的运输能力上限
  38. A_ub = np.identity(num_affected_routes) # 每条线路的货量分配
  39. b_ub = max_transport_capacity
  40. # 构建等式约束矩阵 A_eq 和约束右侧向量 b_eq
  41. # 约束2:每个物流场地的处理能力不能超过其历史最大处理能力
  42. max_processing_capacity = np.array([500, 400]) # 假设的处理能力上限
  43. A_eq = np.array([[1, 0], [0, 1]]) # 约束2的系数矩阵
  44. b_eq = max_processing_capacity
  45. # 定义每个线路的货量分配范围约束
  46. bounds = [(0, None)] * num_affected_routes
  47. # 求解线性规划问题
  48. lp_solution = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')
  49. # 步骤5:计算结果和评估
  50. # 计算受影响的线路数量、未能正常流转的包裹数量和网络负荷情况
  51. allocated_quantities = lp_solution.x # 获取分配的货量结果
  52. # 计算受影响的线路数量(分配货量的线路数量)
  53. affected_route_count = sum(allocated_quantities > 0)
  54. # 计算未能正常流转的包裹数量(未能满足预测货量的包裹数量)
  55. total_unprocessed_packages = sum(predicted_data['货量'][predicted_data['线路'].isin(affected_routes)] - allocated_quantities)
  56. # 计算网络负荷情况(每个物流场地的工作负荷)
  57. network_load = allocated_quantities.sum() / max_processing_capacity

问题三

步骤1:准备数据

  • 目标:准备问题3所需的数据,包括预测的货量数据、受影响的线路列表、物流场地距离信息等。

步骤2:识别受影响的线路

  • 目标:确定哪些线路受到DC9关停的影响,这包括始发地或目的地为DC9的线路。

步骤3-7:遍历每一天进行决策

  • 目标:对每一天执行以下操作:

    步骤3a:找到当前日期的受影响线路及其预测货量

    • 目标:获取当前日期受影响的线路以及它们的预测货量。

    步骤3b:识别候选替代线路

    • 目标:找到候选替代线路,避免包含DC9,并确保始发地和目的地之间的距离尽可能短。

    步骤3c:建立线性规划模型

    • 目标:构建线性规划模型来分配货量,最小化未能正常流转的包裹数量、受影响线路数量和各线路工作负荷的不均衡程度。

    步骤3d:求解线性规划问题

    • 目标:使用线性规划求解器求解模型,获取货量分配方案。

    步骤4:记录结果

    • 目标:记录每一天的结果,包括受影响线路数量、未能正常流转的货量、网络负荷情况。

    步骤5:记录每天的线路增减情况

    • 目标:根据分配方案和受影响线路,记录每天线路的增加和减少情况。

步骤7:输出整个日期范围内的结果

  • 目标:将每一天的结果整合并输出,包括受影响线路数量、未能正常流转的货量、网络负荷情况以及每天的线路增减情况。

示例代码如下:

  1. import pandas as pd
  2. from scipy.optimize import linprog
  3. # 示例数据(需要根据实际数据进行替换)
  4. # 预测的货量数据
  5. predicted_data = pd.DataFrame({
  6. '日期': pd.date_range(start='2023-01-01', end='2023-01-31'),
  7. '线路': ['DC9→DC10', 'DC9→DC14', 'DC20→DC35', 'DC25→DC62'], # 假设受影响的线路
  8. '货量': [80, 120, 100, 150] # 假设的预测货量
  9. })
  10. # 受影响的线路列表
  11. affected_routes = ['DC9→DC10', 'DC9→DC14']
  12. # 假设的距离数据(示例,需要根据实际数据替换)
  13. distances = pd.DataFrame({
  14. '场地1': ['DC9', 'DC9', 'DC10', 'DC14', 'DC20', 'DC25', 'DC35', 'DC62'],
  15. '场地2': ['DC9', 'DC10', 'DC14', 'DC20', 'DC25', 'DC35', 'DC62', 'DC9'],
  16. '距离': [0, 10, 15, 20, 30, 40, 25, 5] # 假设的距离数据
  17. })
  18. # 存储每天的结果
  19. result = []
  20. # 最大处理能力(需要根据实际数据替换)
  21. max_processing_capacity = 200
  22. # 遍历每一天进行决策
  23. for date in pd.date_range(start='2023-01-01', end='2023-01-31'):
  24. # 步骤3a:找到当前日期的受影响线路及其预测货量
  25. affected_routes_data = predicted_data[(predicted_data['日期'] == date) & (predicted_data['线路'].isin(affected_routes))]
  26. # 步骤3b:识别候选替代线路
  27. alternative_routes = {} # 存储受影响线路及其候选替代线路的字典
  28. for route in affected_routes:
  29. start, end = route.split("→")
  30. # 找到候选替代线路,避免包含DC9,并确保距离尽可能短
  31. candidates = [alt_route for alt_route in distances[(distances['场地1'] != 'DC9') & (distances['场地2'] != 'DC9')].itertuples() if
  32. alt_route.场地1 == start or alt_route.场地2 == end]
  33. alternative_routes[route] = candidates
  34. # 步骤3c:建立线性规划模型
  35. num_routes = len(affected_routes)
  36. num_alternatives = len(alternative_routes)
  37. c = [1] * num_routes # 目标函数的系数(最小化未能正常流转的包裹数量)
  38. A_eq = []
  39. b_eq = []
  40. bounds = []
  41. for i, route in enumerate(affected_routes):
  42. # 构建约束条件
  43. route_allocation = [0] * num_routes
  44. route_allocation[i] = 1
  45. A_eq.append(route_allocation)
  46. b_eq.append(affected_routes_data['货量'].values[i]) # 预测货量作为约束条件
  47. # 设置变量的上下界
  48. bounds.append((0, max_processing_capacity))
  49. # 步骤3d:求解线性规划问题
  50. lp_solution = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')
  51. allocated_quantities = lp_solution.x
  52. # 步骤4:记录结果
  53. affected_route_count = sum(allocated_quantities > 0)
  54. total_unprocessed_packages = sum(
  55. predicted_data['货量'][predicted_data['线路'].isin(affected_routes_data['线路'])] - allocated_quantities)
  56. network_load = allocated_quantities.sum() / max_processing_capacity
  57. # 步骤5:记录每天的线路增减情况
  58. added_routes = [route for route in affected_routes if allocated_quantities[affected_routes.index(route)] > 0]
  59. removed_routes = [route for route in affected_routes if allocated_quantities[affected_routes.index(route)] == 0]
  60. # 步骤6:记录每天的结果
  61. result.append({
  62. '日期': date,
  63. '受影响的线路数量': affected_route_count,
  64. '未能正常流转的货量': total_unprocessed_packages,
  65. '网络负荷情况': network_load,
  66. '线路增加': added_routes,
  67. '线路减少': removed_routes
  68. })
  69. # 步骤7:输出整个日期范围内的结果
  70. result_df = pd.DataFrame(result)
  71. print(result_df)

问题四

步骤1:评价现有物流场地和线路的重要性

  • 目标:确定哪些物流场地和线路在网络中起着关键作用。
  • 方法:使用不同的指标来评估重要性,如流量、处理包裹数量、货物运输时间等。
  • 示例代码:计算每个物流场地的处理能力和每条线路的运输能力之和,以确定其重要性。

步骤2:分析问题1的预测结果,找出可能出现瓶颈的物流场地和线路

  • 目标:识别哪些物流场地和线路可能会在未来出现瓶颈,即货量高、运输能力受限或处理能力不足的场地和线路。
  • 方法:与问题1的预测结果进行比较,找出超过处理能力或运输能力的线路。
  • 示例代码:将问题1的预测结果与现有线路的运输能力进行比较,找出可能出现瓶颈的线路。

步骤3:寻找新增物流场地的位置

  • 目标:确定新增物流场地的最佳位置,以便改善网络性能。
  • 方法:根据不同因素选择新增物流场地的位置,如距离、潜在需求等。
  • 示例代码:在现有物流场地之间找到距离最远的地点,作为新增物流场地的位置。

步骤4:确定新增线路和设置处理能力及运输能力

  • 目标:确定与新增物流场地相关的新增线路,并设置它们的处理能力和运输能力。
  • 方法:根据新增物流场地的位置,选择与现有物流场地之间的新增线路。新增线路的运输能力上限可以设置为现有线路运输能力的最大值。
  • 示例代码:为新增物流场地选择与现有场地之间的新增线路,并设置它们的运输能力。

步骤5:鲁棒性分析

  • 目标:评估网络性能在不同情景下的表现,以确定网络的鲁棒性。
  • 方法:对预测货量进行敏感性分析,添加随机波动,并比较不同情景下的网络性能。
  • 示例代码:模拟不同货量情景下的网络性能,并比较结果。

步骤6:重新评估现有网络和新增网络的性能

  • 目标:根据敏感性分析的结果,重新评估现有网络和新增网络的性能。
  • 方法:运行网络模拟,计算关键性能指标,比较不同情景下的结果。
  • 示例代码:运行网络模拟以重新评估网络性能,并输出关键性能指标。

示例代码如下:

  1. import pandas as pd
  2. # 步骤1:评价现有物流场地和线路的重要性
  3. # 假设有一个包含物流场地和线路信息的DataFrame,字段包括场地名称、线路名称、流量、处理包裹数量、货物运输时间等
  4. data = {
  5. '场地名称': ['DC1', 'DC2', 'DC3', 'DC4'],
  6. '线路名称': ['DC1→DC2', 'DC2→DC3', 'DC3→DC4', 'DC4→DC1'],
  7. '流量': [1000, 800, 1200, 900],
  8. '处理包裹数量': [500, 600, 450, 550],
  9. '货物运输时间': [2, 3, 2, 4]
  10. }
  11. df = pd.DataFrame(data)
  12. # 计算每个物流场地的重要性指标(这里简单将流量和处理包裹数量相加)
  13. df['重要性'] = df['流量'] + df['处理包裹数量']
  14. # 输出现有物流场地的重要性评价
  15. existing_locations = df[['场地名称', '重要性']]
  16. print("现有物流场地和线路的重要性评价:")
  17. print(existing_locations)
  18. # 步骤2:分析问题1的预测结果,找出可能出现瓶颈的物流场地和线路
  19. # 假设有一个包含问题1的预测结果的DataFrame,字段包括线路名称和预测货量
  20. predicted_data = {
  21. '线路名称': ['DC1→DC2', 'DC2→DC3', 'DC3→DC4', 'DC4→DC1'],
  22. '预测货量': [1100, 900, 1300, 1000]
  23. }
  24. predicted_df = pd.DataFrame(predicted_data)
  25. # 找出可能出现瓶颈的线路(预测货量超过运输能力的线路)
  26. bottleneck_routes = predicted_df[predicted_df['预测货量'] > df['流量']]
  27. # 输出可能出现瓶颈的线路
  28. print("\n可能出现瓶颈的线路:")
  29. print(bottleneck_routes)
  30. # 步骤3:寻找新增物流场地的位置(示例中简单选择距离最远的地点)
  31. # 假设有一个包含物流场地之间距离信息的DataFrame,字段包括场地名称和距离
  32. distances_data = {
  33. '场地名称': ['DC1', 'DC2', 'DC3', 'DC4'],
  34. '距离': [10, 15, 20, 25]
  35. }
  36. distances_df = pd.DataFrame(distances_data)
  37. # 找到距离最远的地点作为新增物流场地的位置
  38. new_location = distances_df.loc[distances_df['距离'].idxmax()]['场地名称']
  39. # 输出新增物流场地的位置
  40. print("\n新增物流场地位置:", new_location)
  41. # 步骤4:确定新增线路和设置处理能力及运输能力
  42. # 这里假设新增的物流场地名称为DC5
  43. new_location = 'DC5'
  44. # 根据新增物流场地的位置,确定与现有物流场地之间的新增线路(示例中选择与所有场地连接的线路)
  45. new_routes = df['场地名称'].apply(lambda x: f"{x}{new_location}")
  46. # 设置新增线路的运输能力上限为现有线路运输能力的最大值
  47. max_transport_capacity = df['流量'].max()
  48. new_routes_capacity = [max_transport_capacity] * len(new_routes)
  49. # 输出新增线路和设置的运输能力
  50. print("\n新增线路和设置的运输能力:")
  51. print(pd.DataFrame({'线路名称': new_routes, '运输能力上限': new_routes_capacity}))
  52. # 步骤5:鲁棒性分析
  53. # 假设有一系列不同的预测货量情景(加入不同程度的随机波动)
  54. sensitivity_scenarios = {
  55. 'Scenario 1': [1050, 850, 1250, 950],
  56. 'Scenario 2': [1150, 950, 1350, 1050],
  57. 'Scenario 3': [1200, 800, 1400, 1100]
  58. }
  59. # 步骤6:重新评估现有网络和新增网络的性能
  60. for scenario, scenario_data in sensitivity_scenarios.items():
  61. # 将不同情景的预测货量加入问题1的预测结果中
  62. predicted_df[scenario] = scenario_data
  63. # 运行网络模拟并计算关键性能指标(这里仅示例,实际情况需要更复杂的模拟)
  64. # 假设计算包裹延误数量作为性能指标
  65. predicted_df['包裹延误数量_' + scenario] = predicted_df.apply(
  66. lambda row: max(row[scenario] - row['流量'], 0), axis=1)
  67. # 输出不同情景下的性能指标
  68. print("\n不同情景下的性能指标:")
  69. print(predicted_df)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/165315?site
推荐阅读
相关标签
  

闽ICP备14008679号