2

Я новичок в optaPlanner, и я стараюсь лучше научиться использовать его, изменив примерный пример, чтобы решить проблему другого типа. Я добавил новое правило оценки с именем sameSleepingPreference, которое использует новое имя, которое я создал, называемое sleepPreference, которое является собственностью гостя. Люди, которые имеют одинаковое предпочтение в плане сна, ставятся рядом друг с другом.Решение Optaplanner провалилось «незаконное государственное исключение»

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.dinne[email protected]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 людей просто невозможно решить, или есть другая проблема? Я попытался сделать правило предпочтения сна, добавляя точки и вычитая очки из оценки (я использую простой счет), но оба они приводят к сбою программы.

+0

NullPointerException как это, безусловно, ошибка в Drools, потому что даже если что-то не так в вашем DRL, оно должно сообщать об этом более изящно. Какая версия OptaPlanner и Drools находится в вашем пути к классам? –

+0

Пожалуйста, создайте проблему jira в проекте Drools (https://issues.jboss.org/browse/DROOLS), чтобы запросить улучшение сообщения об ошибке при возникновении такого NPE. –

+0

Я использую версию 6.2.0 от OptaPlanner и редактирую оригинальное правило для званых вечеринок drl, которое поставляется с примерами. –

ответ

0

Это рекомендуемый способ написать это правило, как «Eval» устарел и пускает слюни == «s превращаются в равные вызовы:

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

Хорошо, Джеффри, я изменил правило на то, что вы предложили, и теперь работает лист данных с 144 людьми. Однако теперь тот, у кого всего четыре человека, дает мне такую ​​же ошибку: «Исключение в потоке» AWT-EventQueue-0 »java.lang.IllegalStateException: Решение не выполнено.« ... в кучке мест, а затем «Вызвано: java.lang.NullPointerException \t на org.optaplanner.examples.dinnerparty.domain.Guest.toString (Guest.java:99) '... и на немного. –

+0

[Прочитайте это о NullPointerException] (http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it), особенно если оно находится в вашем код (код примера считается вашим, если вы меняете данные). –

+0

Я понял, что случилось, спасибо за вашу помощь Джеффри! –

Смежные вопросы