【问题标题】:Optaplanner score corruption and time based ruleOptaplanner 评分损坏和基于时间的规则
【发布时间】: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


【解决方案1】:

我面临同样的问题,在我的情况下,当我将分数计算逻辑从 Drools 文件移动到我的 java 代码时,它开始发生,类似于:

scoreHolder.addSoftConstraintMatch(kcontext,<complex expression>);

scoreHolder.addSoftConstraintMatch(kcontext,$myVariable.calculate());

根据this link我做不到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2011-01-01
    • 2014-02-17
    相关资源
    最近更新 更多