声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4208|回复: 2

[人工智能] 求助:用遗传算法和vc/c实现的课程表编排

[复制链接]
发表于 2006-5-10 16:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我正在做毕业设计,题目是 “大学课程表的设置与安排问题研究”,请问哪位大侠有用遗传算法实现、用vc或者是c编写的源程序啊?麻烦帮忙上传一下,深表感谢!!!!
回复
分享到:

使用道具 举报

发表于 2006-5-14 21:06 | 显示全部楼层
现成的程序没见到,基本思想可以参考下面的:

  (一)初始化
  根据班级信息表以及它与本学期课程信息表的关系,找到每个班的所有课元,再根据这些课元,以及本学期课程表和排课表之间的关系,找到这个班的所有排课元。假设每星期上5天课,每天2节连上,有3个时间段,则每星期有15个上课时间段。那么将这15个时间段随机地分配给上述某个班的所有排课元,也就是排好了一个班的课表。一个班的“排课元”的数目一定是小于或等于15的。如果小于则有时段未排到,即是自习时间。可在“班级信息表”新建一个临时字段“自习”,记录这些自习时间。
  再来排教室。给每个班安排一个满足人数要求的教室作为固定教室。一般的课程就在固定教室上,如果是语音课则排语音室,如果是体育课则安排操场,如果是实验课则排实验室。排的时候注意比较该教室的“已排”字段,如与已排时段有冲突,则更换时段。

对每个班做上述工作,则排好了一张初始课表。这张初始课表肯定有很多 “硬冲突”,必须消除。由于排课时已经注意了教室的时段不能冲突,所以只要查看教师的时间有无冲突即可。根据教师信息表与本学期课程信息表的关系,得到每个教师的课元,再根据这些课元,以及本学期课程信息表与排课表的关系得到该教师的所有排课元。检查这些排课元的时段,如有重复,则须调课:首先考虑与自习课调,班级信息表的“自习”字段记录了该班的自习时段。如果这些自习时段都与该老师的上课时间有冲突,则考虑能否用大教室,查看该老师在该时段所上课程的教室要求能否用大教室,如能,统计该老师在该时段的上课班级的总人数,安排一个能容纳这么多学生的大教室。如果大教室方案不能解决问题,则只能和同班的其他老师调换,但注意只能和未检查过冲突的老师换,以免循环调换。
  (二)建立初始种群
  计算消除了硬冲突的课表的适应度函数,记录在数组中。将该排课表考贝到新数据集ds2。拷贝过来的这个排课表即一个“染色体”。重复上述过程,直至染色体数目达到种群规模。
  (三)遗传操作
  对ds2 中的每张表做如下操作:
  1.选择。采用“随机竞争法”。随机选取两张表,比较它们的适应度,删除适应度小的表,复制适应度大的表替换它。
  2.变异。设变异概率为Pm,随机产生一个(0,1)范围内的数,如果小于Pm,才进行变异操作。随机选取两天,让这两天的时段互换。这样做的好处是不用纠错。
  3.交叉。类似地,设交叉概率为Pc,随机产生一个(0,1)范围内的数,如果小于Pc,才进行交叉操作。这里采用“单点交叉”。随机选两张表,再随机选取一个序号,让这两张表中这个序号的记录的“上课时段”值互换。互换后这两张表都要纠错,消除硬冲突。过程仿初始化时的消除冲突过程。只是要注意,如果调换的排课元涉及到大教室,须换回所在班的固定教室。重复该过程,注意每一步操作后都要更新适应度数组,使数组值与表一致。迭代500代后,选取最大适应度的表传回ds1排课表。
 楼主| 发表于 2006-5-15 08:27 | 显示全部楼层
太感谢了,主任!您可真是雪中送炭啊,我是新手,非常感谢您的指点!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-25 00:48 , Processed in 0.107070 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表