Ich lese in der Dokumentation über Schattenvariablen und benutzerdefinierte Variable Listeners und ich fragte mich, ob ich auf dem richtigen Weg bin zu verstehen, wie sie funktionieren.Benutzerdefinierte VariableListener aktualisieren mehr als eine Schatten Variablen
Aus der OptaPlanner-Dokumentation in Abschnitt 4.3.6.4. „Custom VariableListener“
Wenn man VariableListener ändert zwei Schattenvariablen (weil zwei getrennte VariableListeners mit ineffizient wäre), dann mit Anmerkungen versehen nur den ersten Schatten Variable mit dem variableListenerClass und läßt die andere Schattengröße (s Referenz) den ersten Schatten Variable:
@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; }
so, wie ich aus dieser verstehen, wenn die Original-Planung Variable geändert wird und wir mehr Schatten Variablen haben, müssen Um dies in einer anderen Planungseinheit entsprechend zu aktualisieren, können wir dies im selben Variablenlistener für die echte Planungseinheit tun.
Wenn dies so ist, wäre dann so etwas gültig?
Hier sind die annotierten Methoden für die Schattenvariablen in der Schattenplanungsinstanz.
//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;
}
und der Code des VariableListener der echten Planungsgesellschaft
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) {
}
}
Wenn das nicht in Ordnung ist dann, wie man richtig die Schatten alle Variablen aus der Schattenplanungsgesellschaft aktualisieren? Sollten die Methoden beforeVariableChanged und afterVariableChanged der Schattenvariablen so heißen?
Wenn Sie benutzerdefinierte Schattenvars verwenden, verwenden Sie mindestens optaplanner '6.3.0.Final' oder höher, falls Sie dies nicht bereits getan haben. In älteren Versionen lösen sie chaotisch aus (was für bestimmte Anwendungsfälle ein Entwicklungsschmerz ist). In 6.3 und später lösen sie in einer vernünftigen, vorhersagbaren Reihenfolge aus. –
Ja, ich habe über dieses Problem gelesen, ich verwende die neueste Version von OptaPlanner. Aber gilt dies nur für verkettete Variablen oder auch für nicht verkettete Variablen? –
Für alle Schattenvars. –