使用 OptaPlanner Spring 启动程序时设置 ListMoveChange 过滤器

Set a ListMoveChange filter when using OptaPlanner Spring Boot starter

我们正在使用 OptaPlanner Spring Boot starter 根据 OptaPlanner 快速入门中的示例创建车辆路径问题求解器:

https://github.com/kiegroup/optaplanner-quickstarts/tree/stable/use-cases/vehicle-routing

所以我们没有 solveConfig.xml 文件。我们想为 ListChangeMoves 定义一个过滤器,但不清楚我们如何在不使用 XML 文件的情况下注册它。我们尝试使用 solverConfig.xml 例如

<localSearch>
  <unionMoveSelector>
    <listChangeMoveSelector>
      <filterClass>my.filter.Class</filterClass>
    </listChangeMoveSelector>
  </unionMoveSelector>
</localSearch>

但这不起作用。是否有为列表移动设置过滤器的示例?

这是一个 XML 求解器配置,使用交换移动选择器和带有移动过滤的更改移动选择器:

  <constructionHeuristic/>
  <localSearch>
    <unionMoveSelector>
      <changeMoveSelector>
        <filterClass>org.acme.vehiclerouting.solver.ChangeMoveSelectorFilter</filterClass>
      </changeMoveSelector>
      <swapMoveSelector/>
    </unionMoveSelector>
  </localSearch>

如果你不想使用交换移动,那么你不需要联合移动选择器,配置可以简化为:

  <constructionHeuristic/>
  <localSearch>
    <changeMoveSelector>
      <filterClass>org.acme.vehiclerouting.solver.ChangeMoveSelectorFilter</filterClass>
    </changeMoveSelector>
  </localSearch>

几点评论:

  • 我将 CH 阶段包括在内,因为它在典型情况下是必需的。有关解释,请参阅
  • 如果计划实体有 @PlanningListVariableChangeMoveSelector 会自动配置为生成 ListChangeMoves。没有 <listChangeMoveSelector> 配置元素。
  • 更多信息,包括如何实现移动选择过滤器,请参见 documentation

更新:无XML配置

可以注入 SolverConfig、修改它然后使用它来创建其他对象,例如 SolverSolverManagerScoreManager.

代码看起来像这样:


@Component
class MyService {

    // Don't inject these.
    private final SolverManager<VrpSolution, Long> solverManager;
    private final ScoreManager<VrpSolution, HardSoftScore> scoreManager;

    // But inject the SolverConfig.
    public MyService(SolverConfig solverConfig) {
        // And instantiate SolverManager and ScoreManager manually.
        this.solverManager = SolverManager.<VrpSolution, Long>create(
            solverConfig.withPhaseList(Arrays.asList(
                new ConstructionHeuristicPhaseConfig(),
                new LocalSearchPhaseConfig().withMoveSelectorConfig(
                        new ChangeMoveSelectorConfig()
                                .withFilterClass(MyFilter.class)))));
        this.scoreManager = ScoreManager.create(SolverFactory.create(solverConfig));
    }
}

优点:

  • SolverConfig 将在被注入组件之前由 OptaPlannerAutoConfiguration(来自 optaplanner-spring-boot-starter)初始化。这意味着:
  • 解决方案和实体 类 将是 auto-discovered,您不必指定它们(您必须在 solverConfig.xml 中指定)。
  • 您可以使用 application.properties 进行较小的求解器配置调整,例如设置 time-spent 终止。

缺点:

  • 您必须手动创建 SolverSolverManagerScoreManager 实例。具体来说,您不能使用 @Bean 方法生成上述类型之一的实例,因为这会停用 OptaPlannerAutoConfiguration,从而创建 SolverConfig bean。