Choco solver传播和搜索策略互动

时间:2017-09-28 12:13:53

标签: java choco

我已经开始在我的工作中使用choco-solver,并且不理解传播者和搜索过程如何相互作用。

我认为choco有一些标志显示我是否有任何约束变量的域在传播过程中被更改。如果有,那么传播会一次又一次地开始,直到没有域发生变化。之后,如果约束仍未满足或失败,搜索策略将与解决过程相关联。

但我的节目输出告诉我,我错了。 Propogator真的可以工作2到3次,每次都会更改域名,但会调用搜索策略。

请帮助我,我的结论错在哪里? 或者它应该按照我的想法工作,并且我的代码中存在一些错误,导致输出错误?

抱歉我的英文不好

2 个答案:

答案 0 :(得分:2)

Choco是一个Constraint Programming求解器,这些求解器都按照相同的原理工作。

除了强力搜索之外,约束求解器将首先调用其所有传播器,以从变量域中删除它知道变量无法获取的值。调用一个传播器可能会触发新值变得不可能,从而可能触发其他传播器再次运行。

一旦所有传播者报告他们无法删除任何值(我们称之为此修复点),将咨询搜索策略以查看下一步操作。 (一般来说,这是对应该是什么解决方案的猜测,我们可能需要回溯)。

如果所有变量只有一个可能的值,那么这是一个解决方案。但是,在我们的搜索中,变量可能会丢失所有可能的值。在这种情况下,传播者将失败。如果我们已经使用过搜索,我们将需要回溯。如果这是在根节点,那么这意味着问题是不可满足的。

有关更多信息,请尝试使用多个约束求解器的教程。其中很多都可以在Wikipedia找到。您也可以找到在线课程。

答案 1 :(得分:0)

要完成Dekker的答案,并根据我的经验,在实践中通常会在相当少的迭代次数内达到修正点。这仍然可能很慢(因为存在许多约束或因为“全局约束”可能传播缓慢)但乒乓效应很少是戏剧性的。 Choco Solver和类似的解算器在传播方面有很多技巧......

所以在分支之前每个传播者只被调用2-3次是完全可以的。