OPTA计划者不正确的最佳分数



我正在尝试用于移动分配问题的optaplanner。这是许多与许多关系的关系,因为一个班次可以有很多员工。

在试运行中,我有两名员工和三班。轮班之一需要两名员工。

因此,我创建了一个新的ShiftAssignment类,以处理许多关系。Shift Assignment是计划实体,员工是计划变量。

我通过了两名员工和四个轮班任务班(因为一个轮班需要两个员工)到计划解决方案

我在得分计算器中只有一个硬规则,这基本上是员工应具有班次所需的必要技能

运行求解器时,我在下面的代码中打印分数(我没有任何软约束,所以我将其硬编码为零)

    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}).

这是一个很小的问题大小,我觉得我还没有对其进行正确的设置。请建议。

违反约束时必须降低硬分数。在上面的代码中,我增加了可能导致错误结果的硬分数。

一旦我修复了上述内容,它就会按预期工作。

最新更新