当前位置: 首页 > 知识库问答 >
问题:

Opta规划器最佳分数不正确

司寇正志
2023-03-14

我正在试用optaplanner解决一个轮班分配问题。这是一种多对多关系,因为一个班次可以有许多员工。

在试运行中,我有两名员工和三个班次。其中一班需要两名员工。

所以我创建了一个新的ShiftAssignment类来处理多对多关系。ShiftAssignment是计划实体,员工是计划变量。

我将两个员工和四个班次的任务分配类(因为一个班次需要两个员工)传递给规划解决方案

在分数计算器中,我只有一条硬性规定,那就是员工基本上应该具备轮班所需的必要技能

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

    public HardSoftScore calculateScore(AuditAllocationSoluthtml" target="_blank">ion 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个答案

孟智志
2023-03-14

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

一旦我修复了上面的问题,它就如预期的那样工作了。

 类似资料:
  • 最佳路径,是求解网络中两点之间阻抗最小的路经,必须按照结点的选择顺序访问网络中的结点。“阻抗最小”有多种理解,如基于单因素考虑的时间最短、费用最低、风景最好、路况最佳、过桥最少、收费站最少、经过乡村最多等。 下面以长春数据为例,计算地图中将要行走的地点间的最佳路径。其接口使用方法如下: 设置最佳路径分析参数 findPathParameter,包括交通网络分析通用参数、途径站点等; //设置网络分

  • 尝试解决这个问题:假设您有一个数组,其中第i个元素是给定股票在第i天的价格。 设计一个算法来寻找最大利润。您最多可以完成两笔交易。 解决方案:我正在做的是分而治之的方法。 dp[i][j]是ith和jth day之间的最大利润。计算如下: dp[i][j]=max(dp[i][j],max(prices[i]-prices[j],dp[k][j],dp[i][k1]),其中k小于i且大于j。 现在

  • Supercharge DevOps on any cloud Documentation | Slack Community | Website | Email: info@runx.dev What is Opta? Opta is a new kind of Infrastructure-As-Code framework where you work with high-level con

  • 我应该对两个分区问题的动态规划实现应用什么修改来解决以下任务: 给你一个正整数数组作为输入,表示为C。程序应该决定是否可以将数组划分为两个相等的子序列。您可以从数组中删除一些元素,但不是全部,以使此类分区可行。 例: 假设输入是4 5 11 17 9。如果我们去掉11和17,两个分区是可能的。我问题是,我应该对我的两个分区实现进行什么调整,以确定两个分区是否可能(可能需要或可能不需要删除某些元素)

  • 我想为VRP创建一个过度约束规划的增量分数。我创建了一个传统的虚拟车辆,其中包括所有计划外的客户。 示例: Optaplanner将Customer1从Vehicle1移动到Vehicle2: 当我得到AfterVariableChanged:previousStandstill(Customer1)时,在Customer.getVehicle()中,我有旧车辆的价值,我不知道是否需要添加软成本(

  • 我有两对结构为rdd[String,Int]的RDD,称为rdd1和rdd2。 如果我加入前面的RDD,并在结果RDD(mapValues)的值上执行一个函数,那么所有的工作都将在一个worker中完成,而不是在集群的不同worker节点上分配不同的任务。我的意思是,期望的行为应该是在集群允许的这么多节点中并行执行作为参数传递给mapValues方法的函数。