如何在OctaPy中建模带时间窗的时变车辆路径问题及相关约束
OctaPy建模带时间窗的多巡查VRP(道路交通执法场景)
针对你提出的三个建模疑问,以下是具体的实现思路:
1. 时变性行驶时长的建模
OctaPy中可以通过两种核心方式处理时段化的边权重:
- 节点时段拆分法:将每个物理节点按时间区间拆分为多个逻辑节点,比如把停车场节点
P拆分为P_0(0:00-6:00)、P_1(6:00-12:00)、P_2(12:00-18:00)、P_3(18:00-24:00)。不同时段的行驶边仅连接对应时段的逻辑节点,边的权重直接设为该时段的实际行驶时长。例如,从P_0到Q_0的边权重设为早高峰的行驶时间,P_1到Q_1设为平峰时间。 - 时间驱动的权重回调:保留原物理节点,给每条边添加一个包含各时段时长的字典属性(如
edge['time_costs'] = {0:10, 1:8, 2:12, 3:9},对应四个时段的分钟数)。在建模时,定义车辆的到达时间变量t_arrive,通过条件判断选择对应时段的权重计算路径成本,示例伪代码如下:# 假设edge是节点u到v的边,t_u是到达u的时间 period = (t_u // 3600) // 6 # 按6小时划分时段 travel_time = edge['time_costs'][period]
2. 需求点多次访问的建模
实现需求点被访问X次的需求,推荐两种直观方案:
- 节点复制法:将每个需要重复访问的需求点复制X份,作为独立的虚拟节点(比如
P_1、P_2...P_X),并将这些虚拟节点全部加入待访问节点集合。建模时约束所有虚拟节点必须被访问一次,本质上把多访问需求转化为多节点的单次访问需求,适配OctaPy原生的VRP约束逻辑。 - 访问次数约束法:保留原节点,定义整数变量
visit_count[v]表示节点v的访问次数,直接设置约束visit_count[v] = X。同时调整路径流约束,允许车辆多次进入/离开该节点(默认VRP约束通常限制单次访问,需修改为允许流的多次经过)。
3. 两次访问间隔的强制约束
结合上述多访问建模方案,可通过时间变量约束实现间隔要求:
- 若采用节点复制法:为每个虚拟节点定义访问时间变量
t[P_i],添加顺序约束保证后续访问的时间晚于前一次加固定间隔:
同时可约束虚拟节点的时间窗范围,确保所有访问落在24小时周期内。for i in range(1, X): add_constraint(t[P_{i}] >= t[P_{i-1}] + 3600) # 3600秒=1小时 - 若采用访问次数约束法:为节点
v定义X个时间戳变量t_v_1、t_v_2...t_v_X(分别对应第1到X次访问的时间),添加约束:
并约束这些时间戳按递增顺序排列,且均在24小时的时间范围内。for k in range(1, X): add_constraint(t_v_{k+1} >= t_v_{k} + 3600)
内容的提问来源于stack exchange,提问作者kangsoon93
相关产品推荐
相关产品推荐

