有没有办法在构造启发式中添加自定义移动? 我正在开展一个与optaplanner中的护士排班问题接近的项目,但除了让员工进行轮班任务外,我还需要将员工安排到轮班所需的小任务中。 因此,当我将员工置于班次之内时,我需要将员工放在他可以处理的所有小任务中(具备他们的技能)。我不希望那是第二个计划实体,而员工是计划变量,我只想在我将员工分配到班次时,然后循环通过该班次内的所有小任务(在开始之间)和轮班的结束时间)或者是否分配他,所以如果他有技能,他必须被分配,否则不。 我在构建启发式中将此自定义移动无法解决问题。有办法吗?
编辑: 放一个"价格标签"是不是很好在每个班次,我的意思是通过一个前optaplanner启发式(在解决开始之前),计算每个班次中小任务的出现次数。然后使用这些信息来决定一个员工是否有利于这种转变,如果他具备满足至少70%的小任务的技能,可以说他可以被分配到给定的班次。例如,我们有在班次时间内发生的下一个小任务(SA):SA1 4次出现,SA2发生4次,SA3发生2次,我们有具有SA1和SA2技能的employee1和仅具有SA1技能的employee2,那么employee1可以被分配到轮班,因为他满足超过70%的小任务,但是employee2不能因为他只满足40%。然后,员工获得""班次只是将他分配给他可以工作的所有作业(如果他具备他将要工作的小作业的技能,除了雇员之外的小作业没有限制要求具备技能)。如果他被分配到轮班并具备技能,那么决定哪个员工进行小型任务,每个员工都是一样的。 这是一个好主意吗?
也可以将多个计划值分配给计划实体的单个实例吗?在这种情况下,可以将多名员工分配到一个班次分配实例(我只是以此为例,我不打算这样做)?
答案 0 :(得分:1)
检查文档中的Construction Heuristics的高级配置。 构造启发式只适用于ChangeMove及其组合(笛卡儿,联合,序列)。例如,如果您有2个实体A和B(每个实体有1个变量),其中包含10个实例和7个B实例,这是可能的:
无论如何,如果没有削减它,实现CustomPhaseCommand以实现完全自由(请参阅具有...Initializer
类的文档和示例。)
除了让员工参加轮班任务外,我还需要 将员工分配到班次中所需的小任务
听起来你的模型可能效率低下。考虑替代模型只有1个计划变量:
class Employee {}
class Shift {}
@PlanningEntity class SmallAssignment {
Shift shift;
@PlanningVariable Employee employee;
}
或者更好地定义“转变”是什么:如果2个人同时工作,他们是否使用相同的转移实例?由于您的业务复杂性可能需要此模型:
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;
}