2016-06-10 63 views
3

我一直在试图实现一个影子变量,以便我的一个问题事实可以跟踪哪个计划实体与它有关,最终目标是简化/加速我的规则。InverseRelationShadowVariable必须属于一个planningEntity吗?

我正在查看optaplanner doc about shadow variables,特别是cloudBalancing示例。在“正常”云平衡中,类CloudComputer而不是 a planningEntity。但在下面的例子中,它被注解为一个planningEntity。

我们是否明白,“托管”影子变量的类应该是一个计划实体?我认为一个planningEntity必须有一个规划变量,但CloudComputer没有。如果答案是肯定的,我建议在文档中更明确一些。如果答案为否,那么在这个例子中有一个错误(@PlanningEntity注释应该从CloudComputer中删除)。

下面的例子是从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; 
    } 

} 

而且,这是真的所有这一切都需要,以便在解决期间克隆CloudProcess以使processList保持最新状态?

+0

您能否指出文档中的哪些位置存在混淆,计划实体可能包含阴影变量而不是'@ PlanningVariable'?我想解决这个问题。 –

+0

@GeoffreyDeSmet在4.3.3(关于计划实体的部分)中指出:“每个计划实体类都有一个或多个计划变量。”另外,我认为我没有在影子变量的章节中看到关于计划实体的任何提及,因为这是一个非常重要的问题,他们应该在计划实体类中。我意识到这就是为什么我的代码不工作,只有当我试图复制该示例,并注意到额外的注释。 –

+0

固定为7.0文档 –

回答

1

有两种规划变量:真正的(@PlanningVariable)和影子变量。任何具有任一种或其组合的任何类都需要注释为@PlanningEntity(并且除非使用scanAnnotatedClasses,否则添加到解算器配置中)。

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

+0

怎么样注释深层克隆类? (对于类不包含任何真正的规划变量的情况) –

+0

任何具有“@EntityEntity”的类都会被自动深度克隆,即使它只有阴影变量(因为它们是被深度克隆的原因)。 –

相关问题