基于遗传算法的多目标排课优化系统
项目简介
本项目是一个基于MATLAB实现的自动化排课系统,旨在通过遗传算法(Genetic Algorithm, GA)解决复杂的学校教务排课问题。系统通过数字化编码建立数学模型,将教师、课程、班级、教室及时间片等资源进行统筹,利用进化计算的全局搜索能力,寻找满足多重约束条件的最优排课方案。
该代码实现了一个完整的遗传算法流程,包括种群初始化、适应度计算(包含硬约束和软约束)、选择、交叉、变异以及精英保留策略,并提供了详细的可视化结果展示。
功能特性
- 自动排课数据生成:系统内置模拟数据生成功能,能够自动构建包含5天×4节/天(共20个时间片)的时间表,以及教室、教师、班级和课程任务书。
- 任务粒度细化:通过任务展开机制,将宏观的课程任务(Course)转化为最小调度单元(Lesson),确保每一节课都能独立分配时间与空间。
- 多维度硬约束检测:
*
资源冲突检测:严格检查同一时间片内,教师、班级、教室是否被重复占用。
*
容量限制检测:确保分配的教室容量不小于上课班级的人数。
*
课程分散度:优化同班级同一门课程在同一天的分布,避免课程过度集中带来的学习疲劳。
* 采用锦标赛选择法(Tournament Selection)。
* 采用均匀交叉策略(Uniform Crossover)。
* 多模式变异操作(改变时间、改变教室或同时改变)。
* 迭代收敛曲线绘制。
* 文本形式的冲突报告及最优适应度统计。
* 指定班级(如计科1班)的课表输出。
* 全校教室占用情况的热力图展示。
系统要求
- MATLAB R2016b 或更高版本。
- 不需要额外的工具箱(代码仅使用MATLAB基础函数)。
使用方法
- 确保MATLAB的工作路径包含本项目的
main.m 文件。 - 直接运行
main.m 脚本。 - 程序将输出这一代进化的进度信息(代数、最佳适应度、冲突数)。
- 运行结束后,系统将弹出图形窗口展示收敛曲线和教室热力图,并在控制台打印详细的排课结果。
算法实现细节
本项目的核心逻辑严格对应 main.m 中的代码实现:
1. 染色体编码与初始化
- 编码方式:采用实数编码(Integer Encoding)。每个个体表示为一个
N x 2 的矩阵,其中 N 为需排课的总任务数(Lesson)。
* 第一列代表
时间片ID(1-20)。
* 第二列代表
教室ID(1-6)。
- 种群结构:使用三维矩阵存储种群,维度为
[任务数, 属性列, 种群大小]。
2. 适应度函数设计 (calculateFitness)
适应度计算采用惩罚函数法,公式为
Fitness = 1 / (1 + TotalPenalty)。惩罚项由以下部分组成:
*
教师冲突:通过排序检测同一时间同一教师是否出现多次。
*
班级冲突:检测同一时间同一班级是否有课程重叠。
*
教室冲突:检测同一时间同一教室是否被分配给多个任务。
*
容量不足:对比分配教室的容量与班级人数,容量不足则计入惩罚。
*
课程分布:统计同一班级在同一天(按每天4节课折算)是否重复出现同一门课程。若出现,则施加“分散度惩罚”,促使课程在周内均匀分布。
3. 遗传操作算子
- 选择 (
selection):实现了锦标赛选择算法,每次随机选取4个个体进行比较,选择适应度最高者进入下一代。 - 交叉 (
crossover):采用均匀交叉,生成一个随机掩码(Mask),父代个体根据掩码交换对应任务的时间和地点基因。 - 变异 (
mutation):依概率对个体的某个任务进行扰动。代码实现了三种随机变异模式:
1. 只改变时间片。
2. 只改变教室。
3. 同时改变时间和教室。
- 精英保留:每代进化结束后,用父代中适应度最高的个体直接替换子代中适应度最低的个体,防止最优解退化。
4. 辅助功能分析
generateData:构建基础教学资源。定义了6间教室(区分大小、实验室)、6名教师、3个班级以及13门课程的具体学时安排。expandTasks:将类似“高等数学 4学时”的记录展开为4个独立的待排任务行,便于算法逐个处理。displayResults:结果处理模块。不仅绘制适应度曲线,还生成了一个基于 imagesc 的热力图来直观展示教室资源在时间维度上的占用情况(黑=占用,白=空闲)。
注意事项
- 代码中包含了早停机制的框架(判断冲突数为0),但为了进一步优化软约束,当前设置下并未强制退出循环,而是跑满预设的最大迭代次数(200代)。
- 冲突检测使用了排序加差分(
sortrows + diff)的方法,相较于双重循环,显著提高了MATLAB环境下的运算效率。