
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)本应显著提升性能。但部分用户反馈:当设置 solver.parameters.num_search_workers = 8 或更高值时,程序会在日志输出 #Model 0.11s var:59/60 constraints:114/114 后完全冻结,不再推进搜索进程——而将线程数设为 1–7 则运行正常。这一现象并非模型建模错误或资源不足所致,而是特定版本(v9.11.4210)中并发调度模块的一个已确认 Bug。
该 Bug 根源于 CP-SAT 内部多工作线程初始化阶段的竞态条件或同步阻塞,尤其在涉及对称性检测(Symmetry computation)和子求解器(subsolver)注册环节表现明显。从日志可见,预处理(presolve)与对称性分析均成功完成,但后续“Starting search”阶段始终未触发,说明控制流卡在工作线程分发或主协调器等待环节。
✅ 根本解决方案:升级 OR-Tools
官方已在后续版本(如 v9.12+)中修复此问题。验证方式如下:
# 确保安装最新稳定版(截至 2024 年推荐 ≥ v9.12)
!pip install --upgrade ortools
# 升级后,以下代码可稳定运行(8 workers 正常启动搜索)
from ortools.sat.python import cp_model
n = 8
model = cp_model.CpModel()
queens = [model.NewIntVar(0, n - 1, f"queen_{i}") for i in range(n)]
model.AddAllDifferent(queens)
for i in range(n):
for j in range(i + 1, n):
model.AddAbs(queens[i] - queens[j]) != abs(i - j) # 推荐改用 AddAbs 提升可读性
solver = cp_model.CpSolver()
solver.parameters.max_time_in_seconds = 10
solver.parameters.log_search_progress = True
solver.parameters.num_search_workers = 8 # ✅ 现在安全可用
status = solver.Solve(model)
print(f"Status: {solver.StatusName(status)}")
⚠️ 临时规避方案(不推荐长期使用)
若因环境限制无法立即升级,可采用以下折衷策略:
- 将
num_search_workers限制在min(7, os.cpu_count()) - 关闭对称性检测(降低求解效率但避免触发 Bug):
solver.parameters.cp_model_probing_level = 0solver.parameters.symmetry_level = 0
? 注意事项
- 该 Bug 与模型规模无直接关系,即使简单问题(如 8 皇后)也会复现;
- 日志中出现
[Symmetry] #generators: 1, average support size: 72等对称性信息是典型触发特征; -
num_search_workers=0(自动选择)在旧版本中也可能退化为单线程,不解决根本问题; - 升级后建议启用
log_search_progress=True验证多线程是否真正生效(日志中应出现Starting search at ... with 8 workers及各 subsolver 的并行统计)。
综上,这不是用户代码缺陷,而是求解器底层实现的版本兼容性问题。优先通过 pip install --upgrade ortools 更新依赖,即可安全启用全部 CPU 核心加速 CP-SAT 求解。










