【问题标题】:Is there a need for a configuration xml or drools drl file when using Optaplanner's SolverManager?使用 Optaplanner 的 SolverManager 时是否需要配置 xml 或 drools drl 文件?
【发布时间】:2020-04-21 19:06:02
【问题描述】:

我正在使用 optaplanner spring boot starter 来解决员工排班问题。我有 2 个班级,Employee 和一个计划实体 Shift。目前,我正在使用如下约束提供程序根据员工的技能水平为他们分配班次。

public class ConstraintProvider implements 

    org.optaplanner.core.api.score.stream.ConstraintProvider {
        @Override
        public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
            return new Constraint[]{
                    requiredSkillLevelOfEmployeesForShifts(constraintFactory)
            };
        }

        private Constraint requiredSkillLevelOfEmployeesForShifts(ConstraintFactory constraintFactory) {
            return constraintFactory.from(Shift.class)
                    .groupBy(Shift::getEmployee, sum(Shift::getRequiredSkillLevel))
                    .filter((employee, requiredSkillLevel) -> requiredSkillLevel > employee.getSkillLevel())
                    .penalize("requiredSkillLevelForShifts",
                    HardSoftScore.ONE_HARD,
                    (employee, requiredSkillLevel) -> requiredSkillLevel - employee.getSkillLevel());
        }


    }

我通过 JSON 将轮班和员工列表传递给控制器​​,然后控制器解决并返回最佳解决方案。


    @RestController
    @RequestMapping("/api")
    public class RostersController {

        @Autowired
        private SolverManager<Roster, UUID> solverManager;

        @PostMapping("/solve")
        public Roster solve(@RequestBody Roster problem) {
            UUID problemId = UUID.randomUUID();
            // Submit the problem to start solving
            SolverJob<Roster, UUID> solverJob = solverManager.solve(problemId, problem);
            Roster solution;
            try {
                // Wait until the solving ends
                solution = solverJob.getFinalBestSolution();
            } catch (InterruptedException | ExecutionException e) {
                throw new IllegalStateException("Solving failed.", e);
            }
            return solution;
        }

    }

我想添加另一个约束条件,我限制员工一周内可以轮班的数量,并且员工每天只能轮班。是否可以通过添加另一个约束来做到这一点,或者我是否需要某种 config .xml 文件以及 drools .drl 文件来添加更具体的约束?

【问题讨论】:

    标签: java spring-boot constraints solver optaplanner


    【解决方案1】:

    DRL (scoreRules.drl) 和 ConstraintProvider 是互斥的。您已经开始使用ConstraintProvider 实现您的约束,所以让我们坚持下去并在那里添加您可能需要的任何新约束。 ConstraintProvider 是新的 Constraint Streams API 的一部分,可让您在 Java 中定义约束,并且可以使用 ConstraintVerifier 轻松测试。

    当且仅当您不使用optaplanner-spring-boot-starterquarkus-optaplanner 时,您的示例中缺少一个部分,即告诉SolverManager 您的ConstraintProvider 实现的类名。您可以使用solverConfig.xml 做到这一点。使用optaplanner-spring-boot-starterquarkus-optaplanner 会自动推导出此文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <solver>
      <solutionClass>com.your.domain.Roster</solutionClass>
      <entityClass>com.your.domain.Shift</entityClass>
    
      <scoreDirectorFactory>
        <constraintProviderClass>com.your.domain.ConstraintProvider</constraintProviderClass>
      </scoreDirectorFactory>
    </solver>
    
    

    【讨论】:

    • solverConfig.xml 文件需要是 spring 特定的 xml 文件还是只是一个普通的 xml 文件? SolverManager 是否会在我添加它时自动获取此配置文件,并且它似乎没有更改已解决解决方案的输出?
    • optaplanner-spring-boot-starter 也会自动发现ContraintProvider,没有solverConfig.xml
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多