I want to delete or add some ProblemFacts to the solver while the solver solve my patient admission solution.
In the documentation from optaplanner I can add about solver.addProblemFactChange some ProblemFacs, but it doesn't work in my PAS example.
Here is a snippet of my code of PatientAdmissionScheduleGenerator
public void addBedDesignation(final BedDesignation bedDesignation){
this.solver.addProblemFactChange(scoreDirector -> {
PatientAdmissionScheduleSolution patientAdmissionScheduleSolution = scoreDirector.getWorkingSolution();
patientAdmissionScheduleSolution.getBedDesignationList().add(bedDesignation);
});
}
public void deleteBedDesignation(final BedDesignation bedDesignation){
// Neues Problem dem Solver zuführen
this.solver.addProblemFactChange(scoreDirector -> {
// Erstelle eine neue PAS-Solution auf Basis der gerade läuft
PatientAdmissionScheduleSolution patientAdmissionScheduleSolution = scoreDirector.getWorkingSolution();
// Erstelle eine neue Bettzuweisung auf Basis der
BedDesignation workingBedDesignation = scoreDirector.lookUpWorkingObject(bedDesignation);
for(BedDesignation designation : patientAdmissionScheduleSolution.getBedDesignationList()){
if(designation.equals(bedDesignation)){
scoreDirector.beforeVariableChanged(designation, "Bed");
designation = null;
scoreDirector.afterVariableChanged(designation,"Bed");
}
}
ArrayList<BedDesignation> bedDesignationArrayList = new ArrayList<>(patientAdmissionScheduleSolution.getBedDesignationList());
patientAdmissionScheduleSolution.setBedDesignationList(bedDesignationArrayList);
scoreDirector.beforeProblemFactRemoved(workingBedDesignation);
bedDesignationArrayList.remove(workingBedDesignation);
scoreDirector.afterProblemFactRemoved(workingBedDesignation);
scoreDirector.triggerVariableListeners();
});
}
Here is a snippet of my changed Object BedDesignation
@PlanningVariable(nullable = true, valueRangeProviderRefs = {"bedRange"}, strengthComparatorClass = BedStrengthComparator.class)
public Bed getBed() {
return bed;
}
An here is my error message when I want to delete a BedDesignation Object
Exception in thread "main" java.lang.IllegalArgumentException: The variableName (Bed) for entityClass (class pas.entity.domain.BedDesignation) exists as a property (getter/setter) on that class, but not as an annotated as a planning variable.
Check if your planning entity's getter has the annotation PlanningVariable (or a shadow variable annotation).
I have annotated bed as PlanningVariable. What is wrong?
The error message is blaming the wrong reason. I created a jira.
Use "bed" instead of "Bed".