Ich implementiere einen ähnlichen Algorithmus wie den NurseRoster in OptaPlanner. Ich muss eine Regel in Drools implementieren, die überprüfen, ob die Employee
nicht mehr Tage als die Anzahl der Tage in seiner contract
arbeiten kann. Da ich nicht herausfinden konnte, wie man das in Drools macht, entschied ich mich, es als eine Methode in einer Klasse zu schreiben, und dann in Drools zu verwenden, um zu überprüfen, ob die Beschränkung gebrochen wurde. Da ich einen List
von ShiftAssignments
in der Employee
Klasse brauchte, musste ich einen @InverseRelationShadowVariable
verwenden, der diese Liste automatisch aktualisierte Employee
wurde einem Shift
zugewiesen. Da meine Employee
jetzt eine PlanningEntity
sein muss, erschien der Fehler The entity was never added to this ScoreDirector
. Ich glaube, dass der Fehler durch meine ShiftAssignment
Einheit verursacht wird, die eine @ValueRangeProvider
von employees
hat, die in dieser Shift
arbeiten kann. Ich denke, das liegt an der Tatsache, dass ScoreDirector.beforeEntityAdded
und ScoreDirector.afterEntityAdded
nie aufgerufen wurden, daher der Fehler. Aus irgendeinem Grund, als ich diesen Bereichsprovider von ShiftAssignment
entfernte und ihn auf NurseRoster
setzte, was der @PlanningSolution
ist, funktionierte es. HierOptaPlanner - Die Entität wurde nie zu diesem ScoreDirector-Fehler hinzugefügt.
ist der Code:
Mitarbeiter:
@InverseRelationShadowVariable(sourceVariableName = "employee")
public List<ShiftAssignment> getEmployeeAssignedToShiftAssignments() {
return employeeAssignedToShiftAssignments;
}
ShiftAssignment:
@PlanningVariable(valueRangeProviderRefs = {
"employeeRange" }, strengthComparatorClass = EmployeeStrengthComparator.class,nullable = true)
public Employee getEmployee() {
return employee;
}
// the value range for this planning entity
@ValueRangeProvider(id = "employeeRange")
public List<Employee> getPossibleEmployees() {
return getShift().getEmployeesThatCanWorkThisShift();
}
NurseRoster:
@ValueRangeProvider(id = "employeeRange")
@PlanningEntityCollectionProperty
public List<Employee> getEmployeeList() {
return employeeList;
}
Und das ist die Methode, die ich zu aktualisieren verwenden, die listOfEmployeesThatCanWorkThisShift
:
public static void checkIfAnEmployeeCanBelongInGivenShiftAssignmentValueRange(NurseRoster nurseRoster) {
List<Shift> shiftList = nurseRoster.getShiftList();
List<Employee> employeeList = nurseRoster.getEmployeeList();
for (Shift shift : shiftList) {
List<Employee> employeesThatCanWorkThisShift = new ArrayList<>();
String shiftDate = shift.getShiftDate().getDateString();
ShiftTypeDefinition shiftTypeDefinitionForShift = shift.getShiftType().getShiftTypeDefinition();
for (Employee employee : employeeList) {
AgentDailySettings agentDailySetting = SearchThroughSolution.findAgentDailySetting(employee, shiftDate);
List<ShiftTypeDefinition> shiftTypeDefinitions = agentDailySetting.getShiftTypeDefinitions();
if (shiftTypeDefinitions.contains(shiftTypeDefinitionForShift)) {
employeesThatCanWorkThisShift.add(employee);
}
}
shift.setEmployeesThatCanWorkThisShift(employeesThatCanWorkThisShift);
}
}
Und die Regel, die ich benutze:
rule "maxDaysInPeriod"
when
$shiftAssignment : ShiftAssignment(employee != null)
then
int differentDaysInPeriod = MethodsUsedInScoreCalculation.employeeMaxDaysPerPeriod($shiftAssignment.getEmployee());
int maxDaysInPeriod = $shiftAssignment.getEmployee().getAgentPeriodSettings().getMaxDaysInPeriod();
if(differentDaysInPeriod > maxDaysInPeriod)
{
scoreHolder.addHardConstraintMatch(kcontext, differentDaysInPeriod - maxDaysInPeriod);
}
end
Wie ich diesen Fehler beheben kann?
Ist es nicht nur, weil die Mitarbeiter die 'getProblemFacts()' Methode Ihrer Lösung vermissen? Beachten Sie den Unterschied zwischen 'add()' und 'addAll()'. –
Nein, ich glaube das ist nicht der Fall. Ich habe 'facts.addAll (employeeList);' hinzugefügt in der NurseRoster-Klasse. –
Der gleiche Fehler, aber unter anderen Umständen tritt hier auf https://stackoverflow.com/questions/44193111/the-entity-was-never-added-to-this-scoredirector-exception-during-custom-cloning. –