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

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的移动选择器配置无法自动推断要针对哪个实体类进行操作,需要明确指定实体类或拆分移动配置。

具体修复步骤

  1. 打开求解器配置文件(如solverConfig.xml),找到移动选择器配置部分,为其添加entityClass属性指定对应实体:
    <moveSelector>
        <entityClass>org.acme.foodpackaging.domain.Job</entityClass>
        <!-- 对应Job的移动配置,比如针对employee变量的changeMove -->
        <changeMoveSelector>
            <variableName>employee</variableName>
        </changeMoveSelector>
    </moveSelector>
    
  2. 如果需要同时针对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 16:15:29