我正在尝试使用optaplanner进行换档分配问题。 这是一个多对多的关系,因为一个班次可以有很多员工。
在试运行中,我有两名员工和三班。 其中一个转变需要两名员工。
所以我创建了一个新的ShiftAssignment类来处理多对多的关系。 ShiftAssignment是计划实体,员工是计划变量。
我通过两名员工和四班轮班(因为一班需要两名员工) 到规划解决方案
我在得分计算器中只有一条硬规则,基本上是员工应该做的 拥有转变所需的必要技能
当我运行求解器时,我在下面的代码中打印得分(我没有任何软约束,因此我将其硬编码为零)
public HardSoftScore calculateScore(AuditAllocationSolution auditAllocationSolution) {
int hardScore = 0;
for (Auditor auditor : auditAllocationSolution.getAuditors()) {
for (AuditAssignment auditAssignment : auditAllocationSolution.getAuditAssignments()) {
if (auditor.equals(auditAssignment.getAuditor())) {
List<String> auditorSkils = auditor.getQualifications().stream().map(skill -> skill.getSkillName())
.collect(Collectors.toList());
String requiredSkillForThisAuditInstance = auditAssignment.getRequiredSkill().getSkillName();
if ( !auditorSkils.contains(requiredSkillForThisAuditInstance))
{
// increement hard score since skill match contraint is violated
hardScore = hardScore + 1;
}
}
}
}
System.out.println(" hardScore " + hardScore);
return HardSoftScore.valueOf(hardScore, 0);
}
当我在分数计算器中打印解决方案类的值时,我可以看到硬分数为零的解决方案很少。该解决方案满足规则并与预期结果相匹配。但是根据日志不接受它
08:16:35.549 [main] TRACE o.o.c.i.l.decider.LocalSearchDecider - Move index (0), score (0hard/0soft), accepted (false), move (AuditAssignment-2 {Auditor-1} <-> AuditAssignment-3 {Auditor-0}).
08:16:35.549 [main] TRACE o.o.c.i.l.decider.LocalSearchDecider - Move index (0), score (0hard/0soft), accepted (false), move (AuditAssignment-2 {Auditor-1} <-> AuditAssignment-3 {Auditor-0}).
我希望在日志中澄清另一个观察结果。 据我所知,每个新步骤的结果都会传递给计分器。但有时候我发现,只需一步,分数计算器就可以使用不同的解决方案多次调用。这是我从日志中观察到的。假设这是单线程并且日志排序正确,为什么会发生这种情况?
最终输出不正确。选择的最佳分数是具有高分数的东西。并且不接受分数最高的解决方案
我也看到日志中的以下行,我无法理解。我的配置有什么问题吗?
23:53:01.242 [main] DEBUG o.o.c.i.l.DefaultLocalSearchPhase - LS step (26), time spent (121), score (2hard/0soft), best score (4hard/0soft), accepted/selected move count (1/1), picked move (AuditAssignment-2 {Auditor-1} <-> AuditAssignment-0 {Auditor-0}).
23:53:01.242 [main] DEBUG o.o.c.i.l.DefaultLocalSearchPhase - LS step (26), time spent (121), score (2hard/0soft), best score (4hard/0soft), accepted/selected move count (1/1), picked move (AuditAssignment-2 {Auditor-1} <-> AuditAssignment-0 {Auditor-0}).
这是一个小问题,我觉得我没有正确设置。请建议。
答案 0 :(得分:0)
违反约束时,必须减少硬分数。在上面的代码中,我增加了可能导致错误结果的硬分数。
一旦我解决了上述问题,它就按预期工作了。