【问题标题】:OptaPlanner return the best score but not its associated solutionOptaPlanner 返回最好的分数,但不返回相关的解决方案
【发布时间】:2020-03-27 12:42:01
【问题描述】:

我正在使用 OptaPlanner 7.33.0 解决 CloudBalancing 之类的问题。

返回的 PlanningSolution 对象包含计算得出的最佳分数,但解决方案不匹配。 我用非常小的数据集调试了所有解决方案,返回的解决方案似乎是最新的,它没有返回的分数。

例子:

  • 1:得分最高的方案得分为0hard/-1197medium/4soft
  • 2:返回的解决方案得分为0hard/-1198medium/2soft
  • 求解器返回一个 PlanningSolution 对象,其中包含解决方案 1 的分数,但包含解决方案 2 的内容

这是我的计划解决方案课程

@PlanningSolution
public class GroupSolution
{
    @PlanningEntityCollectionProperty
    private List<Request> request;

    @ValueRangeProvider(id = "groupRange")
    @ProblemFactCollectionProperty
    private List<Group> proposedGroups;

    @PlanningScore
    private HardMediumSoftScore score;

    // Others planning fact that I use in my EasyScoreCalculator
}

请求类

@PlanningEntity
public class Request
{
    @PlanningVariable(valueRangeProviderRefs = {
        "groupRange"
    }, nullable = false)
    private Group group;

    // Other properties
}

配置

<?xml version="1.0" encoding="UTF-8"?>
<solver>
  <scanAnnotatedClasses>
    <packageInclude>my.package.domain</packageInclude>
  </scanAnnotatedClasses>

  <!-- Score configuration -->
  <scoreDirectorFactory>
    <initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
    <easyScoreCalculatorClass>my.package.MyEasyScoreCalculator</easyScoreCalculatorClass>
  </scoreDirectorFactory>

  <constructionHeuristic />

  <termination>
    <minutesSpentLimit>5</minutesSpentLimit>
  </termination>
</solver>

我正在使用具有 3 个评分级别的 EasyScoreCalculator,我像这样使用它们:

  • hard : 我只设置为 0 或 -1。如果 -1 我不计算其他分数,因为 -1 表示该解决方案不适用
  • medium : 价格,例如如果解决方案成本为 100 欧元,我的中等分数将为 -100
  • soft :如果 2 个价格相同,我会使用此分数来选择具有更多空组的解决方案(每个组的请求数最多)。这个分数永远不会是负数

我将继续对此进行调查,但如果您有任何建议以获得正确的结果,您可以告诉我。

但主要问题是,您知道这是否是正常的 OptaPlanner 行为吗? 如果正常的话他会返回一个不匹配的分数和解决方案?

【问题讨论】:

  • 通过在我的求解器配置中添加&lt;environmentMode&gt;FAST_ASSERT&lt;/environmentMode&gt; 进行修复,但我认为这不是最佳方式。我将在我的项目中使用它,等待任何建议或解释

标签: optaplanner


【解决方案1】:

1) 听起来像是分数损坏。鉴于 FAST_ASSERT “修复它”(它没有),使用 &lt;environmentMode&gt;NON_INTRUSIVE_FULL_ASSERT&lt;/environmentMode&gt; 运行它,如果它抛出异常,它可能会指出真正的问题,因为它更早地检测到问题。

2) 也可能是由于计划实体克隆损坏。这更难被发现。您是否使用自定义解决方案克隆器?是否有任何域类引用了规划实体类或规划解决方案(所以引用 RequestGroupSolution)?任何具有带有 RequestGroupSolution 实例的 Collection 或 Map 的类?

【讨论】:

  • 非常感谢!!是的,我在 GroupSolution 中有一个 Map>,这个地图填入了每个解决方案。我重构了我的代码以删除此地图,现在它可以工作了
  • 对于其他无法删除该地图的阅读者:将@DeepPlanningClone 放在该地图字段上也可能会修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2017-02-17
  • 1970-01-01
  • 2018-08-30
  • 2018-10-06
  • 1970-01-01
相关资源
最近更新 更多