シャドー変数とカスタム変数リスナーについてのドキュメントを読んでいます。正しい動作をしているかどうかはわかりません。複数のシャドウ変数を更新するカスタムVariableListener
4.3.6.4項のOptaPlannerマニュアルからコピーされています。 「カスタムVariableListener」
1 VariableListenerは( 二つの別々VariableListenersを有するのですることは非効率的であろう)は、2つの影の変数を変更した場合、その後variableListenerClassと 最初シャドウ変数に注釈を付けると 他のシャドウ変数(複数可せ本物の計画変数が変更されますと、我々が必要とするより多くの影の変数を持っている場合ので、私はこのことから理解し
@PlanningVariable(...) public Standstill getPreviousStandstill() { return previousStandstill; } @CustomShadowVariable(variableListenerClass = TransportTimeAndCapacityUpdatingVariableListener.class, sources = {@CustomShadowVariable.Source(variableName = "previousStandstill")}) public Integer getTransportTime() { return transportTime; } @CustomShadowVariable(variableListenerRef = @PlanningVariableReference(variableName = "transportTime")) public Integer getCapacity() { return capacity; }
:)最初の影の変数を参照それに応じて別の計画エンティティで更新されるためには、本物の計画エンティティに対して同じ変数リスナでこれを行うことができます。
これがそうなら、このようなものは有効でしょうか?
以下は、シャドウ計画エンティティのシャドウ変数の注釈付きメソッドです。
//shadow variables
protected Integer variable;
protected Integer shadowVariable2;
@CustomShadowVariable(variableListenerClass = CustomVariableListener.class,
sources = {@CustomShadowVariable.Source(variableName = "variable")})
public Integer getVariable() {
return variable;
}
@CustomShadowVariable(variableListenerRef = @PlanningVariableReference(variableName = "variable"))
public Integer getShadowVariable2() {
return shadowVariable2;
}
と本物計画エンティティのVariableListenerのコード
public class CustomVariableListener implements VariableListener<GenuinePlanningEntity> {
@Override
public void afterEntityAdded(ScoreDirector scoreDirector, GenuinePlanningEntity genuinePlanningEntity) {
}
@Override
public void afterEntityRemoved(ScoreDirector scoreDirector, GenuinePlanningEntity genuinePlanningEntity) {
}
@Override
public void afterVariableChanged(ScoreDirector scoreDirector, GenuinePlanningEntity genuinePlanningEntity) {
List<ShadowPlanningEntity> shadowPlanningEntities = genuinePlanningEntity.getShadowPlanningEntities();
Integer variable = genuinePlanningEntity.getVariable();
for(ShadowPlanningEntity shadowPlanningEntity : shadowPlanningEntities){
scoreDirector.beforeVariableChanged(shadowPlanningEntity,"variable");
shadowPlanningEntity.setVariable(variable);
scoreDirector.afterVariableChanged(shadowPlanningEntity,"variable");
scoreDirector.beforeVariableChanged(shadowPlanningEntity,"shadowVariable2");
shadowPlanningEntity.setshadowVariable2(shadowPlanningEntity.getshadowVariable2() + 1);
scoreDirector.afterVariableChanged(shadowPlanningEntity,"shadowVariable2");
}
}
@Override
public void beforeEntityAdded(ScoreDirector scoreDirector, GenuinePlanningEntity genuinePlanningEntity) {
}
@Override
public void beforeEntityRemoved(ScoreDirector scoreDirector, GenuinePlanningEntity genuinePlanningEntity) {
}
@Override
public void beforeVariableChanged(ScoreDirector scoreDirector, GenuinePlanningEntity genuinePlanningEntity) {
}
}
それが適切に影計画エンティティからすべてのシャドウ変数を更新する方法[OK]をされていない場合? shadow変数のbeforeVariableChangedメソッドとafterVariableChangedメソッドをそのように呼び出す必要がありますか?
カスタムシャドウバールを使用する場合は、少なくともoptaplannerの「6.3.0.Final」以降を使用してください。古いバージョンでは、それらは混乱を引き起こします(これは特定のユースケースの開発苦痛です)。 6.3以降では、それらは賢明で予測可能な順序で起動します。 –
はい、私はその問題について読んでいます。私はOptaPlannerの最新バージョンを使用しています。しかし、これは連鎖された変数にのみ適用されるのでしょうか、それとも連鎖されない変数にも適用されますか? –
すべてのシャドウバールに対して。 –