OptaPlanner构造启发式阶段配置selectionFilter报错求助
构造启发式(CH)阶段添加实体过滤器的正确配置方式
你遇到的问题核心是:构造启发式(CH)的实体放置逻辑和局部搜索完全不同,直接在<constructionHeuristic>下嵌套<changeMoveSelector>会打破CH默认的实体放置流程,必须在CH的实体 placer 中配置过滤器,而不是用局部搜索的moveSelector方式。
错误原因解析
错误提示里的<queuedEntityPlacer>是CH阶段用于控制实体放置顺序的核心组件,当你显式定义了entitySelector却没指定对应的placer时,求解器无法确定实体的放置逻辑,因此启动失败。而局部搜索阶段changeMoveSelector是用来生成移动操作的,和CH的实体初始化逻辑不兼容。
正确配置示例
针对你的FIRST_FIT构造启发式,需要显式配置queuedEntityPlacer,并在其内部的entitySelector中添加过滤器:
<constructionHeuristic> <!-- 显式指定CH类型 --> <constructionHeuristicType>FIRST_FIT</constructionHeuristicType> <!-- 配置实体 placer,这是CH阶段过滤实体的正确位置 --> <queuedEntityPlacer> <entitySelector> <!-- 在这里添加你的过滤器类 --> <filterClass>org.example.entity.ShiftFilter</filterClass> </entitySelector> </queuedEntityPlacer> </constructionHeuristic>
额外说明
- 如果需要更复杂的CH配置(比如结合不同的 placer 或排序逻辑),可以去掉
<constructionHeuristicType>,直接用<queuedEntityPlacer>和<valueSelector>自定义整个CH流程,但对于FIRST_FIT这种内置类型,上面的配置足够满足过滤需求。 - 确保你的
ShiftFilter类实现了EntitySelectorFilter接口,并且能正确处理CH阶段的未初始化实体(CH阶段实体是逐步被分配的,过滤逻辑要适配这个场景)。
内容的提问来源于stack exchange,提问作者sicario_23
相关产品推荐
相关产品推荐

