最近在做一个课程表的排课程序, 使用遗传算法排课, 苦思冥想不知道该如何处理, 有没有算法大牛能给点建议或者提示吗?

160 天前
 ga9

最近在做一个课程表的排课程序, 使用遗传算法排课, 苦思冥想不知道该如何处理, 有没有算法大牛能给点建议或者提示吗?

下面是排课的要求:

九年级,14 个班,周一至周五,上午 4 节课,下午 4 节课,周一下午第 4 节统一班会课

每个班

任课方案


为了表达方便,我对问题做了一些简化,我查看了一些资料,现在使用遗传算法来解决这个问题,下面是我现在的数据结构:

背景信息

数据结构

个体,染色体,基因数据结构举例

现在的做法是

现在两个个体交叉操作时,是在种群中随机找到两个父代个体中的一个染色体索引位置,然后做交叉(相互交换索引位置前后的染体),生成两个子代。这样交叉后,会出现时间段冲突(会有相同的时间段):个体内部的同一个班级内,出现了相同的时间段,个体内部的同一个教师内,出现了相同的时间段。这就不对了,因为同一个班级,在同一个时间段,没法上两节不同的课,同一个教师,在同一个时间段,也没法上两节课。

现在的解决方法是

通过一个修复函数来处理这种冲突,思路是:交叉操作后,将班级内冲突时间段,都整理到一起,将班级内还可以使用的时间段,也整理到一起;然后将教师的冲突时间段,也整理到一起,将教师还可以使用的时间段,也整理到一起;然后将班级冲突时间段,和教室冲突时间段,通过班级可用时间段和教师时间段来替换。如果将班级冲突时间段,和教室冲突时间段,都能使用班级可用时间段和教师时间段替换调,则表示修复成功,反之就是无法修复。

但是现在是会出现,无法修复的情况,如果无法修复,那么就需要撤销此次交叉操作。实际情况是,能实际修复的交叉操作很少,导致迭代很多代后,最优的个体,还是第 1 代的,这就不对了。

现在的问题是

应该如何执行交叉操作,才能避免同一个班级(如:1 年级 1 班),在交叉后,出现时间段冲突;才能避免同一个教师(如:王老师),在交叉后,出现时间段冲突;后续可能还有教学场地冲突等等...

请问该如何处理更好一些?

感谢看到这个帖子的兄弟姐妹大佬们 :)

680 次点击
所在节点    问与答
3 条回复
Tamio
160 天前
给每一个课表赋分,当出现冲突的情况时扣分,情况越严重扣分挺多。比如一个人同时上两节课属于情况严重,扣 300 分,一个人一天上三节课,属于疲劳情况,但还合理,扣 50 分。然后保留分数高的染色体,最终一般都能找到个合理的课表
ga9
160 天前
@Tamio 你好,感谢作答。请问下,现在你举得示例都是扣分的,是不是最开始的时候,应该给每个课表,给一个初始的分数值合适?这个分数值设置为多少合适?
Tamio
160 天前
@ga9 初始分 0 分,扣成负分也可以。
或者你加惩罚分,最后取分数少的个体优先繁殖

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1051429

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX