
Ortools CP-SAT 求解器在 v9.11.4210 版本中存在已知缺陷:当 num_search_workers ≥ 8 时,求解器可能在预处理完成后立即卡死;该问题已在后续版本修复,升级至最新版即可解决。
ortools cp-sat 求解器在 v9.11.4210 版本中存在已知缺陷:当 `num_search_workers ≥ 8` 时,求解器可能在预处理完成后立即卡死;该问题已在后续版本修复,升级至最新版即可解决。
在使用 OR-Tools 的 CP-SAT 求解器进行大规模约束满足问题(如 N 皇后、调度、排班等)求解时,启用多工作线程(num_search_workers)是提升求解速度的关键手段。然而,v9.11.4210 及部分早期 9.x 版本中存在一个严重线程同步缺陷:当设置 solver.parameters.num_search_workers = 8 或更高值时,求解器常在完成 presolve 和 symmetry 分析后停滞于 #Model ... 日志阶段,CPU 占用率骤降,无任何错误或超时提示——表现为“假死”状态。
该问题与模型复杂度无关,即使是最简 N 皇后(n=8)也会复现,且严格限定于 worker 数 ≥ 8 的边界:设为 7 或更低则完全正常,设为 8 则 100% 冻结。根本原因在于该版本中并行搜索子系统(subsolvers)的初始化与资源注册逻辑存在竞态条件,导致主协调线程无法正确唤醒工作线程。
✅ 推荐解决方案:升级 OR-Tools
pip install --upgrade ortools
验证是否生效(当前最新稳定版 ≥ 9.12):
import ortools print(ortools.__version__) # 应输出类似 '9.12.4336' 或更高
升级后,相同代码将输出完整搜索日志,并在毫秒级内返回 OPTIMAL 解:
solver.parameters.num_search_workers = 8
status = solver.Solve(model)
print(f"Status: {solver.StatusName(status)}") # 输出: Status: OPTIMAL⚠️ 临时规避方案(不推荐长期使用)
若因环境限制无法升级,可采用以下折中策略:
- 将
num_search_workers限制为min(7, os.cpu_count()) - 或禁用并行搜索:
solver.parameters.num_search_workers = 1(牺牲性能保稳定性)
? 补充说明
- 此问题不影响单线程求解,所有模型逻辑和约束定义均正确;
- 不是内存溢出或死锁,而是底层线程池初始化失败导致的静默挂起;
- 官方 GitHub issue 已标记为 fixed in next release,对应 commit 已合并至 main 分支。
总之,遇到 CP-SAT 在 8+ workers 下冻结,请优先检查版本号并执行升级——这是最直接、安全且高效的解决路径。

















