Python实现了基于遗传算法的排课优化
github:/xiaochus/genetic class schedule
遗传算法是模拟达尔文生物进化论的自然选择和遗传机制的计算模型,是一种通过模拟自然进化过程来搜索最优解的方法。遗传算法的流程如下:
首先,遗传算法针对所要解决的问题随机生成一组解,我们称之为种群。群体中的每个个体都是问题的解决方案。在优化过程中,算法会计算整个种群的代价函数,从而得到一个与种群相关的适应度序列。如下图所示:
为了得到新的下一代种群,按照适应度对种群进行排序,选择最优秀的个体加入下一代种群。这个过程也叫精英选拔。剩下的新种群是通过修改被选中的精英个体获得的。
种群修改的方法参考生物丹进化的方法,一般采用变异和交叉两种方法。变异的方法是对种群进行小的随机改变。如果解的编码方式是二进制,那么随机选择一个位置进行0和1的相互突变;如果解的编码方式是十进制,那么随机选择一个位置进行随机加减。交叉的方法是从最优种群中随机选择两个个体,以某个位置为交集合成一个新的个体。
变异和交叉后得到一个新种群(大小与上一代相同),对新种群重复上述过程,直到迭代次数(失败)或解的适应性满足我们的要求(成功),GA算法结束。
算法实现
首先,我们定义一个课程类,它包括几个属性,如课程、班级、教师、教室、周和时间。前三个是自定义的,后三个需要算法优化。
接下来,定义了代价函数,用于计算课程群体的冲突。当被测课表的冲突为0时,该课表是符合要求的课表。冲突检测遵循以下规则:
使用遗传算法进行优化的过程如下,与上一节的流程图相同。
Init_population:随机初始化不同的种群。
Mutate:变异操作,在允许的范围内,随机增加或减去调度对象中的一个可变属性。
交叉:交叉操作,随机交换不同位置的两个对象的属性。
进化:启动遗传算法进行优化。
实验结果
下面定义三个班级,六门课程,老师,三个教室,测试排课效果。
优化结果如下:第68次迭代时,排课不冲突。
选择1203的课表进行可视化。如下图,算法合理安排相应的课程。