【发布时间】:2021-09-28 23:27:58
【问题描述】:
我正在为课程安排项目(教师、课程、时间)。我正在使用 optaplanner 作为 spring-boot 应用程序的一部分,测试代码正在编译并正确运行,但是结果包含空解决方案,在日志输出中我看到以下消息:
rted:花费时间 (11)、最佳分数 (0hard/0soft)、环境模式 (REPRODUCIBLE)、移动线程数 (NONE)、随机 (JDK 种子 0)。 2021-09-28 22:39:26.619 INFO 2579 --- [pool-1-thread-1] o.o.core.impl.solver.DefaultSolver:跳过所有阶段 (2):在 0 个计划实体中,没有一个是可移动的(非固定)。 2021-09-28 22:39:26.620 INFO 2579 --- [pool-1-thread-1] o.o.core.impl.solver.DefaultSolver :求解结束:花费时间 (16),最佳分数 (0hard/0soft),分数计算速度(62/秒),阶段总数(2),环境模式(REPRODUCIBLE),移动线程数(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 可能会跳过创建可能的解决方案?
【问题讨论】:
-
答案就在日志中:“跳过所有阶段 (2):在 0 个计划实体中,没有一个是可移动的(非固定)。”你似乎没有计划实体,因此没有什么要计划的。我将留给您检查您的计划解决方案是否已正确注释,并且它确实包含一些实体。如果是这样并且您仍然看到此问题,请分享有关您的问题的更多信息,包括。您的域。
-
@LukášPetrovický 你的理论看起来很合理,我当然有带有 3 个规划变量的 @ PlanningEntity 注释类,我通过删除 @ PlanningEntity 来测试你的想法,但项目拒绝构建这样说:“也许你的 @ PlanningEntity 注释的类不在子包中......”所以它确实看到了带有注释的类。但是,可能结构有问题,所以我会修改它,如果它没有帮助我会更新问题详细信息,谢谢
标签: java spring-boot maven optaplanner