Timefold Solver 是否按照 ConstraintProvider 默认定义的顺序(或优先级)应用(并检查)约束?或者,更准确地说,当求解器尝试解决特定问题时,它的约束如何工作?
考虑以下具有 2 个约束的情况:
- 约束A(具有复杂的实现)
- 约束 B(具有简单的实现;即简单的条件检查)
这两个约束的应用顺序是什么?
有没有一种方法可以对 ConstraintProvider 中的约束进行排序,以便更有效地应用约束?
例如:
情况a):约束的顺序是约束A,约束B
应用约束 A(并执行必要的移动以获得更好的解决方案)后,在约束 B 中将有可能不受惩罚。
情况b):约束的顺序是约束B,约束A
应用约束 B(并执行必要的移动以获得更好的解决方案)后,在约束 A 中将有可能受到额外的惩罚。
我希望这些问题有意义。如果没有,请随时编辑这篇文章。任何帮助将不胜感激。
约束没有顺序,因为所有约束都存在于一个大桶中,并且无法相互区分,就像液体混合成均匀溶液一样。所有约束条件都会同时评估。
考虑两个约束流:
请注意,它们有一些共同点:
这意味着求解器将
Visit
首先将所有 s 发送到那里。(因此,现在无论有多少约束,Visit
s 都只会被处理一次!)从那里,Visit
s 将继续:在A2中,所有
Visit
实例都会因惩罚而终止。然而,在 B2 中,所有Visit
与过滤器匹配的实例都会继续:到这里,所有
Visit
处理终于完成。换句话说 - 约束构建了一个节点图;源是
forEach()
节点,汇是惩罚。然后求解器通过该图发送所有问题事实和实体。这些节点具有处理它们的顺序,并且该顺序可能与创建这些节点的约束的原始顺序相关,但这在很大程度上是无关的 - 如果节点的顺序不同,结果将恰好是相同的; 唯一重要的是这些节点之间的边。我们从源节点开始,沿着边缘向汇节点移动。由此,希望大家能够看到,没有什么约束顺序。所有约束都被分解并变成单节点网络,最终会受到惩罚。这几乎就是RETE 算法的作用。