Opta planner错误的最佳得分

时间:2016-12-01 21:53:55

标签: optaplanner

我正在尝试使用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}).

这是一个小问题,我觉得我没有正确设置。请建议。

1 个答案:

答案 0 :(得分:0)

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

一旦我解决了上述问题,它就按预期工作了。