优化 CLPFD 性能(累积、global_cardinality)

Grz*_*ski 6 prolog swi-prolog clpfd

我编写了一些谓词来解决大型调度问题,它们运行良好,但我希望它们具有更好的性能。我运行过profile/1,我看到与 CLPFD 相关的谓词占用了 99% 的时间。特别是garbage_collect- 它需要 37% 的执行时间。

现在,我能做什么?我的代码并不是特别复杂,它使用了很多cumulative/2和一些global_cardinality/2,除此之外没有什么特别的。我已经为labeling/1(ff, ffc, bisect)尝试了一些不同的选项,但没有区别(实际上,bisect 让事情变得更糟)。我试过用set_prolog_stack/2(全局限制、局部限制、全局 min_free、局部 min_free)提高内存限制。

我还能做些什么吗?

是否有任何替代实施cumulative/2global_cardinality/2可以具有更好的性能?

pet*_*.fr 1

如果没有任何代码,只有问题域,我所能建议的就是考虑添加冗余约束以进一步减少搜索空间。

  • 用户对有效解决方案属性的考虑可能会提出冗余约束
  • 更通用的方法例如。双论文
  • 另一种方法是识别解决方案中不需要的对称性,然后添加消除此类对称性的约束。IE
    • 一个可以“轻松地”从另一个推断出来
    • 它们在某些方面“相似”,例如成本