列生成算法在动态车辆调度问题中的应用示例
问题描述
动态车辆调度问题(Dynamic Vehicle Scheduling Problem, DVSP)要求在实时变化的运输需求下,为车队安排最优的行车计划。假设有一个物流公司,拥有多辆货车,需要根据客户实时提交的货物运输请求(包括取货时间、地点、送货期限等),动态分配车辆并规划路径,目标是在满足所有请求的时间窗约束下,最小化总行驶成本(如距离或时间)。由于请求是动态到达的,传统静态优化方法无法直接应用,而列生成算法通过将问题分解为主问题(分配车辆路径)和子问题(生成新路径),能够高效应对动态场景。
解题过程
1. 问题建模
- 主问题(限制主问题,RMP):
假设当前已有一组初始可行路径集合 \(P\),每条路径 \(p\) 对应一个二进制变量 \(y_p\)(表示是否使用该路径),成本为 \(c_p\)。主问题目标是最小化总成本:
\[ \min \sum_{p \in P} c_p y_p \]
约束包括:
(1) 每个运输请求必须被恰好一条路径覆盖;
(2) 使用的路径数量不超过车队规模。
这是一个整数规划问题,但通常先松弛为线性规划求解。
- 子问题(定价问题):
子问题负责生成新的可行路径。其目标是为每辆车寻找一条成本最低的路径(考虑时间窗约束),并计算该路径的检验数(reduced cost)。若存在检验数为负的路径,则将其加入主问题。子问题可建模为带资源约束的最短路径问题(SPPRC),通过动态规划(如标签算法)求解。
2. 列生成流程
-
步骤1:初始化
生成一组初始可行路径(例如,每辆车只服务一个请求的简单路径),构成初始主问题。 -
步骤2:求解主问题的线性松弛
使用单纯形法求解当前RMP,得到对偶变量 \(\pi_i\)(对应每个请求的覆盖约束)和 \(\mu\)(对应车队规模约束)。 -
步骤3:求解子问题
利用对偶变量 \(\pi_i\) 和 \(\mu\),计算新路径的检验数 \(\bar{c}_p = c_p - \sum_{i \in p} \pi_i + \mu\)。
通过标签算法求解SPPRC,寻找检验数最小的路径。若最小检验数 \(\bar{c}_p^* \geq 0\),当前解已是最优;否则,将 \(\bar{c}_p^* < 0\) 的路径加入主问题。 -
步骤4:动态更新
当新运输请求到达时,更新主问题的约束(新增请求覆盖约束),并重新求解子问题以生成包含新请求的路径。重复步骤2-3直至无负检验数路径。 -
步骤5:整数解处理
列生成得到线性松弛最优解后,若解为分数,需结合分支定界法(分支定价)得到整数解。
3. 关键技术与细节
- 标签算法:在子问题中,每个路径状态用标签(如当前位置、时间、已服务请求)表示,通过扩展标签生成新路径,并利用支配规则剪枝无效状态。
- 动态性处理:新请求到达时,需快速更新对偶变量并重新定价,常用启发式(如限制生成路径数量)平衡实时性与最优性。
- 约束处理:时间窗约束在标签扩展时检查,若车辆到达时间早于请求最早时间需等待,晚于最晚时间则路径不可行。
示例说明
假设初始有3个请求,车队规模为2。列生成首轮生成两条路径:路径1服务请求1和3(成本=10),路径2服务请求2(成本=6)。主问题求解后对偶变量为 \(\pi_1=3, \pi_2=2, \pi_3=4, \mu=1\)。子问题中,新路径服务请求1和2的成本为9,检验数 \(\bar{c} = 9 - (3+2) + 1 = 5 > 0\),未改进;但路径服务请求2和3的成本为7,检验数 \(\bar{c} = 7 - (2+4) + 1 = 2 > 0\),无负检验数路径,当前解最优。若新请求4到达,主问题新增约束,重新触发列生成流程。