当前位置: 首页 > 知识库问答 >
问题:

自定义移入构造启发式

卫烨
2023-03-14

有没有一种方法可以将自定义移动放入构建启发式中?我正在从事一个项目,该项目接近optaplanner中的护士名册问题,但除了将员工分配到轮班任务之外,我还需要将员工分配到轮班中所需的小任务。所以当我将员工安排在轮班中时,我需要将员工安排在所有他可以完成的小任务中(有技能)。我不希望这是第二个计划实体,员工是计划变量,我只是希望当我将员工分配到一个班次时,循环处理该班次内的所有小任务(在班次的开始和结束时间之间),然后分配他或不分配他,所以如果他有技能,他必须被分配,否则就不分配。我很难将这个自定义移动放入构建启发式中。有办法吗?

编辑:在每个班次上贴一个“价格标签”好吗?我的意思是,在求解开始之前,运行optaplanner前的启发式算法,计算每个班次中小任务的出现次数。然后,稍后使用这些信息来决定员工是否适合该班次,比如说,如果他有能力完成至少70%的小任务,他可以被分配到给定的班次。例如,我们有在轮班时间内发生的下一个小任务(SA):SA1 4次,SA2 4次,SA3 2次,我们有一个拥有SA1和SA2技能的员工1和只有SA1技能的员工2,然后员工1可以被分配到轮班,因为他满足了70%以上的小任务,但员工2不能,因为他只满足了40%。然后,在员工“进入”轮班后,只需将他分配到他可以工作的所有任务中(如果他有小任务的技能,他将处理它,除了员工需要的技能外,小任务将没有任何限制)。不会决定让哪名员工承担一项小任务,如果他被分配到该轮班,并且拥有该技能,那么每个员工都是一样的。这是一个好主意吗?

此外,是否可以将多个计划值分配给计划实体的单个实例?在这种情况下,是否可以将多个员工分配给单个班次分配实例(我只是以它为例,我不打算这样做)?

共有1个答案

皇甫敏达
2023-03-14

在文档中查看构建启发式的高级配置。构建启发式仅适用于ChangeMobile及其组合(笛卡尔、联合、序列)。例如,如果您有2个实体A和B(每个实体有1个变量),有10个A实例和7 B实例,则可能:

  • 有2个CH:第一个CH分配所有A,然后第二个分配所有B。因此它按此顺序分配:A1、A2、A3、...、A10、B1、B2、...、B7(并尝试每个规划值)。
  • 有1个CH分配A和B的混合物。因此它以混合顺序分配(由实体分类器定义):A1、B1、B2、A2、B4、A3、...、B7、A10。
  • (如果只有1个实体类但有2个变量,则可以进行笛卡尔积或顺序分配。)

无论如何,如果这还不能解决问题,那么实现一个CustomPhaseCommand以获得完全的自由(请参阅具有初始化器类的文档和示例)。

除了让员工完成轮班任务外,我还需要让员工完成轮班所需的小任务

听起来你的模型可能效率低下。考虑只有1个规划变量的替代模型:

class Employee {}
class Shift {}
@PlanningEntity class SmallAssignment {
    Shift shift;
    @PlanningVariable Employee employee;
}

或者更好地定义什么是“转变”:如果两个人同时工作,他们是否使用相同的转变实例?由于您的业务复杂性可能需要此模型:

class Employee {}
class ShiftWithDateTime {}
@PlanningEntity lass ShiftWithDateTimeAndEmployee {
    ShiftWithDateTime shiftWithDateTime;
    @PlanningVariable Employee employee;
}
@PlanningEntity class SmallAssignment {
    ShiftWithDateTime shiftWithDateTime;
    @PlanningVariable Employee employee;
}

但在这种情况下,我可能会检查它是否像这样可重构(这仅在小分配可以完美地贪婪分配时才可能,因此它们的约束不是NP硬的):

class Employee {}
@PlanningEntity class ShiftWithDateTime { // shadow entity
    @InverseRelationShadow List<ShiftWithDateTimeAndEmployee> assignments;
    boolean hasEnoughEmployeesToFulfillAllSmallAssignments() { ... }
}
@PlanningEntity lass ShiftWithDateTimeAndEmployee {
    ShiftWithDateTime shiftWithDateTime;
    @PlanningVariable Employee employee;
}
 类似资料:
  • 本文向大家介绍Android自定义View构造函数详解,包括了Android自定义View构造函数详解的使用技巧和注意事项,需要的朋友参考一下 初始Custom View的构造函数 之前写过一篇实现圆形进度条的博客(自定义圆形进度条),通常我们在实现Custom View的时候,都会先继承View并实现View的三个构造函数,例如: 网上有很多关于三个构造函数使用时机的说法,但是说法正确的却没有几

  • 提供用于创建自定义子句和编译器的API。 简介 使用涉及创建一个或多个 ClauseElement 子类和定义其编译的一个或多个可调用文件: from sqlalchemy.ext.compiler import compiles from sqlalchemy.sql.expression import ColumnClause class MyColumn(ColumnClause):

  • 我正在开发一个Spring启动自定义启动器,其中pom包含一些依赖项(其他启动器、库),并且这个启动器执行一些关于jwt过滤的配置,以允许过滤器处于安全水位。问题是当我在另一个项目(starter-消费者)中添加我的自定义启动器作为pom依赖项时,它似乎检测到我要导入的类,但IntelliJ什么也没做。 也许我没有正确打包启动器,或者至少我在里面编码的类。启动器在pom中包含的其他依赖项被成功添加

  • 在.citydoor.imports.catalog.tools中打包;

  • 本文向大家介绍Android自定义View的三个构造函数,包括了Android自定义View的三个构造函数的使用技巧和注意事项,需要的朋友参考一下 自定义View有三个构造方法,它们的作用是不同的。 第一个是new 一个对象的时候调用。 第二个是在XML文件声明的时候调用。 系统默认只会调用前两个构造函数,至于第三个构造函数的调用,通常是我们自己在构造函数中主动调用的。 以上所述是小编给大家介绍的

  • 我可以请求一些帮助吗?我在做代码学院,我完全卡住了。我正在尽我最大的能力遵循指示,但如果有人能为我的问题提供帮助,我将不胜感激。 说明书注意到,如果没有构造函数,我们需要3行代码才能制作出《哈利·波特》,一个代表《哈利·波特第一册》的对象。 然后在第7行中,我们介绍了Book对象的构造函数,其中我们将页面和作者属性作为参数传入。 使用这个构造器制作《霍比特人》,一本由“J.R.R.托尔金”写的书,