2016-04-11 3 views
2

シャドー変数とカスタム変数リスナーについてのドキュメントを読んでいます。正しい動作をしているかどうかはわかりません。複数のシャドウ変数を更新するカスタム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メソッドをそのように呼び出す必要がありますか?

+1

カスタムシャドウバールを使用する場合は、少なくともoptaplannerの「6.3.0.Final」以降を使用してください。古いバージョンでは、それらは混乱を引き起こします(これは特定のユースケースの開発苦痛です)。 6.3以降では、それらは賢明で予測可能な順序で起動します。 –

+0

はい、私はその問題について読んでいます。私はOptaPlannerの最新バージョンを使用しています。しかし、これは連鎖された変数にのみ適用されるのでしょうか、それとも連鎖されない変数にも適用されますか? –

+1

すべてのシャドウバールに対して。 –

答えて

2

はい、これは一目瞭然です。 VRPチェーン内の1人の顧客の変更が、その顧客の後のチェーン内の他のすべての顧客の到着時間にどのように影響するかについての良い例は、たとえばArrivalTimeUpdatingVariableListenerを参照してください。

関連する問題