NuCS 与 Choco:纯 Python 约束求解器与 JVM 资深人士的结合

比较 Nucs 和 Choco 的深入性能测试NuCS vs Choco:纯 Python 约束求解器遇见 JVM 老手的帖子首先出现在 Towards Data Science 上。

来源:走向数据科学

NuCS 是一个 100% 用 Python 编写的约束求解器,由我开发,由 NumPy 和 Numba 加速。Choco 是参考开源约束求解器之一,用 Java 编写,开发了二十多年。

比较它们看起来是不平衡的:解释语言与高度优化的 JVM 求解器相比,具有丰富的弧一致全局约束目录。 现实更有趣。 当两个求解器运行相同的模型时,出于所有实际目的,它们的速度相同 - 并且在最大的实例上,NuCS 实际上领先,因为一旦 Numba 编译了内部循环,Python 税就消失了,只剩下每个节点的成本。 当模型不同时,结果是真正的交易而不是溃败:在某些问题上,Choco 的弧线一致性是正确、快速的工具; 在其他方面,NuCS 廉价的绑定一致性加上一点重构完全获胜; 在至少一个问题上,NuCS 的建模自由度使其能够解决普通求解器无法解决的实例。

本文介绍了五个基准问题,为每个问题提供了准确的 NuCS 命令行,详细说明了约束和搜索策略,绘制了性能曲线,最后给出了解释整个情况的设计决策:NuCS 表示域 asmin..maxintervals,因此仅限于边界一致性,而 Choco 也可以表示有孔的域并运行全弧一致性。

此处显示的所有 NuCS 代码均位于 MIT 许可下的 NuCS 存储库中。

NuCS

历史

架构

问题带有变量域的 NumPy 数组——每个变量一对(最小,最大),当 min == max 时绑定一个变量——以及传播器列表。 传播器是约束的过滤算法,注册在数字 ALG_* 标识符下。 每个传播器都是三个小函数:

  • compute_domains_*——实际过滤,返回不一致、一致性或蕴涵;
  • get_triggers_*——哪些域事件应该重新唤醒传播器;
  • 巧克力

    比较设置

    NuCS 命令行:

    结论