OptaPlanner: оценка коррупции при решении определенных наборов данных?
Когда я пытаюсь решить определенный набор данных, я получаю эту ошибку (с режимом среды, установленным в full_assert)
14:14:40.603 [main] INFO o.o.core.impl.solver.DefaultSolver - Solving started: time spent (39), best score (0hard/0medium/-18soft), environment mode (FULL_ASSERT), random (JDK with seed 0).
14:14:41.608 [main] DEBUG o.o.c.i.l.DefaultLocalSearchPhase - LS step (0), time spent (1045), score (0hard/0medium/-17soft), new best score (0hard/0medium/-17soft), accepted/selected move count (466/466), picked move (Assignment ID: 14 --- [Employee ID: N/A | Shift ID: 737] {null -> 4 Chef(admin) Bossen}).
14:14:41.667 [main] ERROR org.optaplanner - Caught exception!
java.lang.IllegalStateException: Score corruption: the workingScore (0hard/0medium/-16soft) is not the uncorruptedScore (0hard/-4medium/-16soft) after completedAction (Assignment ID: 17 --- [Employee ID: 4 | Shift ID: 746] {4 Chef(admin) Bossen -> 4 Chef(admin) Bossen}):
The corrupted scoreDirector has no ConstraintMatch(s) which are in excess.
The corrupted scoreDirector has 1 ConstraintMatch(s) which are missing:
org.avalin.optaplannerhellotest.solver/MaximumHoursPerWeekExceeded/[4 Chef(admin) Bossen, Week: 12, org.avalin.optaplanner.service.Service@726a17c4]=0hard/-4medium/0soft
Check your score constraints.
at org.optaplanner.core.impl.score.director.AbstractScoreDirector.assertWorkingScoreFromScratch(AbstractScoreDirector.java:496)
at org.optaplanner.core.impl.solver.scope.DefaultSolverScope.assertWorkingScoreFromScratch(DefaultSolverScope.java:132)
at org.optaplanner.core.impl.phase.scope.AbstractPhaseScope.assertWorkingScoreFromScratch(AbstractPhaseScope.java:167)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.processMove(LocalSearchDecider.java:163)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.doMove(LocalSearchDecider.java:148)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.decideNextStep(LocalSearchDecider.java:120)
at org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase.solve(DefaultLocalSearchPhase.java:70)
at org.optaplanner.core.impl.solver.AbstractSolver.runPhases(AbstractSolver.java:87)
at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:167)
at org.avalin.optaplanner.main.EmployeeRoster.main(EmployeeRoster.java:77)
Это мое ограничение:
rule "MaximumHoursPerWeekExceeded"
when
$employee : Employee()
$week : Week()
$service : Service
(
getWeeklyDurationForEmployee($employee, $week) > $employee.getDuration($employee.getMaxHoursPerWeek)
)
eval(isDroolActivated("MaximumHoursPerWeekExceeded", $service))
then
setDroolRating(scoreHolder, kcontext, $service.getDroolStrength(drools), $service.getDroolWeight(drools) + (int) ($service.getWeeklyDurationForEmployee($employee, $week)/3600 - $employee.getDuration($employee.getMaxHoursPerWeek())/3600)-1);
end
По какой-то причине этого не происходит в других наборах данных, которые я тестировал, у которых были другие ограничения и настройки ограничений (мягкие / средние / жесткие и разные веса), но, конечно, все еще сохранялось ограничение MaximumHoursPerWeek.
Я узнал, что если я заменю эту строку:
getWeeklyDurationForEmployee($employee, $week)
со случайным числом, он будет работать, не говоря уже о повреждении счета.
Этот метод выполняет циклическое выполнение заданий, которые в данный момент были переданы данному сотруднику. "Назначение" - это моя плановая организация. Может ли это быть проблемой? Это где теневые переменные удобны? Я пытался сделать мой список назначений " @InverseRelationShadowVariable(...)", но это ничего не изменило
1 ответ
Я подозреваю, что любой из этих методов, вызываемых в RHS, может полагаться на переменную планирования в объекте планирования, который является частью шаблона правила, поэтому слюни не пересматривают правило, когда получают событие, которое планирует этот объект планирования переменная изменена.