【问题标题】:Must an InverseRelationShadowVariable necessarily belong to a planningEntity?InverseRelationShadowVariable 必须属于 PlanningEntity 吗?
【发布时间】:2016-10-11 14:02:34
【问题描述】:

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

我正在查看optaplanner doc about shadow variables,尤其是 cloudBalancing 示例。在“正常”cloudBalancing 中,CloudComputer不是计划实体。但是在下面的示例中,它被注释为planningEntity。

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

以下示例来自文档:

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

@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?我想解决这个问题。
  • @GeoffreyDeSmet 在 4.3.3(关于规划实体的部分)中声明:“每个规划实体类都有一个或多个规划变量。”此外,我认为我在有关影子变量的部分中没有看到任何提及计划实体的内容,因为它们应该在计划实体类中是非常关键的一点。我意识到这就是为什么我的代码只有在我尝试复制示例并注意到额外的注释时才工作的原因。
  • 针对 7.0 文档修复

标签: java optaplanner


【解决方案1】:

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

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

【讨论】:

  • 为深度克隆注释类怎么样? (对于类不包含任何真正的计划变量的情况)
  • 任何带有@PlanningEntity 的类都会被自动深度克隆,即使它只有影子变量(因为它们是它被深度克隆的原因)。
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 2011-07-07
  • 2011-06-29
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多