0

J'essaie de modifier l'exemple de l'infirmière d'OptaPlanner. Jusqu'à présent, je veux écrire une règle dans le fichier drl qui réagit lorsqu'un employé travaille plus de 13 heures par jour. J'ai développé la classe shiftType pour obtenir des heures par Shift. A première vue, la règle semble fonctionner mais quand il n'y a pas de solution réalisable après un certain temps, j'obtiens une exception NullPointerException.OptaPlanner Nurse Rostering accumuler la somme Null Pointer Exception

Voici une partie pertinente:

rule "dailyRestPeriod" 
when 


ShiftAssignment($employee : employee, $shiftType : shiftType, $shiftDate : shiftDate, $employee!=null) 
$dailyTotalHours : Number(intValue > 13) from accumulate(
       $assignmentEmployee: ShiftAssignment(employee == $employee, shiftDate == $shiftDate), 
      sum($assignmentEmployee.getShiftType().getShiftDurationHours()) 
     ) 
then 

System.out.println("Employee " +$employee +" dailyTotal " +$dailyTotalHours); 
scoreHolder.addHardConstraintMatch(kcontext, - 1); 
end 

Et une partie de l'exception

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Solving failed. 
    at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame$SolveWorker.done(SolverAndPersistenceFrame.java:319) 
    at javax.swing.SwingWorker$5.run(Unknown Source) 
    at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(Unknown Source) 
    at sun.swing.AccumulativeRunnable.run(Unknown Source) 
    at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(Unknown Source) 
    at javax.swing.Timer.fireActionPerformed(Unknown Source) 
    at javax.swing.Timer$DoPostEvent.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$500(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Caused by: java.lang.RuntimeException: java.lang.NullPointerException 
    at org.drools.core.rule.SingleAccumulate.reverse(SingleAccumulate.java:124) 
    at org.drools.core.phreak.PhreakAccumulateNode.removeMatch(PhreakAccumulateNode.java:806) 
    at org.drools.core.phreak.PhreakAccumulateNode.removePreviousMatchesForRightTuple(PhreakAccumulateNode.java:865) 
    at org.drools.core.phreak.PhreakAccumulateNode.doRightUpdates(PhreakAccumulateNode.java:444) 
    at org.drools.core.phreak.PhreakAccumulateNode.doNode(PhreakAccumulateNode.java:87) 
    at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:534) 
    at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:505) 
    at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:341) 
    at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:301) 
    at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:136) 
    at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:94) 
    at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:194) 
    at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:73) 
    at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:970) 
    at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:1312) 
    at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1251) 
+0

Quelle version de Drools et OptaPlanner est-ce? Le message d'erreur NPE devrait être plus explicite. –

+0

J'utilise OptaPlanner 6.5.0 @GeoffreyDeSmet –

+0

Cette stacktrace (NPE à l'envers) indique un problème dans Drools: soit il y a un bug direct dans les baves, soit lorsqu'un utilisateur fait quelque chose de mal, bave ne le signale pas correctement. De toute façon, il doit être réparé. Pouvez-vous [créer un jira] (https://issues.jboss.org/projects/DROOLS) et joindre un reproducteur? –

Répondre

0

Je ne comprends pas pourquoi, mais quand je change la règle un peu, il fonctionne très bien quand je me suis cassé bas de la règle. Peut-être que cela a quelque chose à voir avec les variables de planification et l'entité de planification, mais je ne suis pas sûr. Voici le code à quoi il ressemble maintenant:

rule "dailyRestPeriod" 
when 
$employee : Employee() 
$shift : Shift($shiftType : shiftType , $shiftDate :shiftDate) 
$dailyTotalHours : Number(intValue >= 13) from accumulate(
       $assignmentEmployee: ShiftAssignment(employee == $employee, shiftDate == $shiftDate), 
      sum($assignmentEmployee.getShiftType().getShiftDurationHours()) 
     ) 
then 
scoreHolder.addHardConstraintMatch(kcontext, - 1); 
end