如何修复 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 中的构造启发式?的主要内容,如果未能解决你的问题,请参考以下文章
变异时如何修复“猫鼬模型的名称”不是graphql中的构造函数
如何使用 Mongoose Schema 修复 GraphQL Mutation 中的构造函数错误 [重复]
如何修复 GCC 编译中的 const char * 构造函数转换链错误
android:如何修复类 CardsActivity.CardPagerAdapter 中的错误构造函数 CardPagerAdapter 不能应用于给定类型