因此,我正在创建一个应用程序,用于安排助理进行预设的每周服务。我正在使用 Optaplanner 9.44.0.Final 来执行此操作。目前,我遇到了一些问题,造成了我的限制之一,想知道是否有人知道解决办法。
我有一份愿意在服务期间志愿服务的助理名单。我还有一份需要安排助理的服务列表。助理通过 ServiceAssignment 分配给服务,该服务跟踪该特定任务的服务、助理和助理的位置。我有很多限制条件,可以帮助决定人们被分配什么职位、何时分配以及所有这些爵士乐。不幸的是,似乎正在发生的情况是,只要没有任何限制,助理就会被一遍又一遍地安排,而不会从名单中删除新的助理。相反,我想对日程安排之外的每个助理进行软惩罚,希望这会稍微改变任务(不幸的是,我不能只是说,不要安排任何人超过 x 次,因为有时我们没有足够的志愿者)。
到目前为止,这是我编写的模拟约束:
private Constraint utilizedAssistantsConstraint(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(Assistant.class)
.filter(assistant -> constraintFactory.forEach(ServiceAssignment.class).map(ServiceAssignment::getAssistant).collect(Collector.toList()).contains(assistant))
.penalize(HardMediumSoftScore.ONE_SOFT)
.asConstraint("Utilized All Assistants Constraint");
}
现在,这显然不起作用,因为 uni 约束流无法收集到这样的列表中,并且转换在约束提供程序中不起作用。基本上,我需要做的是这样的:
private Constraint utilizedAssistantsConstraint(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(Assistant.class)
.filter(assistant -> !isAssistantInServiceAssignments)
.penalize(HardMediumSoftScore.ONE_SOFT)
.asConstraint("Utilized All Assistants Constraint");
}
其中
isAssistantInServiceAssignments
是伪代码,用于检查助手是否出现在 ServiceAssignment 的某处。我正在努力想出一种方法来访问应用程序生成的 ServiceAssignment 对象,因为我还需要 Assistant 类。
我认为你正在寻找条件传播。
private Constraint utilizedAssistantsConstraint(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(Assistant.class)
.ifNotExists(ServiceAssignment.class,
Joiners.equal(Functions.identity(), ServiceAssignment::getAssistant))
.penalize(HardMediumSoftScore.ONE_SOFT)
.asConstraint("Unused assistant");
}