我一直在尝试实现影子变量,以便我的问题事实之一可以跟踪与之相关的计划实体,最终目标是简化/加快我的规则。

我正在看optaplanner doc about shadow variables,尤其是cloudBalancing示例。在“普通” cloudBalancing中,类CloudComputer不是PlanningEntity。但是在下面的示例中,它被注释为planningEntity。

我们是否理解“托管” shadow变量类应该是计划实体?我以为planningEntity必须具有planningVariable,但CloudComputer没有。 如果答案是肯定的,我建议在文档中对其进行更明确的说明。如果答案为否,则此示例中有错误(应从CloudComputer中删除@PlanningEntity批注)。

以下示例来自文档:

对于非链式计划变量,双向关系必须是多对一关系。要映射两个计划变量之间的双向关系,请将主端(这是真实端)注释为正常的计划变量:

@PlanningEntity
public class CloudProcess {

    @PlanningVariable(...)
    public CloudComputer getComputer() {
        return computer;
    }
    public void setComputer(CloudComputer computer) {...}

}

和:
@PlanningEntity
public class CloudComputer {

    @InverseRelationShadowVariable(sourceVariableName = "computer")
    public List<CloudProcess> getProcessList() {
        return processList;
    }

}

另外,这真的是所有必要的,以便即使在求解过程中克隆了CloudProcess时,processList仍保持最新状态吗?

最佳答案

有两种类型的计划变量:真实变量(@PlanningVariable)和阴影变量。任何具有其中一个或其组合的类都需要注释为@PlanningEntity(除非已使用scanAnnotatedClasses,否则应添加到求解器配置中)。

是的,这是由于计划克隆。使用shadow变量,CloudComputer在计划期间不会更改,因此不需要计划克隆。使用shadow变量,它在计划期间会更改,因此需要对其进行克隆。如果不打算克隆,则当内部工作解决方案发生更改时,最佳解决方案将被破坏。反过来,这会影响得分计算(如果它使用反向列表)以及最佳解决方案事件或solve()返回的最佳解决方案结果的任何使用者。

09-04 02:30