【问题标题】:Choco solver propogation and search strategy interactionChoco求解器传播和搜索策略交互
【发布时间】:2017-09-28 12:13:52
【问题描述】:

我已经开始在工作中使用 choco-solver,但不明白传播者和搜索策略如何相互影响。

我认为 choco 有一些标志可以告诉我在传播期间是否有任何约束变量域发生了变化。如果有,那么传播会一次又一次地开始,直到没有发生域更改。之后,如果约束仍然不满足或失败,则将搜索策略连接到求解过程。

但是我的程序的输出表明我错了。 Propogator 确实工作了 2 到 3 次,每次都更改域,但随后会调用搜索策略。

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

对不起我的英语不好

【问题讨论】:

    标签: java choco


    【解决方案1】:

    Choco 是一个约束编程求解器,这些求解器都按照相同的原理工作。

    与蛮力搜索不同,约束求解器将首先调用所有(相关)传播器从变量域中删除它知道变量不能获取的值。调用一个传播器可能会触发新值变得不可能,从而可能触发其他传播器再次运行。

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

    如果所有变量只有一个可能的值,这是一个解决方案。但是,在我们的搜索中,变量可能会丢失所有可能的值。在这种情况下,传播者将失败。如果我们已经使用了搜索,我们将需要回溯。如果是在根节点,则说明问题无法解决。

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

    【讨论】:

    • 看起来你重复了我对维基语言的假设。所以这意味着我的代码中有一些错误会在传播者到达固定点之前激活搜索策略。谢谢你的回答!
    【解决方案2】:

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

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

    【讨论】:

    • 问题是在传播者到达固定点之前开始分支。我正在关注变量域,因此可以肯定地说它们在分支之前的每次传播中都会发生变化。问题是:这正常吗?
    • 问题是在传播者到达固定点之前开始分支。 -> 你怎么知道?您说每次传播时域都会发生变化......这并不意味着没有达到固定点。为了证明没有达到固定点,您必须证明,如果再次调用传播,那么将会有新的域更改
    • 如果系统在最后一次更改后甚至没有尝试传播,如何理解已达到修复点?反正我写了propogator的逻辑,我在看constraint的状态,所以我可以肯定地说propogator在进一步的迭代中应该做一些改变,但是出现了分支。
    • 您的模型中有哪些约束?例如,如果您有累积约束,我认为有一种“快速”模式不应用固定点,但这种情况很少见
    • 我对 IntVar-variables 的一个传播者和搜索策略有简单的 choco 约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多