【问题标题】:Optaplanner, update shadow variables after every stepOptaplanner,每一步后更新阴影变量
【发布时间】:2021-11-10 16:59:41
【问题描述】:

我正在尝试添加考虑当前工作解决方案状态的移动选择器。例如,假设在云平衡问题中,我试图采取行动,优先将进程移动到已经拥有很少进程的计算机上。我有一个影子变量来跟踪计算机上的进程数,然后我有一个 valueSelector 实现了 SelectionProbabilityWeightFactory,它为进程较少的计算机赋予了更高的权重。

此设置运行良好,可以产生我想要的动作。但它非常慢,因为它更新影子变量的频率远远超过我需要的频率。由于我没有使用此影子变量进行评分,因此我不需要在该步骤中尝试每次移动后对其进行更新。我只需要在每次接受移动(即步骤结束)后更新影子变量。

或者,我可以使用自定义移动工厂,但这要求每台计算机在每一步都完全重新计算其进程计数。这意味着我将失去使用影子变量获得的增量计算优势。

那么有没有办法强制影子变量在每一步之后更新,而不是在每次移动之后更新。或者有没有更好的方法来跟踪用于移动选择器的工作解决方案的状态?

【问题讨论】:

    标签: optaplanner


    【解决方案1】:

    首先是坏消息:

    不可能让VariableListener 每一步只更新一个影子变量,而不是每一步。而且我们不太可能希望允许这种特定的更改,因为它会损害移动迭代之间域模型状态的可预测性和完整性。如果使用稍有不正确,这可能会造成很多破坏,包括多种形式的损坏。


    接下来的好消息:

    是的,您需要计算每一步的一些状态才能有效地生成动作。这也是我之前遇到过几次的常见问题。 但是为什么要把它放在域模型上呢?它不属于那里。

    它属于移动选择器。例如,如果您使用 MoveIteratorFactory,它有一个名为 phaseStarted() 的方法(在阶段开始时调用)和一个方法 createRandomMoveIterator()(在步骤开始时调用,即使使用 SelectionCacheType.JIT)。

    这样的事情应该可以解决问题:

    public class MyMoveIteratorFactory implements MoveIteratorFactory<...> {
    
        default void phaseStarted(ScoreDirector<...> scoreDirector) {
        }
    
        Iterator<Move_> createRandomMoveIterator(ScoreDirector<...> scoreDirector, Random workingRandom) {
            List<Computer> alreadyUsedComputerList = ...; // runs once per step
            return new MyIterator(alreadyUsedComputerList, workingRandom);
    }
    

    现在,当多个移动选择器需要重复使用相同的计算时,情节会变厚。这就是 SupplyManager 发挥作用的地方,它不是公共 API。但这绝对是我们明年要做的“移动流 API”实验的一个很好的要求。

    【讨论】:

    • 问题是我的域模型可以有数千个计划实体。所以我想让“每一步运行一次”功能尽可能增量地运行,因为每一步只有一个或两个实体会发生变化。在createRandomMoveIterator 中是否有任何方法可以获取有关上一步中移动的信息,我可以使用这些信息来限制我的计算?
    • 不适用于 MyMoveIteratorFactory,这是一个没有那么强大功能的简化插件点。在内部,一个自定义的 MoveSelector 确实有这么大的权力——例如通过 SupplyManager,但是那个深层的 impl 领域(这里解释太多了)。举个例子,SwapMoveSelector impl 使用 SingletonInverseVariableSupply 并且该供应以增量方式保持最新。您正在处理什么样的用例?
    • 我有一种直觉,除非您的分数计算速度已经超过 10 000 并且需要更快(这可以通过这些先进技术实现),否则您没有在寻找正确的优化对象。
    • 我们的计算速度在 10,000 以上,但发现添加一个利用影子变量的移动选择器会大大减慢我们的速度。我只是想看看是否有更有效的方法来跟踪当前用于移动选择器的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多