
本文介绍一种基于计数维度(Count Dimension)的巧妙建模方法,利用 OR-Tools 的路由求解器(RoutingModel)实现“子集内节点一旦被访问,就必须连续、无中断地全部访问”的强顺序约束,适用于如 A/C/E 必须成组紧邻执行的业务场景。
本文介绍一种基于计数维度(countdimension)的巧妙建模方法,利用 or-tools 的路由求解器(routingmodel)实现“子集内节点一旦被访问,就必须连续、无中断地全部访问”的强顺序约束,适用于如 a/c/e 必须成组紧邻执行的业务场景。
在 OR-Tools 的 CVRP 或 VRP 求解框架中,原生不支持 OnlyEnforceIf 等逻辑条件约束直接作用于路由变量(如 next_vars 或 active_vars),因此无法直接表达“若 A 被访问,则 C 和 E 必须紧随其后且中间不能插入其他非组内节点”这类条件性序列约束。但可通过引入位置计数维度(Index/Order Dimension),将“连续性”转化为“相对位置差界约束”,从而绕过逻辑条件限制,实现等效建模。
核心思路:用计数维度编码访问序号
为每个配送点(包括 A、C、E)分配一个全局访问序号(从 0 开始递增),该序号由 CumulVar 维度承载。设 count_dim 表示车辆路径上已访问的总节点数(含起点),则对任意两个节点 i 和 j,count_dim.CumulVar(i) 即为其在路径中的访问次序(索引)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
对于必须“启动即连续执行”的节点集合 S = {A, C, E}(|S| = 3),我们要求:
✅ 若任一节点被访问,则所有节点必须出现在路径中;
✅ 它们在路径中的索引值之差 ≤ |S| − 1 = 2(即最大间隔不超过 2 个位置);
✅ 结合“无重复访问”与“单条路径”前提,该差值约束可强制三者占据连续的三个位置(顺序可变,但不可分割)。
实现步骤(Python 示例)
from ortools.constraint_solver import routing_enums_pb2, pywrapcp
# 假设已构建 routing_model,并注册了节点索引:A=1, C=2, E=3(其余节点按需编号)
routing = pywrapcp.RoutingModel(num_locations, num_vehicles, depot)
# 创建计数维度:每经过一个节点 +1
count_dimension_name = 'count'
routing.AddDimension(
evaluator=lambda from_index, to_index: 1, # 每段弧贡献 1
slack_max=0, # 不允许跳过计数
capacity=num_locations, # 容量足够
fix_start_cumul_to_zero=True,
name=count_dimension_name
)
count_dim = routing.GetDimensionOrDie(count_dimension_name)
# 获取 A, C, E 对应的节点索引(注意:需与 routing_model 中实际索引一致)
indices = [idx_A, idx_C, idx_E] # e.g., [1, 2, 3]
# 添加两两之间的位置差约束:|pos[i] - pos[j]| <h3>注意事项与增强建议</h3>
- ✅ 有效性保障:该约束在单路径、无重复访问、计数严格递增的前提下,能唯一保证三节点占据连续位置(例如序号 5/6/7 或 10/11/12),无论排列顺序如何(A→C→E、E→A→C 等均合法)。
- ⚠️ 隐含前提:必须确保该组节点在解中全部被访问(若允许跳过,需额外添加“全选或全不选”逻辑,例如通过 ActiveVar 耦合:routing.ActiveVar(idx_A) == routing.ActiveVar(idx_C) == routing.ActiveVar(idx_E))。
- ? 扩展性:对大小为 n 的强制连续组,需添加 n × (n−1) 个两两差值约束(即 O(n²)),对小规模组(如 n≤5)完全可行;若组很大,可考虑引入辅助变量优化建模。
- ? 与其他约束协同:该方法兼容时间窗、载重、多车等标准维度,可叠加使用,无需修改求解器底层逻辑。
综上,借助计数维度将“连续性”转译为线性整数约束,是 OR-Tools 路由建模中处理条件序列问题的经典且稳健的工程实践——无需依赖尚未支持的逻辑条件语法,即可精准表达复杂业务规则。










