【问题标题】:CustomVariableListener with sources of different entities - Parameterization of Listener具有不同实体来源的 CustomVariableListener - 侦听器的参数化
【发布时间】:2017-05-19 13:16:58
【问题描述】:

最近有人问here如何实现一个监听器,其中源变量在不同规划实体类上,例如

@PlanningEntity
class FirstPlanningEntityClass{

  @PlanningVariable
  int a;
}

@PlanningEntity
class SecondPlanningEntityClass{

  @PlanningVariable
  int b;
}

在我的第三个(影子)计划实体中,我想在 ab 更改(即 ab 作为源)时更新我的​​影子计划变量,例如:

@PlanningEntity //shadow planning entity
class ShadowEntityClass{
  @CustomShadowVariable(variableListenerClass = MyListener.class,
        sources = {@CustomShadowVariable.Source(entityClass = FirstEntityClass.class, variableName = "a"),
                @CustomShadowVariable.Source(entityClass = SecondEntityClass.class, variableName = "b")})
  public local int getMyShadowVariable(){...}

但是,MyListenerClass 必须实现一个参数化的VariableListener,只有一个类型参数,其中类型参数对应于源变量所在的实体类:

public class MyListenerClass implements VariableListener<Entity_>{...}

但源变量在两个规划实体类上。

为了解决这个问题,我尝试了几件事:

  • 我无法将 FirstPlanningEntityClassFirstPlanningEntityClass 与例如一个常见的CommonPlanningEntityInferface,因为这两个实体类完全不同。这个通用接口可以用作VariableListener 的类型参数。
  • 我也不能在@CustomShadowVariable参数列表中指定两个不同的监听类,比如

    @CustomShadowVariable(variableListenerClass = MyFirstListener.class,
    sources = {@CustomShadowVariable.Source(entityClass = FirstPlanningEntity.class, variableName = "a")}, 
    variableListenerClass = MySecondListener.class, 
    sources = {@CustomShadowVariable.Source(entityClass = SecondPlanningEntity.class, variableName = "b")})
    
  • 或两个注释叠加在一起,例如

    @CustomShadowVariable(variableListenerClass = MyFirstListener.class,
    sources = {@CustomShadowVariable.Source(entityClass = FirstPlanningEntity.class, variableName = "a")})
    @CustomShadowVariable(variableListenerClass = MySecondListener.class,
    sources = {@CustomShadowVariable.Source(entityClass = SEcondPlanningEntity.class, variableName = "b")})
    

本手册仅涉及同一类的多个计划变量或不同类的一个计划变量(第 4.3.6.4.、6.5.0 节)。

那么我如何实现一个影子变量,它有两个来自不同计划实体类的计划变量作为源? here 给出的答案主要涵盖了one 规划实体类中两个影子变量的变化。

【问题讨论】:

  • 按照设计,每个影子变量只允许一个变量监听器实现(因此它们不能相互矛盾)。

标签: optaplanner


【解决方案1】:

使用通用接口或简单的旧 java.lang.Object 作为通用参数类型:

public class MyListenerClass implements VariableListener<Object>{...}

您的实现可能需要instanceof 检查源实例并相应地转换为第一类或第二类。

【讨论】:

    【解决方案2】:

    很抱歉打扰大家 - 多么愚蠢的问题。

    我需要做的就是在ShadowEntityClass 上创建两个interim 影子变量,分别监听ab。然后,我使用这些临时影子变量在 getMyShadowVariable 上创建一个侦听器,这些临时影子变量现在与源位于同一规划实体类中。

    (但是,我仍然认为注解签名不应该允许来自多个规划实体类的影子变量)。

    【讨论】:

    • 这很冗长并且可能更慢。试试implements VariableListener&lt;Object&gt; :)
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多