Opta 规划器不正确的最佳分数
Opta planner incorrect best score
我正在试用 optaplanner 解决轮班分配问题。
这是一个多对多的关系,因为一个班次可以有很多员工。
试用中运行,我有两个员工,三班倒。
其中一个轮班需要两名员工。
所以我创建了一个新的 ShiftAssignment class 来处理多对多关系。 ShiftAssignment 是计划实体,employee 是计划变量。
我通过了两个员工和四个班次的分配class(因为一个班次需要两个员工)
到规划解决方案
我在分数计算器中只有一个硬性规定,基本上是员工应该
具备轮班所需的必要技能
当我 运行 求解器时,我在下面的代码中打印分数(我没有任何软约束,所以我将其硬编码为零)
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);
}
当我在分数计算器中打印解决方案 class 的值时,我可以看到几乎没有硬分数为零的解决方案。该解决方案满足规则并符合预期结果。但根据日志
,它不被接受
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}).
这是一个小问题,我觉得我没有设置正确。欢迎推荐。
当违反约束条件时,Hard Score 必须递减。在上面的代码中,我增加了可能导致错误结果的硬分数。
修复上述问题后,它按预期工作。
我正在试用 optaplanner 解决轮班分配问题。 这是一个多对多的关系,因为一个班次可以有很多员工。
试用中运行,我有两个员工,三班倒。 其中一个轮班需要两名员工。
所以我创建了一个新的 ShiftAssignment class 来处理多对多关系。 ShiftAssignment 是计划实体,employee 是计划变量。
我通过了两个员工和四个班次的分配class(因为一个班次需要两个员工) 到规划解决方案
我在分数计算器中只有一个硬性规定,基本上是员工应该 具备轮班所需的必要技能
当我 运行 求解器时,我在下面的代码中打印分数(我没有任何软约束,所以我将其硬编码为零)
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);
}
当我在分数计算器中打印解决方案 class 的值时,我可以看到几乎没有硬分数为零的解决方案。该解决方案满足规则并符合预期结果。但根据日志
,它不被接受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}).
这是一个小问题,我觉得我没有设置正确。欢迎推荐。
当违反约束条件时,Hard Score 必须递减。在上面的代码中,我增加了可能导致错误结果的硬分数。
修复上述问题后,它按预期工作。