Spring Boot集成OptaPlanner排课时跳过求解阶段返回空解怎么办
日志输出的已跳过全部2个阶段:共0个规划实体,无可移动(未固定)的实体是触发跳过求解的直接信号,具体可从以下维度排查问题:
规划实体注解缺失
确认ScheduledClass类是否添加了@PlanningEntity注解,类中需要动态调度的字段(如timeslot、teacher等规划变量)是否添加了@PlanningVariable注解,注解缺失会导致OptaPlanner无法识别需要调度的实体。规划实体集合注解缺失
确认解决方案类ScheduleTable中存储ScheduledClass的集合字段(即scheduledClasses)是否添加了@PlanningEntityCollectionProperty注解,没有该注解OptaPlanner不会把集合内的对象判定为待调度的规划实体,就会出现日志中「共0个规划实体」的提示。所有规划实体被固定
如果初始化传入的ScheduledClass的所有规划变量都已经被预先赋值,且实体添加了@PlanningPin注解固定,或者求解规则配置了仅选择未赋值实体的过滤条件,就会被识别为无可用移动操作的实体,直接跳过求解。求解配置错误
检查solverConfig.xml或Spring Boot配置文件中的配置项,确认是否正确指定了规划实体类、解决方案类ScheduleTable、ScheduleScoreCalculator的全限定类名,配置错误会导致OptaPlanner加载不到对应的调度规则和实体。分数计算器逻辑异常
当前分数计算器存在两处明显问题:- 存在空指针风险:判断
a.getTimeslot() != null后直接调用a.getTeacher().equals(b.getTeacher()),如果teacher字段为null会抛出异常,被OptaPlanner内部捕获后会中断正常求解流程 - 得分规则逻辑相反:OptaPlanner的得分逻辑为「得分越高解越优」,硬约束违反需要扣硬分、软约束违反需要扣软分,你当前的逻辑是冲突时加硬分,会导致求解器判定冲突是更优结果,就算正常运行也会得到不符合预期的调度结果
- 存在空指针风险:判断
内容的提问来源于stack exchange,提问作者Ahmad-prog-mach

