2

I am new to optaPlanner and am trying to better learn how to use it by changing around the dinner party example to solve a different type of problem. I added a new score rule called sameSleepingPreference, which uses a new enum I created called sleepingPreference that is a property of the guest. People who have the same sleeping preference are put next to each other.

rule "sameSleepingPreference"
    when
        $leftDesignation : SeatDesignation($leftGuest : guest)
        $rightDesignation : SeatDesignation(isRightOf($leftDesignation), $rightGuest : guest)

       eval($leftGuest.sleepingPreference.equals($rightGuest.sleepingPreference))
    then
        scoreHolder.addConstraintMatch(kcontext, +1);
end 

When I try to run optaPlanner using a data sheet of only four people, the example works fine. However, I made a longer list of 144 people by changing around one of the original data sheets from the dinner party example, and it gives me this error:

2015-07-23 10:41:59,414 [AWT-EventQueue-0] INFO Opened: data\dinnerparty\unsolved\hannahWeddingTest.xml 2015-07-23 10:42:01,012 [SwingWorker-pool-4-thread-1] INFO Solving started: time spent (97), best score (uninitialized/-14400), environment mode (REPRODUCIBLE), random (JDK with seed 0). Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Solving failed. at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame$SolveWorker.done(SolverAndPersistenceFrame.java:297) 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$300(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$1.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: org.optaplanner.examples.dinnerparty.solver.Rule_sameSleepingPreference1438171934Eval0Invoker@a59a25b3 : java.lang.NullPointerException at org.drools.core.rule.EvalCondition.isAllowed(EvalCondition.java:123) at org.drools.core.phreak.PhreakEvalNode.doLeftInserts(PhreakEvalNode.java:55) at org.drools.core.phreak.PhreakEvalNode.doNode(PhreakEvalNode.java:39) at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:342) at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161) at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116) at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:231) at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:106) at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1016) at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1302) at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1289) at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1262) at org.optaplanner.core.impl.score.director.drools.DroolsScoreDirector.calculateScore(DroolsScoreDirector.java:87) at org.optaplanner.examples.dinnerparty.solver.solution.initializer.DinnerPartySolutionInitializer.initializeSeatDesignationList(DinnerPartySolutionInitializer.java:69) at org.optaplanner.examples.dinnerparty.solver.solution.initializer.DinnerPartySolutionInitializer.changeWorkingSolution(DinnerPartySolutionInitializer.java:41) at org.optaplanner.core.impl.phase.custom.DefaultCustomPhase.doStep(DefaultCustomPhase.java:78) at org.optaplanner.core.impl.phase.custom.DefaultCustomPhase.solve(DefaultCustomPhase.java:60) at org.optaplanner.core.impl.solver.DefaultSolver.runPhases(DefaultSolver.java:213) at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:176) at org.optaplanner.examples.common.business.SolutionBusiness.solve(SolutionBusiness.java:302) at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame$SolveWorker.doInBackground(SolverAndPersistenceFrame.java:286) at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame$SolveWorker.doInBackground(SolverAndPersistenceFrame.java:1) at javax.swing.SwingWorker$1.call(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at javax.swing.SwingWorker.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at org.optaplanner.examples.dinnerparty.solver.Rule_sameSleepingPreference1438171934.eval0(Rule_sameSleepingPreference1438171934.java:8) at org.optaplanner.examples.dinnerparty.solver.Rule_sameSleepingPreference1438171934Eval0InvokerGenerated.evaluate(Unknown Source) at org.optaplanner.examples.dinnerparty.solver.Rule_sameSleepingPreference1438171934Eval0Invoker.evaluate(Unknown Source) at org.drools.core.rule.EvalCondition.isAllowed(EvalCondition.java:118) ... 27 more

Is my example of 144 people just impossible to solve, or is there a different problem? I have tried making the sleeping preference rule add points and subtract points from the score, (I am using simple score) but both cause the program to fail.

Hannah R
  • 23
  • 5
  • A NullPointerException like that is definitely a bug in Drools, because even if there is something wrong in your DRL, it should report it more gracefully. What version of OptaPlanner and Drools are in your classpath? – Geoffrey De Smet Jul 23 '15 at 15:40
  • Please [create a jira issue on the Drools project](https://issues.jboss.org/browse/DROOLS) to request improving the error message when such an NPE happens. – Geoffrey De Smet Jul 23 '15 at 15:46
  • I am using version 6.2.0 of OptaPlanner and am editing the original dinner party score rule drl that came with the examples. – Hannah R Jul 23 '15 at 17:40

1 Answers1

0

This is the recommended way to write that rule, as "eval" is deprecated and drools =='s turn into equal calls:

rule "sameSleepingPreference"
when
    $leftDesignation : SeatDesignation($leftGuest : guest)
    $rightDesignation : SeatDesignation(isRightOf($leftDesignation), $leftGuest.sleepingPreference == guest.sleepingPreference)
then
    scoreHolder.addConstraintMatch(kcontext, +1);
 end 
Geoffrey De Smet
  • 26,223
  • 11
  • 73
  • 120
  • Okay Geoffrey, I changed the rule to what you suggested and now the data sheet with 144 people works. However, now the one with only four people gives me a similar error: `Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Solving failed.` ...at a bunch of places and then `Caused by: java.lang.NullPointerException at org.optaplanner.examples.dinnerparty.domain.Guest.toString(Guest.java:99)` ...and on for a little. – Hannah R Aug 03 '15 at 14:43
  • [Read this about NullPointerException](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it), especially if it's in your code (the example code is considered yours if you change the data). – Geoffrey De Smet Aug 04 '15 at 08:01
  • I figured out what was wrong, thank you for your help Geoffrey! – Hannah R Aug 05 '15 at 14:46