恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
CP-SAT Primer基础建模清单:CP-SAT约束规划求解器的变量类型、目标函数与常用约束大全
首页
资讯中心
/
CP-SAT Primer基础建模清单:CP-SAT约束规划求解器的变量类型、目标函数与常用约束大全
CP-SAT Primer基础建模清单:CP-SAT约束规划求解器的变量类型、目标函数与常用约束大全
发布时间:2026/8/23 17:55:48
CP-SAT Primer基础建模清单CP-SAT约束规划求解器的变量类型、目标函数与常用约束大全【免费下载链接】cpsat-primerThe CP-SAT Primer: Using and Understanding Google OR-Tools CP-SAT Solver项目地址: https://gitcode.com/gh_mirrors/cp/cpsat-primerCP-SAT Primer是一份手把手教你使用和理解 Google OR-Tools 中CP-SAT 约束规划求解器的开源教程。这篇文章提炼出它最核心的基础建模清单CP-SAT 变量类型布尔变量、整数变量、目标函数最小化/最大化以及常用约束大全帮助你在不背 API 的情况下快速看懂一个约束规划模型是怎么搭起来的。图CP-SAT 求解一个旅行商问题TSP得到的最优路径——每一个点、每一条线背后都是变量、约束与目标函数协同工作的结果。一、为什么用 CP-SAT一个求解器覆盖逻辑密集型优化问题 传统 MIP混合整数规划求解器擅长连续 整数的数学结构但一旦问题里充满逻辑条件如果开工就必须排班、三选一、互不重叠建模会变得非常痛苦。CP-SAT正是为这类问题而生的约束规划求解器它把 SAT 求解器和传播器结合在一起让逻辑约束成为一等公民。CP-SAT Primer 的核心观点是建模的正确性优先于技巧。在 chapters/modelling.md 中作者把基础建模拆成三大件——变量Variables决策由谁承载目标Objectives什么叫好的解约束Constraints什么叫可行的解下面按这个顺序给出清单。二、第一步选对 CP-SAT 变量类型这是新手最容易踩坑的地方。CP-SAT 只有两类真正的决策变量变量类型创建方式用途注意事项布尔变量new_bool_var选/不选、开/关类决策自带取反~b是建模主力整数变量new_int_var数量、时间、位置等整数值必须给出上下界常数值new_constant用数值占位便于重构替换变量主要用于布尔位置区间变量new_interval_var等排程中的时间段进阶章节本质是整数变量的组合三条新手必须知道的事实没有浮点数。CP-SAT 中既没有连续变量也没有浮点常量。需要小数时把所有数值放大 100 倍即精度 0.01用整数表示。上界越紧越好。作者在实际项目中观察到把整数变量的上下界收紧几个百分点求解速度就有明显提升。不要手动调 Big-M。CP-SAT 与 MIP 求解器不同它更少依赖线性松弛高级约束如all_different往往比手工线性化更高效。三、第二步写对目标函数ObjectiveCP-SAT 的目标函数很简单model.minimize(线性表达式)/model.maximize(线性表达式)目标必须是线性表达式更复杂的表达式用辅助变量 约束间接表达比如绝对值先建一个abs_x变量用add_abs_equality绑定再最小化它。有些问题根本不需要目标函数——只要可行解即可。CP-SAT 找可行解的能力恰恰是 MIP 求解器的弱项这是它的独门优势。两个进阶技巧字典序优化多轮求解每轮把上一轮的最优值固定为约束再优化下一目标。非线性目标借助分段线性近似。如下图红色折线就是对非线性成本函数的分段线性逼近CP-SAT 可以直接用约束表达。图用分段线性函数红折线逼近非线性函数——这是把非线性目标翻译成 CP-SAT 线性模型的常用手段详见 chapters/advanced_modelling.md。四、第三步常用约束大全一张表看懂下表汇总了 chapters/modelling.md 中基础约束的名字、作用、典型场景建议收藏约束API作用典型场景线性约束add/add_linear_constraint经典的、、线性不等式资源上限、容量限制逻辑或add_bool_or/add_at_least_one至少一个布尔变量为真三个班次至少排一个逻辑与add_bool_and/add_at_most_one全部为真 / 至多一个为真互斥选项恰好一个add_exactly_one有且仅有一个为真唯一负责人逻辑异或add_bool_xor二者必居其一二选一决策蕴含add_implicationb1 为真 ⇒ b2 为真开关联动条件约束only_enforce_if若 b 为真则强制该约束选不同卡车有不同载重上限绝对值/最值add_abs_equality/add_max_equality/add_min_equality表达 |x|、max、min偏差最小化、完工时间乘除模add_multiplication_equality等变量间乘、除、取模二次关系、时刻换算全不同add_all_different一组变量取值互不相同排班、数独、频率分配允许/禁止组合add_allowed_assignments/add_forbidden_assignments按表格限定可行组合班次模式、设备配置元素/数组add_element/add_inverse用变量作下标取数组元素位置匹配、置换问题图add_inverse约束的直观示意——上排是数组值下排是它对应的下标两者互为逆置换这是 CP-SAT元素/数组约束家族的典型用法。清单小贴士一组两两!的变量优先用add_all_different表达——它有专门的传播器通常比 O(n²) 条不等式更快。示例见 examples/add_all_different.ipynb。五、新手易踩的 5 个坑 写了小数约束里出现 0.5 会直接报错或行为异常——先整体放大成整数。整数解不存在CP-SAT 没有 MIP 求解器那种可行性容差。两个线性约束的交点若非整数模型就是不可行的。上下界太松new_int_var(-10**9, 10**9)式的写法会显著拖慢传播尽量给出紧界。滥用only_enforce_if它是快速原型的好工具但复杂模型中往往有等价的、更快的逻辑写法可先跑通再优化。混合!与add_all_differentCP-SAT 会因此关闭部分自动推理性能可能不升反降保持一致即可。这些点都可以在配套测试中反复验证例如 tests/test_all_different.py 与 tests/test_objective.py用测试驱动方式学习约束行为是 Primer 推荐的做法见 chapters/test_driven_optimization.md。六、学完清单之后往哪里走 安装与环境一条pip install -U ortools即可详见 chapters/installation.md。完整示例chapters/example.md 用几十行代码完整走通建模→求解→读结果。进阶约束add_circuit旅行商、add_no_overlap排程、add_cumulative资源日历、自动机等集中在 chapters/advanced_modelling.md。声明式建模想系统掌握从问题描述到正确模型的方法论可阅读 manuscripts/cpsat_declarative_modeling/ 中的配套论文。[!TIP] 记住这张清单的口诀变量定域整数紧界、目标线性复杂就辅助变量、约束高级化信任求解器别手工线性化。做到这三点你的第一个 CP-SAT 模型就会又快又对。【免费下载链接】cpsat-primerThe CP-SAT Primer: Using and Understanding Google OR-Tools CP-SAT Solver项目地址: https://gitcode.com/gh_mirrors/cp/cpsat-primer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考