背景:这是我第一次使用 Timefold/Optaplanner,所以我可能对一切都有一些不正确的理解。
我正在使用/修改食品包装示例来开发 Quarkus Timefold 应用程序。目标是更新模型,以便能够根据之前的工作、具有所需技能的员工和所需的设备来分配时间。我的模型当前有示例中的 Job 和 Line,我正在尝试添加一个新的 Employee 类。但是,我收到此错误:
java.lang.IllegalArgumentException:配置 (QueuedValuePlacerConfig(ValueSelectorConfig(作业), ListChangeMoveSelectorConfig(ValueSelectorConfig(null), null))) 没有 配置了entityClass并且因为有多个 EntityClassSet([类org.acme.foodpackaging.domain.Line,类 org.acme.foodpackaging.domain.Job]),无法推断 自动。
在工作课程中,我添加了
@PlanningVariable(valueRangeProviderRefs = "employees")
private Employee employee;
在 PackagingSchedule 类中,我添加了
@ProblemFactCollectionProperty
@ValueRangeProvider(id = "employees")
private List<Employee> employees;
这是我的员工班级:
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; }
}
我相信这个错误是因为 Job 类原本是一个没有真正的计划变量的 PlanningEntity,现在包含一个真正的计划变量。如何正确创建这个模型?
该错误消息应该得到改进,但问题是目前
@PlanningListVariable
不能与另一个 @PlanningVariable
或 @PlanningListVariable
共存。 Line
定义的变量是@PlanningListVariable
,这意味着不能定义其他真正的变量(如文档中所述:https://timefold.ai/docs/timefold-solver/latest/using-timefold-求解器/建模规划问题#planningListVariable
计划列表变量尚不支持所有高级计划 与链式规划变量一起使用的功能。使用链式 计划变量而不是计划列表变量(如果需要的话) 以下规划技巧:
- 过度约束的规划,
- 策划实体难度对比或者策划价值实力对比,
- 详尽的搜索,
- 分区搜索,
- 与另一个列表或基本规划变量共存。
将模型转换为链式模型并不简单;本质上,
Line
成为充当锚点的问题事实,Job
成为指向Job
或Line
的规划实体。我建议您查看订购拣选快速入门 (https://github.com/TimefoldAI/timefold-quickstarts/tree/stable/use-cases/order-picking) 以获取创建链式模型的示例。