Search code examples
optaplanner

optaplanner can't find annotated planning varible


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?


Solution

  • The error message is blaming the wrong reason. I created a jira.

    Use "bed" instead of "Bed".