我一直在尝试实施一个影子变量,以便我的一个问题事实可以跟踪哪个规划实体与之相关,最终目标是简化/加快我的规则。
我正在查看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
时保持最新状态?
答案 0 :(得分:1)
有两种计划变量:真实(@PlanningVariable
)和阴影变量。任何具有其中任何一个或其组合的类都需要注释为@PlanningEntity
(并添加到求解器配置中,除非您使用scanAnnotatedClasses)。
是的,这是因为计划克隆。使用影子变量,CloudComputer在规划期间不会发生变化,因此不需要进行克隆计划。使用shadow变量,它在规划期间会发生变化,因此需要进行克隆。如果没有计划克隆,那么当内部工作解决方案发生变化时,最佳解决方案将会被破坏。这反过来会影响分数计算(如果它使用反向列表)和最佳解决方案事件的任何消费者或solve()
返回的最佳解决方案结果。