2012-04-30 33 views
0

我使用Drools的5.4.0.CR1,當我開始與Drools的最好成績是空

... 
XmlSolverFactory configurer = new XmlSolverFactory(); 
configurer.configure(SOLVER_CONFIG); 
Solver solver = configurer.buildSolver(); 
solver.setPlanningProblem(initialSolution); 
solver.solve(); 
.... 

我有這樣的輸出

[exec:exec] 
2012-04-30 11:10:46,296 [main] INFO Solving started: time spend (169), score (-13hard/0soft), new best score (-13hard/0soft), random seed (0). 
2012-04-30 11:10:46,338 [main] DEBUG  Step index (0), time spend (213), score (-12hard/0soft), new best score (null), accepted move size (10) for picked step (03-05-2012 P emp:EMPLOYEE1 => L). 
2012-04-30 11:10:46,356 [main] DEBUG  Step index (1), time spend (231), score (-12hard/0soft), new best score (null), accepted move size (10) for picked step (02-05-2012 P emp:EMPLOYEE2 => S). 
java.lang.NullPointerException 
    at org.drools.planner.core.score.buildin.hardandsoft.DefaultHardAndSoftScore.compareTo(DefaultHardAndSoftScore.java:125) 
    at org.drools.planner.core.score.buildin.hardandsoft.DefaultHardAndSoftScore.compareTo(DefaultHardAndSoftScore.java:27) 
    at org.drools.planner.core.localsearch.decider.acceptor.tabu.AbstractTabuAcceptor.isAccepted(AbstractTabuAcceptor.java:121) 
    at org.drools.planner.core.localsearch.decider.acceptor.CompositeAcceptor.isAccepted(CompositeAcceptor.java:58) 
    at org.drools.planner.core.localsearch.decider.DefaultDecider.processMove(DefaultDecider.java:159) 

這是跟蹤日誌:

2012-04-30 11:40:16,745 [main] INFO Solving started: time spend (110), score (-13hard/0soft), new best score (-13hard/0soft), random seed (0). 
    2012-04-30 11:40:16,781 [main] TRACE   Move score (-13hard/0soft), accepted (true) for move (01-05-2012 M emp:EMPLOYEE1 => P). 
    2012-04-30 11:40:16,794 [main] TRACE   Move score (-13hard/0soft), accepted (true) for move (04-05-2012 L emp:EMPLOYEE2 => G). 
    2012-04-30 11:40:16,794 [main] TRACE   Ignoring not doable move (01-05-2012 P emp:EMPLOYEE3 => P). 
    2012-04-30 11:40:16,807 [main] TRACE   Move score (-13hard/0soft), accepted (true) for move (01-05-2012 M emp:EMPLOYEE4 => S). 
    2012-04-30 11:40:16,819 [main] TRACE   Move score (-13hard/0soft), accepted (true) for move (03-05-2012 P emp:EMPLOYEE5 => A). 
    ... 
    2012-04-30 11:40:16,876 [main] TRACE   Move score (-12hard/0soft), accepted (true) for move (03-05-2012 P emp:EMPLOYEE21 => L). 
    2012-04-30 11:40:16,876 [main] TRACE   Ignoring not doable move (01-05-2012 L emp:EMPLOYEE22 => L). 
    2012-04-30 11:40:16,876 [main] TRACE   Ignoring not doable move (03-05-2012 N emp:EMPLOYEE23 => N). 
    2012-04-30 11:40:16,887 [main] TRACE   Move score (-13hard/0soft), accepted (true) for move (02-05-2012 N emp:EMPLOYEE14 => TS). 
    2012-04-30 11:40:16,898 [main] DEBUG  Step index (0), time spend (265), score (-12hard/0soft), new best score (null), accepted move size (10) for picked step (03-05-2012 P emp:EMPLOYEE21 => L). 

看來最好的解決辦法不會更新與分數值,但是我們定義的解決方案類作爲你的榜樣與getter和setter SCOR(例如皇后)即

任何人有關於「新的最佳分數」爲空的建議?

謝謝!

回答

0

這條線是(理論上)不可能:

2012-04-30 ...  Step index (0), ..., new best score (null), ... 

調試和弄清楚什麼是生產零得分。這絕對是一個錯誤(在規劃者或代碼中)。

我以前沒見過這個。您是否使用自定義分數定義?

+0

無我在對象解決方案private Har中使用dAndSoftScore分數;並且在xml文件配置中 HARD_AND_SOFT

+0

有關在方法compareTo(HardAndSoftScore other)中調試DefaultHardAndSoftScore的更多信息,請參閱「其他」 –

+0

當調用'BestSolutionRecaller#extractBestSolution'時調試'stepScope.getScore()= = null「,接下來,當它返回null時,在」ScoreDirector#calculateScore「上調試。 –

3

瘋狂的猜測,但你的解決方案的cloneSolution克隆得分和所有其他問題的事實強有力?

我在那裏經歷了一些沉默錯誤。

+2

謝謝你提到這一點。我剛剛開始使用Drools Planner,事實證明我克隆了我的解決方案中的所有內容,除了分數。 –

+0

遇到同樣的問題,呃? – aitchnyu

0

我得到了同樣的錯誤如上,我能夠在我的解決方案類的克隆來解決這個問題,通過簡單的設置得分就像----->

public EmployeeRoster cloneSolution() { 
    EmployeeRoster employeeRoster=new EmployeeRoster(); 
    employeeRoster.id=id; 
    employeeRoster.shiftList=shiftList; 
    employeeRoster.employeeList=employeeList; 
    employeeRoster.score=score; 
    return employeeRoster; 
} 

異常線程「main 「java.lang.NullPointerException at org.drools.planner.core.score.buildin.hardandsoft.DefaultHardAndSoftScore.compareTo(DefaultHardAndSoftScore.java:125) at org.drools.planner.core.score.buildin.hardandsoft.DefaultHardAndSoftScore。 compareTo(DefaultHardAndSoftScore.java:27) at org.drools.planner.core.localsearch.decider.acceptor.tabu.AbstractTabuAcceptor.isAccepted(Ab (DefaultDecider.java:121) at org.drools.planner.core.localsearch.decider.DefaultDecider.processMove(DefaultDecider.java:159) at org.drools.planner.core.localsearch.decider.DefaultDecider.doMove(DefaultDecider。的java:129) 在org.drools.planner.core.localsearch.decider.DefaultDecider.decideNextStep(DefaultDecider.java:103) 在org.drools.planner.core.localsearch.DefaultLocalSearchSolverPhase.solve(DefaultLocalSearchSolverPhase.java:57) 在org.drools.planner.core.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:183) 在org.drools.planner.core.solver.DefaultSolver.solve(DefaultSolver.java:151)

+1

計劃實體列表應該進行深度克隆:它們需要新的實例,因此它們可以獨立於原始實例進行更改。請參閱nurse rostering示例的cloneSolution()方法中的shiftAssignementList克隆。問題事實(id,employeeList)和分數字段可以/應該確實只是指向相同的實例(這是更高的內存/ CPU效率)。 –