在使用 springboot optaplanner-spring-boot-starter 时,我们如何使用多个 ConstraintProvider

How can we use multiple ConstraintProviders, when using the springboot optaplanner-spring-boot-starter

optaplanner-spring-boot-starter 自动发现 ContraintProvider,没有 solverConfig.xml,所以如果我们想针对不同的问题使用多个 constraintProvider,例如 问题 A,需要使用 problemAContraintProvider 和问题 B,需要使用 ProblemBContraintProvider,有没有我可以使用的任何限定符类型的注释,并告诉 solverManger 使用特定的 ConstraintProvider 实现

public class ProblemAConstraintProvider implements ConstraintProvider {

    @Override
    public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
        return new Constraint[] { 
                typeMatch(constraintFactory),
                timeSlotMatch(constraintFactory),
                };
    }
}

public class ProblemBConstraintProvider implements ConstraintProvider {

    @Override
    public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
        return new Constraint[] { 
                checkId(constraintFactory),
    
                };
    }
}

简短的回答是否定的;类似于 中的答案,每种类型的规划问题都需要一个新的求解器配置,它定义了 constraintProviderClass.

optaplanner-spring-boot-starter 仅支持单一求解器配置,因此仅支持单一类型的规划问题。

您需要添加一个 solverConfig.xml 来覆盖寻找 ConstraintProvider class 的默认行为(然后禁食失败,因为它找到了两个)。

添加 src/main/resources/solverConfig.xml(文件位置可以在 application.properties 中定制)并使其包含如下内容:

<solver>
  <scoreDirectoryFactory>
    <constraintProviderClass>...FirstConstraintProvider</>
  </scoreDirectoryFactory>
</solver>

但正如 Radovan 指出的那样:我们不支持在同一个 Spring 启动应用程序中进行多次 SolverManager/solverConfig 注入。那是一个 API 差距。