不同排课算法的区别及应用
CSP+启发式*算法:(约束满足问题) 用于生成满足硬约束的初始解
1. 数据初始化
- 科学需求收集:收集每个班级需要上的课程和对应课时数
- 教师任务分配:将每个教师需要教授的课程、班级和课时数整理成任务列表
初始化空课表:
- 初始化一个三维数组,第一维:周次,第二维:节次,第三维:班级
- 数组中每个元素初始值设置为0
- 在后续的算法中,这些位置会被填充为对应的课程 ID
教师工作量优先级:对教师授课课时数进行排序,工作量大的教师优先安排
- 这是CSP(约束满足问题)算法中常用的启发式策略之一
- 这样可以减少后期冲突
- 解释了为什么体育课排在第一节的频率比较高
设置课程优先时间槽:课程可以安排在哪些节次上
- 主课程语数英优先安排在上午
- 体育课不安排在中午
- 没有设置优先级的课程可分配在任何时间
- 如果课程根据优先级未能完全安排,尝试其他时间槽
避免冲突核心实现:每次安排课程时都会检查:
- 该班级在这个时间段是否已有课程
- 该教师在这个时间段是否已在其他班级上课
排课:
- 把课程id赋值给以周次、节次、班级为三维数组的课表
- 保证课程数量
GA遗传算法: 用于优化CSP初始解,使其更好地满足软约束
初始化种群:
- 使用CSP算法生成一个满足硬约束的初始解,然后通过对该解进行多次随机变异来生成初始种群中的其他个体,确保种群多样性
适应度:适应度函数评估每个课表方案的质量,考虑了多种约束条件:
- 硬约束(教师冲突、课程数量)有较大惩罚权重
- 软约束(不合理时间槽、课程分布不均、连续相同课程)有较小惩罚权重
选择:
- 精英选择:保留适应度最高的 elite_size 个个体直接进入下一代,确保最优解不会丢失
- 父代选择:使用轮盘赌方法选择父代,适应度越高的个体被选中的概率越大,但低适应度个体仍有机会被选中,保持种群多样性
交叉:
- 交叉操作按班级进行,对每个班级有50%的概率交换两个父代的课表,生成两个新的子代
- 通过组合父代个体的优良基因,生成兼具双方优势的新解,从而在解空间中高效探索更优区域
变异:
- 变异操作以 mutation_rate 的概率随机选择一个班级,然后随机交换该班级的两个课程时间槽,增加种群多样性
- 变异是遗传算法中增加种群多样性的重要机制,防止算法陷入局部最优解
交叉 vs. 变异的协同作用
| 操作 | 目的 | 优点 | 缺点 |
|---|---|---|---|
| 交叉 | 重组优质基因 | 高效、方向性强 | 依赖种群多样性 |
| 变异 | 引入随机性 | 避免早熟收敛 | 改进速度慢 |