Optapy排课开发求助:配置教师与约束后输出无变化
排课系统Optapy运行无输出变化的排查方案
检查求解器执行逻辑
确认是否正确调用了solver.solve(),必须用求解后的返回值输出,别直接输出初始问题。另外排查终止条件是否设置过严,比如secondsSpentLimit=0会导致求解器直接返回初始状态。
示例代码自查:solver = solver_factory.buildSolver() # 必须调用solve并接收返回的求解结果 solved_problem = solver.solve(initial_problem) # 输出solved_problem而非初始的initial_problem print(solved_problem)验证约束规则是否生效
- 硬约束:故意构造违反硬约束的初始解,看求解器是否调整。如果没反应,检查
@Constraint注解参数、约束流的实体关联是否有误。 - 软约束:排查权重是否设置过低,导致求解器认为无需调整。可以临时调高某条软约束权重,重新运行测试。
约束定义示例检查:
@Constraint(constraintPackage = "school.scheduling") def teacher_conflict(constraint_factory: ConstraintFactory): return constraint_factory.for_each(Lesson) \ .join(Lesson, Joiners.equal(lambda lesson: lesson.teacher), Joiners.overlapping(lambda lesson: lesson.start_time, lambda lesson: lesson.end_time)) \ .penalize("Teacher conflict", HardSoftScore.ONE_HARD)- 硬约束:故意构造违反硬约束的初始解,看求解器是否调整。如果没反应,检查
确认实体与变量注解正确性
检查课程实体是否添加@PlanningEntity注解,教师分配字段是否标记@PlanningVariable,且valueRangeProviderRefs要指向正确的可选教师集合——要是求解器没有可选值,自然不会产生变化。排查初始解是否已达最优
如果初始解满足所有硬约束,且软约束得分已经最高,求解器不会进行调整。手动修改初始解制造约束冲突(比如给同一教师排两门重叠课程),再运行求解器观察是否有优化动作。开启日志查看求解过程
开启Optapy调试日志,确认求解器是否在执行约束评估、迭代搜索。添加日志配置:import logging logging.basicConfig(level=logging.DEBUG)从日志中可以查看得分变化、求解阶段等信息,判断求解器是否在正常工作。
内容的提问来源于stack exchange,提问作者mery
相关产品推荐
相关产品推荐

