如何创建为作业分配时间、员工和设备的模型?

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

背景:这是我第一次使用 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,现在包含一个真正的计划变量。如何正确创建这个模型?

java quarkus optaplanner timefold
1个回答
0
投票

该错误消息应该得到改进,但问题是目前

@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) 以获取创建链式模型的示例。

© www.soinside.com 2019 - 2024. All rights reserved.