【发布时间】:2017-05-19 13:16:58
【问题描述】:
最近有人问here如何实现一个监听器,其中源变量在不同规划实体类上,例如
@PlanningEntity
class FirstPlanningEntityClass{
@PlanningVariable
int a;
}
和
@PlanningEntity
class SecondPlanningEntityClass{
@PlanningVariable
int b;
}
在我的第三个(影子)计划实体中,我想在 a 或 b 更改(即 a 和 b 作为源)时更新我的影子计划变量,例如:
@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_>{...}
但源变量在两个规划实体类上。
为了解决这个问题,我尝试了几件事:
- 我无法将
FirstPlanningEntityClass和FirstPlanningEntityClass与例如一个常见的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