如何修复 OptaPlanner 中的构造启发式?

Posted

技术标签:

【中文标题】如何修复 OptaPlanner 中的构造启发式?【英文标题】:How to fix Construction Heuristic in OptaPlanner? 【发布时间】:2019-09-19 22:21:05 【问题描述】:

求解器必须处理一个计划实体和两个计划变量。它将 TimeGrain 和 Room 分配给会议。由于构建启发式的搜索空间非常大,我不得不实现顺序移动选择。

<constructionHeuristic>
    <constructionHeuristicType>FIRST_FIT</constructionHeuristicType>
    <changeMoveSelector>
      <valueSelector variableName="startingTimeGrain"/>
    </changeMoveSelector>
    <changeMoveSelector>
      <valueSelector variableName="room"/>
    </changeMoveSelector>
</constructionHeuristic>

问题在于求解器有时会分配一个没有可用房间的 TimeGrain,因此当需要分配一个房间时,求解器找不到不违反硬约束的房间。

然后本地搜索阶段能够找到不破坏任何硬约束的解决方案,但我必须运行很长时间才能获得良好的解决方案质量。例如,即使我有一个旨在尽快返回分配的软限制,求解器也会返回远程会议分配。

如何修改或优化我的构造启发式,使其不会选择没有剩余可用房间的 TimeGrain?

【问题讨论】:

【参考方案1】:

通常约束如下所示:

when
    MyEntity(myFirstVar != null, mySecondVar != null, ...)
    ...
then ...

现在,当第一个 var 已按顺序分配但第二个未按顺序分配时,此规则将永远不会匹配实体。所以第一步是只做:

when
    MyEntity(myFirstVar != null, ...)
    ...
then ...

接下来,您可能可以添加一个约束来专门做这样的事情来影响 CH:

when
    accumulate(
         MyEntity(myFirstVar != null, mySecondVar == null, ...)
         sum(roomUsage) > capacity
then ...

【讨论】:

以上是关于如何修复 OptaPlanner 中的构造启发式?的主要内容,如果未能解决你的问题,请参考以下文章

Optaplanner中的免费期罚款

变异时如何修复“猫鼬模型的名称”不是graphql中的构造函数

如何使用 Mongoose Schema 修复 GraphQL Mutation 中的构造函数错误 [重复]

如何修复 GCC 编译中的 const char * 构造函数转换链错误

android:如何修复类 CardsActivity.CardPagerAdapter 中的错误构造函数 CardPagerAdapter 不能应用于给定类型

如何修复 Xcode 中的这 15 个错误? ...语义问题和初始化没有匹配的构造函数?