You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OptaPlanner使用SolverManager时如何在ConstraintProvider中获取ProblemId

Quarkus集成OptaPlanner获取ProblemId调整约束的实现方案

完全可以实现该需求,注意ConstraintProvider是OptaPlanner启动时初始化的全局单例,不能在类内部存储单个求解任务的相关变量,会引发多线程并发问题,所有单任务专属参数必须随规划问题实例传递,具体实现推荐采用以下方案:

方案1:参数内嵌到规划问题根对象(官方推荐)

  • 给标注了@PlanningSolution的规划问题根类新增两个字段:problemId、自定义调优参数对象
  • 调用SolverManager.solve()提交求解请求前,先根据入参的problemId从H2数据库查询对应的自定义参数,赋值到规划问题根对象中再提交
  • 约束规则中直接从规划问题根对象取参数做判断即可,参考代码示例:
public class CustomConstraintProvider implements ConstraintProvider {
    @Override
    public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
        return new Constraint[]{
            dynamicWeightConstraint(constraintFactory)
        };
    }

    private Constraint dynamicWeightConstraint(ConstraintFactory constraintFactory) {
        return constraintFactory.forEach(PlanningEntity.class)
                // 关联查询当前求解的规划问题根对象
                .join(PlanningSolution.class)
                .filter((entity, solution) -> {
                    // 可直接使用solution中存储的problemId或自定义参数做判断
                    Long problemId = solution.getProblemId();
                    CustomParam param = solution.getCustomParam();
                    // 自定义规则逻辑
                    return entity.getCost() > param.getMaxAllowedCost();
                })
                .penalize(HardSoftScore.ONE_SOFT, 
                    (entity, solution) -> solution.getCustomParam().getPenaltyWeight())
                .asConstraint("动态调优约束");
    }
}
  • 该方案无需额外修改OptaPlanner配置,无性能损耗,适配Quarkus的全异步求解场景。

方案2:自定义SolverJob传递上下文(仅特殊场景使用)

如果确实不能将参数放到规划问题根对象中,可以自定义SolverJob实现,在提交时传入problemId和Quarkus Bean上下文,求解前先查询参数再执行求解逻辑,该方案改动量较大,且需要额外处理异步线程的上下文传递问题,非必要不推荐使用。

同类实践说明

该类场景非常常见,比如多租户场景下不同租户的约束规则差异、不同项目的成本计算逻辑不同,业界通用做法都是将场景专属参数作为规划问题的一部分传入,在Quarkus+OptaPlanner的生产环境中已有大量落地案例,和H2/MySQL等数据库的参数查询逻辑可以放在上层业务代码中,提前完成参数赋值再提交求解即可。

内容的提问来源于stack exchange,提问作者Loïc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 00:09:04