Optaplanner,@ValueRangeProvider的使用

问题描述 投票:0回答:1

我需要一些关于在 @PlanningEntity 中使用 @ValueRangeProvider 的帮助

我使用了nursingShift示例原理,其中Plannningsolution通过休息服务调用进行实例化,然后通过Hibernate获取所有数据、事实等并创建解决方案。

SolverJob<MySolution, Long> res = solverManager.solveAndListen(MySolutionRepository.SINGLETON_SOLUTION_TABLE_ID,
                mySolutionRepository::findById,
                mySolutionRepository::save
                );

该解决方案然后获取所有事实、数据等并启动求解器。但是,一旦进入班级,我需要通过访问 PlanningSolution(其中包含员工列表并对其进行筛选)来限制可以分配到会议的可能员工。我正在尝试用 4.3.5.2.3 解决它。 @PlanningEntity 内的 @ValueRangeProvider 取决于员工的类型,但不确定如何获取引用,回到包含所有原始员工的原始列表?另外,计划实体和计划解决方案中都应该有@ValueRangeProvider,还是只有第一个。

        @PlanningSolution
        public class MySolution {
            ...
            @ValueRangeProvider
            @ProblemFactCollectionProperty
            private List<Employee> employeeList;
    
            @PlanningEntityCollectionProperty
            private List<Meeting> MeetingList;
        ...

}

    @PlanningEntity
    public class Meeting{
        ...
        @PlanningVariable (nullable = true)
        private Employee employee;
        ...
         @ValueRangeProvider
        public List<Employee> getFilteredEmployeeList() {
            
            "Get the original list from MySolution by some reference or build in auto-detection in optaplaner and filter it, based on the employees type"
            
            return employeeList;
        }
    }   
optaplanner
1个回答
0
投票

最佳解决方案将取决于您想要实施的限制类型:

  • 如果可以将任何员工分配到任何会议,只需将 valueRangeProvider 保留在 PlanningSolution 级别
  • 如果存在某些满足特定限制的情况,请首先将其作为约束实施
  • 仅当约束对您不起作用时,您才应该创建 PlanningEntity 级别的值提供者。最简单的方法是在问题生成时预先计算可能值的列表,并将其作为 valueRangeProvide 返回。在这种情况下,您不需要 PlanningSolution 级别的 ValueRangeProvider
© www.soinside.com 2019 - 2024. All rights reserved.