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, может полагаться на переменную планирования в объекте планирования, который является частью шаблона правила, поэтому слюни не пересматривают правило, когда получают событие, которое планирует этот объект планирования переменная изменена.

Другие вопросы по тегам