【问题标题】:Optaplanner solving failed "illegal state exception"Optaplanner 解决失败的“非法状态异常”
【发布时间】:2015-07-23 14:46:50
【问题描述】:

我是 optaPlanner 的新手,我正在尝试通过更改晚宴示例来更好地学习如何使用它来解决不同类型的问题。我添加了一个名为sameSleepingPreference 的新评分规则,它使用我创建的一个名为sleepingPreference 的新枚举,它是客人的一个属性。具有相同睡眠偏好的人被放在一起。

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 

当我尝试使用只有四个人的数据表运行 optaPlanner 时,该示例运行良好。但是,通过更改晚宴示例中的一张原始数据表,我列出了更长的 144 人列表,它给了我这个错误:

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

我的 144 人示例是无法解决,还是有其他问题?我试过让睡眠偏好规则从分数中加分和减分,(我使用的是简单分数)但两者都会导致程序失败。

【问题讨论】:

  • 这样的 NullPointerException 绝对是 Drools 中的一个错误,因为即使您的 DRL 中有问题,它也应该更优雅地报告它。您的类路径中有什么版本的 OptaPlanner 和 Drools?
  • create a jira issue on the Drools project 请求改进此类 NPE 发生时的错误消息。
  • 我正在使用 6.2.0 版的 OptaPlanner,并且正在编辑示例随附的原始晚宴评分规则 drl。

标签: java nullpointerexception drools illegalstateexception optaplanner


【解决方案1】:

这是编写该规则的推荐方式,因为“eval”已被弃用,并且流口水 == 变成了相等的调用:

rule "sameSleepingPreference"
when
    $leftDesignation : SeatDesignation($leftGuest : guest)
    $rightDesignation : SeatDesignation(isRightOf($leftDesignation), $leftGuest.sleepingPreference == guest.sleepingPreference)
then
    scoreHolder.addConstraintMatch(kcontext, +1);
 end 

【讨论】:

  • 好的,Geoffrey,我将规则更改为您建议的内容,现在包含 144 人的数据表有效。然而,现在只有四个人的那个给了我一个类似的错误:Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Solving failed. ...在一堆地方,然后Caused by: java.lang.NullPointerException at org.optaplanner.examples.dinnerparty.domain.Guest.toString(Guest.java:99) ...等等。
  • Read this about NullPointerException,尤其是在您的代码中(如果您更改数据,示例代码将被视为您的代码)。
  • 我知道出了什么问题,感谢 Geoffrey 的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多