我目前正在使用 OR-Tools 解决 Python(版本 3.12)中的 N-Queens 问题。具体来说,我正在尝试使用 CP-SAT 求解器和 OR-Tools 提供的原始求解器。
对于 CP-SAT 求解器,我使用了 Google 官方文档中提供的代码,可在 here 获取。同样,对于原始求解器,我参考了同一文档中提供的代码here。
但是,我发现这两个求解器之间的性能存在显着差异。例如,当解决棋盘上 12 个皇后时,以下是观察到的时间:
time python queens-original.py
Statistics
failures: 116806
branches: 262010
wall time: 688 ms
Solutions found: 14200
python queens-original.py 0.72s user 0.01s system 99% cpu 0.736 total
time python queens-cp-sat.py
Statistics
conflicts : 133465
branches : 708019
wall time : 10.891582737 s
solutions found: 14200
python queens-cp-sat.py 11.59s user 0.62s system 106% cpu 11.424 total
为了简化比较过程,我省略了负责在两个脚本中打印结果的部分。
我的问题有两个:
对于这个特定的问题实例,为什么原始求解器比 CP-SAT 求解器表现出明显更好的性能?
是否可以对 CP-SAT 实施进行任何优化或调整,以提高其性能并使其与原始求解器相比更具竞争力?
任何见解或建议将不胜感激。谢谢!
我尝试按照 Google 文档使用 CP-SAT 和原始 OR-Tools 求解器来解决 N-Queens 问题。有了 12 个皇后,原始求解器的性能明显快于 CP-SAT,这与我的预期相反。我正在寻求深入了解 CP-SAT 速度较慢的原因以及任何潜在的优化。
这个问题之前有人问过。
简短的回答,我们不关心 nqueens。它没有反映任何有用的问题。
它不测试求解器找到硬解或证明最优性的能力。它只是测试求解器处理节点和读取变量域的速度。
在这些方面,CP-SAT 比原始 cp 求解器慢得多。但在实际问题上,分析时永远不会出现读取域或处理节点,因此没有动力去优化求解器的这方面。