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

Optaplanner跳过阶段并返回空解决方案

师冥夜
2023-03-14

我正在为班级(老师,课程,时间)安排项目。我使用optaplanner作为spring-boot应用程序的一部分,测试代码正在正确编译和运行,但结果包含空解决方案,在日志输出中我看到以下消息:

RTED:花费的时间(11)、最佳得分(0hard/0soft)、环境模式(REPRODUCIBLE)、移动线程计数(NONE)、随机(带有种子0的JDK)。2021-09-28 22:39:26.619信息2579---[pool-1-thread-1]O.O.core.impl.solver.DefaultSolver:跳过所有阶段(2):在0个规划实体中,没有一个是可移动的(非固定的)。2021-09-28 22:39:26.620信息2579---[pool-1-thread-1]O.O.core.impl.Solver.DefaultSolver:解决结束:花费的时间(16)、最佳得分(0硬/0软)、得分计算速度(62/秒)、阶段总数(2)、环境模式(可复制)、移动线程数(NONE)。

问题出在我写的测试计算器上,我试图对可能的解决方案进行循环,有时实际上降低了一点成本,甚至增加了成本,但它没有生效,因为我循环并试图记录对象,但没有记录任何东西,这是计算器的代码:

public class ScheduleScoreCalculator implements EasyScoreCalculator<ScheduleTable, HardSoftScore>
{
@Override
public HardSoftScore calculateScore(ScheduleTable scheduleTable) {
    int hardScore = 0;
    int softScore = 0;

    List<ScheduledClass> scheduledClassList = scheduleTable.getScheduledClasses();
    System.out.println(scheduleTable);
    System.out.println("Hmmmmm ---"); // this is logged but the score is not changing
    for(ScheduledClass a: scheduledClassList) {
        for (ScheduledClass b : scheduledClassList) {
            if (a.getTeacher().getTeacherId() > 17000L) {
                hardScore+=18;
            }
            if (a.getTimeslot() != null && a.getTimeslot().equals(b.getTimeslot())
                    && a.getId() < b.getId()) {
                if (a.getTeacher() != null && a.getTeacher().equals(b.getTeacher())) {
                    hardScore--;
                }
                if (a.getTeacher().equals(b.getTeacher())) {
                    hardScore--;
                }
            } else {
                hardScore++;
                softScore+=2;
            }
        }
    }

    return HardSoftScore.of(hardScore, softScore);
}
}

那么,请你知道为什么optaplanner可能会跳过创建可能的解决方案吗?

共有1个答案

慎旭尧
2023-03-14

问题比我想象的要简单,用“PlanningSolution”注解的解决方案类有一个属性“ScheduledClasses”注解为“PlanningEntityCollectionProperty”我的错误是这个属性是用空列表(ArrayList)初始化的,解决方案是初始化一个解决方案类!回想起来,我认为文档应该对此负责,提供的示例没有提到我们需要这个,所以它不应该是null(否则将引发异常),也不应该是空列表。您需要用class初始化它,而不需要为动产设置任何值(用“planningvariable”注释)。感谢@LukášPetrovick,因为他的评论帮助我做了正确的调查!

 类似资料:
  • 强大的textHello Optaplanner专家, 爱丽丝

  • 我正在尝试解决类似于员工名册的问题。我面临的问题是,每次我运行求解器时,它都会生成不同的任务。这使得更难调试为什么选择特定案例而不是另一个案例。为什么会这样? 附注:我的任务有许多硬性限制,可能无法全部满足(大多数情况下,我仍然看到一些负面的硬性评分)。所以我的终止策略是基于< code > unimprovedSecondsSpentLimit 。会不会是这个原因?

  • 我有以下CVRPTW问题,我正在尝试使用OptaPlanner找到一个好的解决方案。时间为hh: mm: ss格式。 我的DRL文件是这样的。此外,我还定义了一个与准备时间之前到达相关的硬约束。我的解算器配置如下,但终止标记不同: 这是问题陈述: 我有2辆车,容量为10件物品和1个仓库。 这是解决方案(客户按车辆分组,按到达时间排序): (D=需求,Ar.T=到达时间,上一个D=与上一个位置的距离

  • 7.-在ArrivalTimeUpdatingVariableListener类中,我扩展了更新到达时间的方法,以考虑更新NextVehicle->ReadyTime,并由此更新属于下一次旅行的客户的到达时间(当有两次以上的旅行时,以此类推) 我确信这不是最优雅的解决方案,但我尝试了其他方法(例如在车辆上使用自定义阴影变量),但它不能使它工作。我现在面临的问题是,当ArrivalTimeUpdat

  • 我在过去的两个小时里一直在试图解决这个问题。试过很多东西。 该片段似乎正在向我的适配器传递空上下文。我尝试在onCreate和onCreateView和onActivityCreated中初始化上下文变量。同样的结果。