【问题标题】:How can i get OptaPlanner Construction Heuristics to use different values?如何让 OptaPlanner 构建启发式使用不同的值?
【发布时间】:2015-07-23 09:34:32
【问题描述】:

当我使用构建启发式时,我总是得到分配给我的 PlanningVariables 的相同值,这导致初始解决方案不好。

我很确定我在这里犯了一个错误,但看不到我失败的地方。

我的问题描述:

我尝试将资源分配给 WorkOrder。一个 WorkOrder 可以有多个 ResourceAssignments。这个 ResourceAssignment 是我的主要 PlanningEntity。 资源是 PlanningVariable。 WorkOrders 也是 PlanningEntities,但该信息仅用于显示我有多个 PlanningEntity,因此不能使用更简单的 ConstructionHeuristic 配置。

我使用来自实体的值范围提供程序,因此我可以为不同类型的 ResourceAssignments 返回不同的资源集。 (例如人类、叉车、手持扫描仪……)

我的问题是构造启发式似乎总是为所有 ResourceAssignment 分配相同的资源。

这是来自 CH 的输出 - 您可以看到相同的 Human Resource (id 100) 分配给了两个 ResourceAssignments。这对于所有以下 PlanningEntities 都是相同的。

2015-07-23 10:57:12,291 [main] INFO  Solving started: time spent (185), best score (uninitialized/-9900hard/0soft), environment mode (FAST_ASSERT), random (JDK with seed 0).
2015-07-23 10:57:12,429 [main] DEBUG     CH step (0), time spent (325), score (-9900hard/0soft), selected move count (200), picked move (ResourceAssignment{id=0, workorder=WorkOrder{id=0, name=WO0, start=Thu Jul 23 12:57:11 CEST 2015, stop=Thu Jul 23 14:57:11 CEST 2015, offset=0}, resource=null, type=human} => Resource{type=human, id=100}).
2015-07-23 10:57:12,523 [main] DEBUG     CH step (1), time spent (419), score (-9900hard/0soft), selected move count (200), picked move (ResourceAssignment{id=1, workorder=WorkOrder{id=0, name=WO0, start=Thu Jul 23 12:57:11 CEST 2015, stop=Thu Jul 23 14:57:11 CEST 2015, offset=0}, resource=null, type=human} => Resource{type=human, id=100}).
2015-07-23 10:57:12,576 [main] DEBUG     CH step (2), time spent (472), score (-9900hard/0soft), selected move count (99), picked move (ResourceAssignment{id=2, workorder=WorkOrder{id=0, name=WO0, start=Thu Jul 23 12:57:11 CEST 2015, stop=Thu Jul 23 14:57:11 CEST 2015, offset=0}, resource=null, type=forklift} => Resource{type=forklift, id=0}).
2015-07-23 10:57:12,667 [main] DEBUG     CH step (3), time spent (563), score (-9900hard/0soft), selected move count (200), picked move (ResourceAssignment{id=3, workorder=WorkOrder{id=1, name=WO1, start=Thu Jul 23 12:57:11 CEST 2015, stop=Thu Jul 23 14:57:11 CEST 2015, offset=0}, resource=null, type=human} => Resource{type=human, id=100}).
2015-07-23 10:57:12,757 [main] DEBUG     CH step (4), time spent (653), score (-9900hard/0soft), selected move count (200), picked move (ResourceAssignment{id=4, workorder=WorkOrder{id=1, name=WO1, start=Thu Jul 23 12:57:11 CEST 2015, stop=Thu Jul 23 14:57:11 CEST 2015, offset=0}, resource=null, type=human} => Resource{type=human, id=100}).
2015-07-23 10:57:12,795 [main] DEBUG     CH step (5), time spent (691), score (-9900hard/0soft), selected move count (99), picked move (ResourceAssignment{id=5, workorder=WorkOrder{id=1, name=WO1, start=Thu Jul 23 12:57:11 CEST 2015, stop=Thu Jul 23 14:57:11 CEST 2015, offset=0}, resource=null, type=forklift} => Resource{type=forklift, id=0}).
2015-07-23 10:57:12,867 [main] DEBUG     CH step (6), time spent (763), score (-9900hard/0soft), selected move count (200), picked move (ResourceAssignment{id=6, workorder=WorkOrder{id=2, name=WO2, start=Thu Jul 23 12:57:11 CEST 2015, stop=Thu Jul 23 14:57:11 CEST 2015, offset=0}, resource=null, type=human} => Resource{type=human, id=100}).
2015-07-23 10:57:12,917 [main] DEBUG     CH step (7), time spent (813), score (-9900hard/0soft), selected move count (200), picked move (ResourceAssignment{id=7, workorder=WorkOrder{id=2, name=WO2, start=Thu Jul 23 12:57:11 CEST 2015, stop=Thu Jul 23 14:57:11 CEST 2015, offset=0}, resource=null, type=human} => Resource{type=human, id=100}).

似乎它忽略了所有其他动作 - 当然,我有一条规则可以惩罚同时使用相同资源的硬分数。

这是我的解决方案配置。

<?xml version="1.0" encoding="UTF-8"?>
<solver>
  <environmentMode>FAST_ASSERT</environmentMode>
  <termination>
    <unimprovedSecondsSpentLimit>10000</unimprovedSecondsSpentLimit>
    <secondsSpentLimit>220000</secondsSpentLimit>
  </termination>

  <!-- Domain model configuration -->
  <solutionClass>com.opal.solver.resource.ResourceAssignmentSolution</solutionClass>
  <entityClass>com.opal.solver.resources.entity.ResourceAssignment</entityClass>
  <entityClass>com.opal.solver.resources.entity.WorkOrder</entityClass>
  <!-- Score configuration -->
  <scoreDirectorFactory>
    <scoreDefinitionType>HARD_SOFT</scoreDefinitionType>
    <scoreDrl>resourceAsssignmentRules.drl</scoreDrl>
  </scoreDirectorFactory>    
  <constructionHeuristic>
    <queuedEntityPlacer>
      <entitySelector id="placerEntitySelector">
        <cacheType>PHASE</cacheType>
        <entityClass>com.opal.solver.resources.entity.ResourceAssignment</entityClass>
      </entitySelector>
      <changeMoveSelector>
        <entitySelector mimicSelectorRef="placerEntitySelector"/>
        <valueSelector>
           <selectionOrder>ORIGINAL</selectionOrder>
          <variableName>resource</variableName>
        </valueSelector>
      </changeMoveSelector>
    </queuedEntityPlacer>
  </constructionHeuristic>
</solver>

我确定我只是在这里错过了 optaplanner 的一些核心概念。我将不胜感激任何指向正确方向的提示。

【问题讨论】:

  • 提示:environment mode (FAST_ASSERT), random (JDK with seed 0) 请参阅文档中的:Planner Configuration。这就是为什么它总是选择相同的动作。
  • 好点 - 但生产模式没有变化。

标签: optaplanner


【解决方案1】:

看起来您现在有一个详细的 FIRST_FIT 配置。改为使用 FIRST_FIT_DECREASING,通过声明难度比较并使用构造启发式类型。

<constructionHeuristic>
  <constructionHeuristicType>FIRST_FIT_DECREASING</>
</>

请参阅有关首次拟合递减的文档章节。通常,FFD 明显优于 FF(例如在 CloudBalancing 上平均为 4%),但使用本地搜索来改进该解决方案。

如果您真的要寻找随机的不同 CH 结果(例如遗传算法群体),请使用 selectionOrder RANDOM 而不是 ORGINAL。

【讨论】:

  • 啊 - 是的 FIRST_FIT_DECREASING 听起来更好。不幸的是,我使用实体的值范围提供程序来分配我必须分配的不同资源类型。当我尝试将 selectionOrder 设置为 SORTED 我得到resolvedSelectionOrder (SORTED) needs to be based on a EntityIndependentValueSelector
  • 更改了我的设置,因此范围来自解决方案 - 现在您的建议有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多