InverseRelationShadowVariable必须属于planningEntity吗?

时间:2016-06-10 14:40:28

标签: java optaplanner

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

我正在查看optaplanner doc about shadow variables,尤其是cloudBalancing示例。在"正常" cloudBalancing,类CloudComputer 一个planningEntity。但在下面的示例中,它被注释为planningEntity。

我们是否理解班级"托管" shadow变量应该是一个规划实体?我认为planningEntity必须有一个planningVariable,但CloudComputer没有。如果答案是肯定的,我建议在文档中更明确一点。如果答案为否,则此示例中存在错误(应从CloudComputer中删除@PlanningEntity注释)。

以下示例来自doc:

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

@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;
    }

}

另外,这是否真的需要这样才能使processList在解决期间克隆CloudProcess时保持最新状态?

1 个答案:

答案 0 :(得分:1)

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

是的,这是因为计划克隆。使用影子变量,CloudComputer在规划期间不会发生变化,因此不需要进行克隆计划。使用shadow变量,它在规划期间会发生变化,因此需要进行克隆。如果没有计划克隆,那么当内部工作解决方案发生变化时,最佳解决方案将会被破坏。这反过来会影响分数计算(如果它使用反向列表)和最佳解决方案事件的任何消费者或solve()返回的最佳解决方案结果。