|
我目前在做中学排课系统,我的方法是这样的,使用随机排课的办法:
排课主线是:以教师为主线:
把当前年级的所有教师放到一个数组里面,之后根据该教师所教的班级和该教师所教课目的课程数来随机选择班级中的课程表中的数据,如果有冲突,就重新随机选择,如果一再冲突,就终止随机,先选择有冲突的这个课时,一在随机到最后,如果有冲突,使用while语句再重新排课,如果没冲突存在,就使用该排课方案!
我所遇到的问题是:
1:将所有班级的课表生成为一张数据表,即课表矩阵,如果根据以上所说的和select 语句从矩阵中不断的随机选择符合条件的课时安排给该教师
问题是:如果所有科目的课时数和班级的课程中的课时数一样,即相等,那程序运行到一半就不动了,即班级的课表始终不能完全排好,基本上就是每个表的课程表中还有三到5个空白,即有五节课左右不能排
但是,如果班级的课程表,每天的课时再增加一,即课程表大于所有科目的课时,那么能够轻松排课,尽管还存在冲突,但是也无大碍,
致命的问题是,为什么课程表的课时和所有科目的课时是一样的,即完全一样,绝对没错,为什么通过检查数据和插入数据,就不能完全实现呢
以上随机选择的办法是,从Matrix表中选择合适的课时,之后再将数据插入到CourseScheduling表中,同时将Matrix表中相应的数据删除
前表中的测试数据有1140条,但是每次执行的时候,该表还剩下60条数据左右(班级有30班,即每个班级大概就有2节课还不能排)
当然,如果遇到冲突问题,就连续执行20次,如果还冲突,就选择这条数据作为课时,我的冲突问题是这样解决的,
以上所说的,从理论上分析,是没问题的,为什么会有这样的问题?为什么每个表还有两节课不能排
程序没提示任何错误,只是执行的时候浏览器的进度条走到一半就不动了,我看了CPU是百分百的利用率,我看得出来,程序一在都在执行,但是为什么就不能执行成功呢?
以下是我的代码,大家看看吧!
for(int i = 0;i<LessCourseNumTeaID.Count;i++)//所有教师的ID号
{
ArrayList MyClassNum = GetCurrentTeaAllClassName(LessCourseNumTeaID[i].ToString().Trim());//获得当前年级该教师所教的所有班级
for(int j = 0 ;j<MyClassNum.Count;j++) //该教师所教的当前年级的所有班级
{
string MySqlStr ="select ID from Matrix where 所属年级="+"'"+GradeNameComBox.SelectedValue.ToString().Trim()+"'"+" and 班级名称="+"'"+MyClassNum[j].ToString().Trim()+"'";
int HaveCourseNum =GetCurrentSubjectCourseNum(GetCurrentTeaSubject(LessCourseNumTeaID[i].ToString().Trim())); //获得当前年级该教师该课目每周的课时数
bool MyBL = true;
int ConfictNum = 0 ;
int CursorCouseNum=0;
while(MyBL) //执行循环,直到找到满意的课时为止,
{
string MySqlStr1=GetGoodCourseNum(MySqlStr);//传递MySqlStr,取得满足条件的所有ID号,之后再随机选择一个ID号传送过来
MyReader = MyClass.MySqlDataReader(MySqlStr1,MyKey, MyValue,MySqlDbType,MyFieldLength);
while(MyReader.Read())
{
if(CheckConflictSecond(LessCourseNumTeaID[i].ToString().Trim(),MyReader["星期名称"].ToString().Trim(),MyReader["星期值"].ToString().Trim(),MyClassNum[j].ToString().Trim()))
{
ConfictNum = ConfictNum + 1 ;
if(ConfictNum==20)
{
ConflictInfor = ConflictInfor + GetTeaName(LessCourseNumTeaID[i].ToString().Trim())+","+GetCurrentTeaSubject(LessCourseNumTeaID[i].ToString().Trim())+","+MyReader["星期名称"].ToString().Trim()+",第"+MyReader["星期值"].ToString().Trim()+"节,发生冲突!<br>";
InsertIntoCourseScheduling(MyClassNum[j].ToString().Trim(),MyReader["星期名称"].ToString().Trim(),MyReader["星期值"].ToString().Trim(),LessCourseNumTeaID[i].ToString().Trim(), GetTeaName(LessCourseNumTeaID[i].ToString().Trim()),GetCurrentTeaSubject(LessCourseNumTeaID[i].ToString().Trim()),GradeNameComBox.SelectedValue.ToString().Trim());
DeleteMartixData(MyReader["ID"].ToString().Trim());//删除当前年级对应的矩阵数据
CursorCouseNum = CursorCouseNum + 1;
}
}
else
{
InsertIntoCourseScheduling(MyClassNum[j].ToString().Trim(),MyReader["星期名称"].ToString().Trim(),MyReader["星期值"].ToString().Trim(),LessCourseNumTeaID[i].ToString().Trim(), GetTeaName(LessCourseNumTeaID[i].ToString().Trim()),GetCurrentTeaSubject(LessCourseNumTeaID[i].ToString().Trim()),GradeNameComBox.SelectedValue.ToString().Trim());
DeleteMartixData(MyReader["ID"].ToString().Trim());//删除当前年级对应的矩阵数据
CursorCouseNum = CursorCouseNum + 1;
}
}
MyReader.Close() ;
MyClass.CloseDataBaseCon();
if(CursorCouseNum == HaveCourseNum)
{
MyBL = false;
}
}
}
} |
|