0

Ich versuche, die OptaPlanner Krankenschwester Roster Beispiel zu ändern. Bis jetzt möchte ich eine Regel in der Drl-Datei schreiben, die reagiert, wenn ein Mitarbeiter mehr als 13 Stunden pro Tag arbeitet. Ich erweiterte die Klasse shiftType, um Stunden pro Schicht zu erhalten.OptaPlanner Krankenschwester Rostering akkumulieren Summe Nullzeiger Ausnahme

Auf den ersten Blick scheint die Regel zu funktionieren, aber wenn es nach einer Weile keine machbare Lösung gibt, bekomme ich eine NullPointerException. Hier

ist einige relevante Code:

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 

und ein Teil der Ausnahme

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

Welche Version von Drools und OptaPlanner ist das? Die NPE-Fehlermeldung sollte selbsterklärender sein. –

+0

Ich benutze OptaPlanner 6.5.0 @GeoffreyDeSmet –

+0

Das Stacktrace (NPE auf der Rückseite) weist auf ein Problem in Drools: entweder gibt es einen direkten Fehler in Drools oder entweder, wenn ein Benutzer etwas falsch macht, Drools meldet es nicht korrekt. In jedem Fall muss es repariert werden. Können Sie [jira erstellen] (https://issues.jboss.org/projects/DROOLS) und einen Reproduzierer anhängen? –

Antwort

0

Ich verstehe nicht, warum, aber wenn ich die Regel ein wenig ändern, es funktioniert gut, wenn ich brach die Regel runter. Vielleicht hat es etwas mit der Planung von Variablen und Planung Entität zu tun, .. aber ich bin mir nicht sicher. Hier ist der Code, wie es jetzt aussieht:

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