如何在 OR-Tools 路由问题中强制执行“启动即连续执行”的条件约束

夜丽君_9189

夜丽君_9189

2026-08-06

712人浏览

原创

如何在 OR-Tools 路由问题中强制执行“启动即连续执行”的条件约束

本文介绍一种基于计数维度(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) 即为其在路径中的访问次序(索引)。

Skill Weave Chains — 技能链路由引擎
Skill Weave Chains — 技能链路由引擎

开箱即用的技能链路由引擎。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 路由建模中处理条件序列问题的经典且稳健的工程实践——无需依赖尚未支持的逻辑条件语法,即可精准表达复杂业务规则。

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

路由

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1771

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4564

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26917

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3247

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3267

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2543

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Revel 官方开发手册
Revel 官方开发手册

共0课时 | 0人学习

Buffalo框架路由开发手册
Buffalo框架路由开发手册

共0课时 | 0人学习

Buffalo框架官方文档
Buffalo框架官方文档

共0课时 | 0人学习