我一直在尝试实现影子变量,以便我的问题事实之一可以跟踪与之相关的计划实体,最终目标是简化/加快我的规则。
我正在看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()
返回的最佳解决方案结果的任何使用者。