Quarkus Timefold建模报错:如何实现作业的时间、员工与设备分配?
我首次使用Timefold/Optaplanner,可能存在理解偏差。我正基于食品包装示例开发Quarkus Timefold应用,目标是更新模型,实现:
- 基于前序作业的时间分配
- 匹配所需技能的员工分配
- 设备分配
当前模型包含示例中的Job和Line类,我新增了Employee类,在Job类中添加了规划变量:
@PlanningVariable(valueRangeProviderRefs = "employees") private Employee employee;
并在PackagingSchedule类中添加了值范围提供器:
@ProblemFactCollectionProperty @ValueRangeProvider(id = "employees") private List<Employee> employees;
Employee类代码如下:
package org.acme.foodpackaging.domain; import java.time.LocalDateTime; import java.util.*; public class Employee { private Long id; private String name; private String operator; private LocalDateTime startDateTime; Set<String> skills; // No-arg constructor required for OptaPlanner and Jackson public Employee() { } public Employee(Long id, String name, String operator, LocalDateTime startDateTime) { this.id = id; this.name = name; this.operator = operator; this.startDateTime = startDateTime; this.skills = null; } public Employee(Long id, String name, String operator, LocalDateTime startDateTime, Set<String> skills) { this.id = id; this.name = name; this.operator = operator; this.startDateTime = startDateTime; this.skills = skills; } @Override public String toString() { return name; } // ************************************************************************ // Getters and setters // ************************************************************************ public Long getId() { return id; } public String getName() { return name; } public String getOperator() { return operator; } public LocalDateTime getStartDateTime() { return startDateTime; } public Set<String> getSkills() { return skills; } }
运行时出现如下错误:
java.lang.IllegalArgumentException: The config
(QueuedValuePlacerConfig(ValueSelectorConfig(jobs),
ListChangeMoveSelectorConfig(ValueSelectorConfig(null), null))) has no
entityClass configured and because there are multiple in the
entityClassSet ([class org.acme.foodpackaging.domain.Line, class
org.acme.foodpackaging.domain.Job]), it cannot be deduced
automatically.
我认为该错误是因为原本无实际规划变量的Job类(PlanningEntity)现在新增了规划变量导致的,请问如何正确创建该模型?
这个错误的核心原因是项目中存在多个PlanningEntity类(Line和Job),Timefold的移动选择器配置无法自动推断要针对哪个实体类进行操作,需要明确指定实体类或拆分移动配置。
具体修复步骤
- 打开求解器配置文件(如
solverConfig.xml),找到移动选择器配置部分,为其添加entityClass属性指定对应实体:<moveSelector> <entityClass>org.acme.foodpackaging.domain.Job</entityClass> <!-- 对应Job的移动配置,比如针对employee变量的changeMove --> <changeMoveSelector> <variableName>employee</variableName> </changeMoveSelector> </moveSelector> - 如果需要同时针对
Line和Job两种实体优化,需用unionMoveSelector分别配置:<unionMoveSelector> <moveSelector> <entityClass>org.acme.foodpackaging.domain.Line</entityClass> <!-- Line对应的原有移动配置 --> </moveSelector> <moveSelector> <entityClass>org.acme.foodpackaging.domain.Job</entityClass> <changeMoveSelector> <variableName>employee</variableName> </changeMoveSelector> </moveSelector> </unionMoveSelector>
额外优化建议
- 为
Employee类的getId()方法添加@PlanningId注解,确保Timefold能正确识别员工实例的唯一性:@PlanningId public Long getId() { return id; } - 后续实现技能匹配约束时,可在约束类中编写规则,验证分配给Job的Employee具备该Job所需技能。
内容的提问来源于stack exchange,提问作者user23511321

