【发布时间】:2015-03-17 10:13:35
【问题描述】:
我的解决方案遇到了分数损坏问题。 当我在 FULL_ASSERT 模式下流口水计算我的实体的软分数时,就会发生这种情况。在 PRODUCTION 模式下,分数损坏不会发生。
我试图计算一个涉及当前日期的比率。基本上类似于(现在 - start_date_of_my_entity)* priority_of_my_entity。其结果就是实体的分数。
我尝试了一些方法来解决这个问题:在 drools 文件中,我有一个名为“now”的全局变量,它由名为“init”的规则初始化。该规则的显着性为 1000,以确保该规则是第一个执行的规则。 但这也不起作用。 当我运行我的解决方案时,一切正常,直到变量“现在”达到像 XX:YY:ZZ+1 这样的时间。此时出现分数损坏。
有堆栈跟踪:
10:19:00,007 INFO XXXXXXXXXXXXXXXXXX:153 - Score corruption: the workingScore (0hard/0medium/-188soft) is not the uncorruptedScore (0hard/0medium/-198soft) after completedAction (Entity(Customer1-19531312-50min)-Agent(19463312-TEST) => Agent(19463312-TEST)):
The corrupted scoreDirector has 3 ConstraintMatch(s) which are in excess (and should not be there):
com.package.solver/agentRatio/level2/[[Ljava.lang.Object;@105d99aa, Agent(19463312-TEST)]=-63
com.package.solver/decalageEtPriorite/level2/[Entity(Customer2-19531332-23min)-Agent(19463312-TEST)]=-50
com.package.solver/decalageEtPriorite/level2/[Entity(Customer1-19531312-50min)-Agent(19463312-TEST)]=-75
The corrupted scoreDirector has 3 ConstraintMatch(s) which are missing:
com.package.solver/agentRatio/level2/[[Ljava.lang.Object;@23739ca6, Agent(19463312-TEST)]=-63
com.package.solver/decalageEtPriorite/level2/[Entity(Customer2-19531332-23min)-Agent(19463312-TEST)]=-55
com.package.solver/decalageEtPriorite/level2/[Entity(Customer1-19531312-50min)-Agent(19463312-TEST)]=-80
Check your score constraints.
10:19:00,007 INFO BasicPlumbingTermination:59 - Terminating solver early.
java.lang.IllegalStateException: Score corruption: the workingScore (0hard/0medium/-188soft) is not the uncorruptedScore (0hard/0medium/-198soft) after completedAction (Entity(Customer1-19531312-50min)-Agent(19463312-TEST) => Agent(19463312-TEST)):
The corrupted scoreDirector has 3 ConstraintMatch(s) which are in excess (and should not be there):
com.package.solver/agentRatio/level2/[[Ljava.lang.Object;@105d99aa, Agent(19463312-TEST)]=-63
com.package.solver/decalageEtPriorite/level2/[Entity(Customer2-19531332-23min)-Agent(19463312-TEST)]=-50
com.package.solver/decalageEtPriorite/level2/[Entity(Customer1-19531312-50min)-Agent(19463312-TEST)]=-75
The corrupted scoreDirector has 3 ConstraintMatch(s) which are missing:
com.package.solver/agentRatio/level2/[[Ljava.lang.Object;@23739ca6, Agent(19463312-TEST)]=-63
com.package.solver/decalageEtPriorite/level2/[Entity(Customer2-19531332-23min)-Agent(19463312-TEST)]=-55
com.package.solver/decalageEtPriorite/level2/[Entity(Customer1-19531312-50min)-Agent(19463312-TEST)]=-80
Check your score constraints.
at org.optaplanner.core.impl.score.director.AbstractScoreDirector.assertWorkingScoreFromScratch(AbstractScoreDirector.java:308)
at org.optaplanner.core.impl.solver.scope.DefaultSolverScope.assertWorkingScoreFromScratch(DefaultSolverScope.java:118)
at org.optaplanner.core.impl.phase.scope.AbstractPhaseScope.assertWorkingScoreFromScratch(AbstractPhaseScope.java:131)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.processMove(LocalSearchDecider.java:164)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.doMove(LocalSearchDecider.java:149)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.decideNextStep(LocalSearchDecider.java:121)
at org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase.solve(DefaultLocalSearchPhase.java:66)
at org.optaplanner.core.impl.solver.DefaultSolver.runPhases(DefaultSolver.java:193)
at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:157)
我认为问题在于当我从一分钟跳到另一分钟时,得分不一样。 例如对于从 08:10:00 开始且优先级为 5 的实体:
- 08:00:59 得分为 10 * 5 => 50
- 08:01:00 得分为 9 * 5 => 45
似乎分数是在 08:00:59 计算的,并且在 08h01:00 完成了分数验证
此外,我看到移动是从当前代理到当前代理。这样可以吗?
此外,堆栈跟踪涉及另一个规则“agentRatio”。我想是因为这个规则是根据当前时间来计算分数的。这条规则也有同样的问题。
你能帮我解决这个问题吗?
编辑:在尝试了几个潜在的解决方案之后,我仍然被这个问题所困扰。 我可以尝试的一件事是添加一个代表时间的问题事实,并用它来进行基于时间的计算。但是这个解决方案并不让我满意。
【问题讨论】:
-
你找到解决这个分数损坏问题的方法了吗?
标签: optaplanner