《毕业设计论文基于遗传算法的课程安排优化设计.doc》由会员分享,可在线阅读,更多相关《毕业设计论文基于遗传算法的课程安排优化设计.doc(24页珍藏版)》请在三一办公上搜索。
1、南京师范大学本科毕业论文 运用遗传算法的课程安排优化设计题 目: 基于遗传算法的课程安排优化设计 摘要课程表规划问题是一个NP 完全问题,其规划策略可以通过多种方法实现,一般启发式搜索算法是通过在全局区间找到可行结果,通常适合于简单的例子,对于多参数输入和结果要求,寻找一个相当好的解决方案可能需要耗费很多时间,甚至是不可能的。遗传算法(GAs) 是基于启发式方法的种群,该方法已经成功应用于人工智能、搜索和优化的各个领域,遗传算法的原理是由Holland设计并进行开发的,遗传算法具有以下特性:(1)从种群中选择个体的机制;(2)创造新个体的运算;(3)通过将以前的单个方案随机打乱,生成新解决方案
2、的过程(4)更新个体的规则,这些特性分别被称为选择,杂交,变异,更新。本论文拟将遗传算法应用于课程表的多参数优化,寻找满足约束条件的课程规划。关键字:课程表规划,遗传算法,选择,杂交,变异,更新AbstractMaking a class schedule is one of those NP-complete problems which can be solved by many methods. The normal heuristic search algorithm finds the optimal solution based local search procedure, bu
3、t it only works for simple cases. For more complex inputs and requirements, finding a considerably good solution can take a while, or it may be impossible. Genetic algorithms (GAs) are population based heuristic approaches. They have been applied successfully in various domains of artificial intelli
4、gence, search, and optimization. The promising results were obtained for many difficult optimization problems. The principles of GAs were developed by Holland .Very briefly, GAs can be characterized by the following features: (1) a mechanism for selecting individuals from the population; (2) an oper
5、ator for creating new individuals; (3) a procedure for generating new solution by random perturbations of the single previous solutions; (4) a rule for updating the population. These features are referred to as selection, crossover, mutation, and updating. In this paper, GAs will be applied to optim
6、izing the multi-parameter of schedule and searching the schedule which satisfies the requirements . Key words: class schedule planning,genetic algorithms,selection,crossover,mutation, updating.目录摘要1Abstract2第一章 绪 论41.1研究目的及意义41.2研究现状41.3研究内容4第二章 排课问题研究的概述52.1课程表问题的描述52.1.1时间表问题概述52.1.2课程表问题概述52.2大学课
7、程表问题的研究情况62.2.1大学课程表问题的理论研究62.2.2大学课程表问题解决方法62.3排课的各种算法的比较7第三章 课程表的类对象93.1课程表的类对象93.2Chromosome 染色体93.2.1 Representation 表示93.2.2 Fitness 适应度103.2.3 Crossover 杂交113.2.4 Mutation 突变12第四章 基于遗传算法的课程规划124.1遗传算法的来源和研究发展124.2具体操作134.3课表观察员164.4配置164.4.1 配置文件164.4.2 配置文件的例子174.4.3 解析一个配置文件184.5程序运行示意图19第五章
8、 结 论21致谢23参考文献24第一章 绪 论 1.1 研究目的及意义排课问题的本质是将课程、教师和学生在合适的时间段内分配到合适的教室中,涉及到的因素较多,是一个多目标的调度问题,即NP(Nondeterministic Polynomial,非确定的多项式)完全问题。NP-完全问题的简单与否,取决于问题的难易程度,只能用启发式算法找出最优解。然而这种算法太慢了,根本无法在计算机上实现。因此众多研究者提出了多种其他排课算法,如模拟退火、禁忌搜索、进化算法等。其中,遗传算法(Genetic Algorithm, 简称GA)是很有效的求最优解的算法。本课题的主要目的是通过综合研究、分析现有的排课
9、优化的解决方法,实现基于遗传算法的自动排课优化。本课题的研究意义在于,实现基于遗传算法的排课优化问题,可以提高优化的满意度和灵活度。实践证明,这种算法设计得出的课程安排可以达到了师生的高度满意。1.2 研究现状大学课程表问题(University Timetable Problem-UTP)或者时间表问题(Time Table Problem-TTP)是一个一直困扰各个学校的令人头疼问题,它是运筹学典型的组合优化问题之一。教师,教室,时间,课程和班级是五个制约该问题解决的重要因素。19世纪60年代,开始有学者从事计算机辅助排课的研究,Appleby等人开始使用简单的经验法,来解决小规模的排课问
10、题。遗传算法是由美国芝加哥大学Holland教授于1975年所提出。其基本观念源自于达尔文的进化论(Darwins Theory of Evolution)中适者生存的理论,是一种通过模拟自然界生物进化过程求解极值的自适应人工智能技术。遗传算法借用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制来提高各个个体的适应性,体现了自然界中“物竞天择、适者生存”的进化过程。1975年,经过对该问题进行证明,S.Even提出它是一个NP完全问题。这意味着普通的方法比如图着色,整数规划,对复杂的学校排课问题并不能进行良好的解决。从70年代到90年代,有些学者开始了利用矩阵向量方法来对排课问题进行研究
11、,能够解决规模稍大的问题,但是仍然存在缺陷。到了90年代后,国内外很多学者转而采用遗传算法对排课问题进行了研究,随着遗传算法的发展,有了一定的结果,但是仍然未能解决满意度的问题。1.3 研究内容第一步:了解遗传算法的概念及其对于排课优化的重要意义。第二步:研究现有的排课优化方案及存在问题。第三步:利用遗传算法建立数学模型,定义染色体编码方案和适应度函数。第四步:通过初始化种群、选择、交叉、变异等过程不断进化,最后得到最优解。第五步:结果分析及其优化。第二章 排课问题研究的概述22.1 课程表问题的描述2.1.1时间表问题概述时间表问题(TimeTableProblem)既是一个理论方面的问题也
12、是一个来源于实践的问题,它是实际生活中人们可以遇到的问题,甚至对于我们来说很常见。比如说交通时间表问题1112(transportationTimetabling),这个问题是如何设计城市中公交车或者有轨电车的时间表问题,使其能够良好的运行,减缓城市交通的压力;比赛时间表问题13(employeetimetabling)是如何设计一项大型赛事的时间表,来保证大型赛事能够良好的进行;还有雇员工作时间表问题(employeetimetabling),研究得是如何来安排雇员的工作,使其工作能够达到最高的效率;当然还有我们要研究的大学课程表问题,这个问题研究的主要目的是提出一种优秀的算法最大程度上使学
13、校课程安排人性化、合理化。 时间表问题是一类具有多约束的将有限时间资源分配给多个事件组合优化问题。通常,一个时间表问题会有一系列事件(event)和一组有限的时空单元(time-space slot)和一组具体地点,并且还要受到一系列约束的限制,这些约束又分为硬约束和软约束。硬约束就是我们在进行时间表安排的情况下必须无条件满足的一系列限制,不能有任何违反,而软约束也是一系列的限制,但是我们不一定要全部满足,但是这些软约束的满足情况却决定了我们时间表安排的合理情况。当你排一个课程表时,你必须考虑很多要求(教授、学生、班级和教室的数目,教室的大小,教室里的实验器材等等)。这些需求可通过其重要性被分
14、成若干组。硬约束(如果你不能解决其中一个,这个排课计划就是不可行的):l 一个班级只能放在一个空教室里l 没有教授和学生可以在同一时间上一门以上的课l 一个教室要有足够的位子安排所有的学生l 如果要在一个教室排课,此教室要有这门课程所需要的设备(例如电脑)软约束(即使不能解决,计划仍是可行的)l 一些教授对上课时间的偏好l 一些教授对上课地点的偏好l 学生或教授的在时间和地点上的班级分配当然,硬的和软的约束取决于有关情况。在这个程序中,只有硬约束落到了实处。2.1.2课程表问题概述本文主要研究的是时间表问题中的课程表问题。这个问题是来源于学校日常生活,和学生的日常生活息息相关。随着学校规模扩大
15、,学生的数量急剧增加,学校的教育资源显得越来越有限,这个问题就显得越发突出。所以对这个问题的研究具有现实意义,但是它又不缺乏理论性,1975年,S.Even对该问题进行了研究,并指出大学课程表问题是一个NP完全问题,这就说明了该问题没有真正意义上的最优解,人们的求解只有可能是相似最优解,也就是说求解获得的答案只可能不断接近最优解,但是不可能是最优解。于是人们就尝试用各种方法去解决这个问题,如图着色、分支定界、整数规划等,经过实践证明,遗传算法和模拟退火算法是两种解决该问题比较理想的方法。本文在后面主要介绍了遗传算法。 那什么是课程表问题?虽然已经从感性上已经了解了这个问题,但是下面将给出一个较
16、为严格的定义方便深入理性的理解这个问题。Carter和Laporte这样定义:“课程表问题是一个多元分配问题,它研究的就是如何把学生和老师分配给课程,课程单元或者班级,如何把事件(上课事件)分配给教室和时间” 。 简单一些的说大学课程表问题研究的就是如何把一系列的课程分给有限的教室和一周内有限的上课时间单元,如何把学生和老师分配给课程。当然实际研究的时候并没有理论上说得这么简单,它会受到多种约束的影响,有硬约束也有软约束,这我们在上一小节已经提到了。 2.2 大学课程表问题的研究情况2.2.1大学课程表问题的理论研究大学课程表问题在20世纪50年代末就已经开始被人们所重视,将它作为一个科学问题
17、来研究,但是一直到1963年才由Gotlieb提出了该问题的数学模型和形式化描述,这标志着排课问题正式被作为科学问题来被人们所研究,到了1975年S.Even在他的论文中提出并证明大学课程表问题是一个NP完全问题,把该问题理论化,同时也说明该问题有解,并能够找到解。但是根据计算和难解性理论,目前还没有解决NP完全问题的多项式算法。到1979年,Schmidt和Stroheim在文献中就列出了300多篇有关大学课程表问题的已发表文献。现在每年外国的关于运筹学的杂志上依然总会出现一些关于该问题的论文。 2.2.2大学课程表问题解决方法至今已经有很多算法被拿来研究用于尝试解决该问题。起初,图论是研究
18、大学课程表问题的一个主要武器,图着色技术被广泛的用来尝试解决该问题。举个例子,1994年,Burke,Elliman和Weare6就研究出一种启发式的图着色方法,该方法把考试进程分成若干组,然后把它们放在一起安排,以求找到一种能够解决考试时间表问题的方法。但是图着色技术本身就是一个NP完全问题,所以对解决该问题帮助不大。后来CARTER,M.W.和LAPORTE15尝试采用按序分派的方法解决该问题,这种方法需要按启发顺序把事件分出先后顺序,然后再尝试寻找一个可行的解决方案。Ferland等人18和吴金荣17把排课问题转化成整数规划问题来解决,但计算量很大,只适合一些理论中的简单情况对于解决复杂
19、问题是不可行的。许多文章11121314试图利用启发式函数来解决排课问题,但是大多数启发方法都是模拟手工排课的过程来实现的。但是由于实际的排课问题存在各种各样的限制条件与特殊要求,处理不好这些限制和要求就无法找到理想的排课方案。 最后,启发式算法被引入大学课程表问题,而且在一定程度上获得成功,在解决大学课程表问题上取得了不错的成绩。启发式算法主要包括三种:禁忌搜索(TabuSearch),模拟退火算法(SimulatedAnnealing)和进化算法(EvolutionaryAlgorithms)。 1.禁忌搜索(TabuSearch) 禁忌搜索是一种主要研究研究具有各种特殊要求的真实世界时间
20、表问题的算法。它由Glover在1986年提出,进而慢慢形成一种独特而又完整的算法。经过研究表明这种算法如果能够正确恰当选择参数(禁忌列表,初始化解决方案和目标函数)那么它在解决大学课程表问题上将有很出色的表现。1998年,Nonobe和Ibaraki13开发出一种基于禁忌搜索的处理一般问题的解决系统,这种系统对于满足约束问题特别是高中课程表问题有着出人意料的良好效果。后来在2002年,Alvarez.Valdes,Crespo和Tamarit14研制出了一种基于禁忌搜索的具有友好界面的系统,这个系统经过一系列实验也取得不错成绩。现在关于这项技术的研究还在继续,我们这里就不再赘述了。 2.模拟
21、退火算法(SimulatedAnnealing) 模拟退火算法是一种被广泛研究的算法,它也经常被用来解决时间表问题和大学课程表问题。它是一种模拟固体退火过程的算法。它由Kirkpatrick等人于1982年提出,后来就专门用来解决大规模组合优化问题,它是一种解决NP完全组合优化问题的有效的近似算法。现在一些研究表明,模拟退火算法在课程表问题15和考试时间表问题6上的实现是高度依赖于各种设定与参数(解决方案空间,降温时间表,邻居产生和评估函数)。因此使用这种算法的时候需要谨慎的选择参数。 3.进化算法(EvolutionaryAlgorithms) 进化算法和遗传算法现在已经被广泛用来研究时间表
22、问题和大学课程表问题。遗传算法最早是由Colorni7等人在90年代初期引入用来解决课程表问题的,一开始他们引进了矩阵表示方案和交叉、变异算子。后来Colorni8又把遗传算法成功应用到米兰一所较大的学校的课程排布问题中。Paechter9等人对TTP问题进行了研究,提出了时域置换法和放置查找法,并针对较大规模的实际TTP问题比较了这二种算法的性能。Burke3对将进化算法分阶段的用于UTP问题做了初步的研究,得到一些颇有价值的成果。遗传算法是本文研究的重点,后面第四章我们将更加详细的讲解遗传算法。另外基于知识学习的技术也渐渐的参与到对于时间表问题和课程表问题的求解上来。基于知识学习的技术是一
23、种模仿人类思维过程的技术,人类在解决问题的时候总是先在大脑中寻找一个相似的问题,然后对这个相似问题进行分析学习,然后对这个相似问题进行改进以求获得当前新问题的解决方案。这种技术有一个很至关的重要问题,就是如何能清晰地表示经验和知识,并将其存入知识库以便后来之用。这种技术主要包括两种:一种是基于规则的系统,另一种是基于案例推理的系统(Case-BasedReasoning,CBR)。现在大多数用来解决时间表问题的基于知识学习的系统都是基于规则的,很少有基于案例推理的系统。本文主要讲述的是前一种基于规则的系统。2.3 排课的各种算法的比较至今为止有很多的方法技术和算法都已经被用来尝试解决时间表问题
24、或者大学课程表问题,他们效果各异,有的完成很出色,有的则只在某些特定情况下才能有不错的效果。传统的算法比如说图论和整数规划在应付简单时间表问题和课程表问题时可以较容易的编码,通常情况下可以圆满地完成任务。但是他们通常对于大型的复杂约束时间表或者课程表问题显得束手无策。人工智能领域的全局搜索技术(包括遗传算法,禁忌搜索,还有模拟退火算法)在各个问题领域都取得了很不错的效果。他们都能够处理各个级别的问题,既可以是简单的问题,也可以是复杂的大型问题。但是他们也有自己的问题需要注意,在使用他们的时候不同场合参数的初始化往往不同,这是一个既重要又难以处理的问题。研究表明基于启发方式的混合算法,在处理问题
25、时候往往会比单独一种算法有更好的更出色的效果。可以看出启发式算法是解决时间表问题和大学课程表问题各种算法中的翘楚。但是当他们之间作比较的时候,一些研究表明,当算法使用的环境不同,表示的方法不同和选择的算子不同的时候他们往往会有完全不同的表现。1995年,Ross和Corne在解决一个时间表问题时,对遗传算法、模拟退火算法和随机爬山算法进行比较,得出结论随机爬山算法在解决问题的质量上略胜一筹3。Colorni、Dorigo和Maniezzo在1998年,对遗传算法、模拟退火算法、禁忌搜索和辅以局部搜索的遗传算法进行比较,得出结论禁忌搜索的效果更佳,但是辅以局部搜索的遗传算法给出了一系列的高质量解
26、决方案,给用户更多的灵活性,以满足各种不同的要求。虽然在不同的环境下,各种启发算法会有不同的表现。但是大家都一致认为遗传算法在解决现实生活中问题的时候具有足够的灵活性,可以给出一系列的较优解以满足人们各种方面不同的需要。本文将着重研究的就是遗传算法,一种改进的混合算法,希望能够对解决时间表问题有较好的作用。 大学课程表问题作为一个典型时间安排问题已经成为了一个具有丰富知识和经验的应用领域。现在几乎所有的用来解决时间表问题的基于知识学习系统都是基于规则的。本文试图讲述一个使用基于规则进行初始化,并用该技术用来指导算法进行改进的遗传算法。 第三章 课程表的类对象33.1 课程表的类对象Profes
27、sor 教授教授类有ID和name(教授的名字)。还包括一个教授所教课的链表Students Group 学生组学生组类有ID和name(学生组的名字),及这个学生组的学生数目。还包括这个学生组要参加的课的链表。Classroom 教室教室类有ID和name(教室的名字),也有座位的数目、有关设备(电脑)的信息。如果教室有电脑,预计为每个座位都有电脑。ID是内部自动生成的。Course 课程课程类有ID和name(课程的名字)。Course Class 课(单门课的信息)课类包含哪位教授教的这节课,这节课上的什么课程,参加这节课的学生组列表。还有教室需要的座位数(即学生组的学生数目之和),是否
28、需要电脑,这节课持续的小时数。3.2 Chromosome 染色体首先我们应该考虑,当我们处理遗传算法时如何以遗传运算可行的方式来表达我们的解法,例如杂交和突变。此外,我们应该知道如何判断我们的解法有多好。换句话说,我们应该能够计算出我们解法的适应度3.2.1 Representation 表示怎么来用染色体表示一个课程表呢?好,我们需要一个存储槽(时空槽)对应每个小时,每个教室,每一天。还有,我们假设只能在周一到周五(总共5天的早上9点到晚上9点之间上课(总共12个小时)。我们可以使用一个 12*5*number_of_rooms 大小的向量组。每一个槽都应该是一个链表,因为在该算法运行时,
29、我们允许多个课在同一个时空槽里。我们使用一个辅助的hash图用来获取一节课开始时的地址。一门课的每个小时都在向量中有一个单独的表目,但在hash图中每门课只有一个表目。例如,假如一节课从下午1点开始并持续3小时,它必须进入1点、2点、3点的槽。图3-1 染色体表示每一条染色体表示一种可能的排课结果,至于排课结果的优劣,则由适应度函数评估染色体的适应值来决定。染色体代表课程表类,它存储课程表的两个属性:/ 时空槽的项代表一个教室的一小时vectorlist _slots;/ 课程表染色体,存储class占用的第一个时空槽地址hash_map _classes;此外,染色体应该存储它的适应度和遗传
30、操作要使用的参数。/ 染色体的适应度float _fitness;/ 课需求满意度的标准vector _criteria;3.2.2 Fitness 适应度遗传算法在进化中是以每个个体的适应度值为依据来选取下一代种群的。适应度函数设定的好坏直接影响到遗传算法的收敛速度和能否找到最优解。在本系统中,适应度值的设计只与硬约束有关:l 每门课有0到5分l 如果一门课用了一个空教室,我们就增加它的分数l 如果一门课需要电脑而它所在的教室有电脑或者不需要电脑,我们就增加它的分数l 如果一门课被安排在有足够椅子的教室里,我们就增加它的分数l 如果一位教授没有其他课,我们就增加这门课的分数l 如果要上课的学
31、生组里的任何一个人在同一时间没有其它课,就加一分l 一个课程表的总分是所有门课分数的总和l 适应度= schedule_score/maximum_score,maximum_score = number_of_classes*5适应度由单精度浮点数表示(float),值在0到1之间。3.2.3 Crossover 杂交一个杂交操作结合了hash图中双亲的数据,并根据新hash图的内容创造出一个向量槽。杂交操作以随机的一些部分来分割hash图中的双亲。部分数由染色体参数里的杂交数决定。它交替复制双亲的一些部分给新的染色体,形成新的向量槽。图3-2 杂交/ 执行杂交操作并且返回后代的指针Sche
32、dule* Crossover(const Schedule& parent2) const 3.2.4 Mutation 突变突变操作非常简单。它只须随便移一门课到另外一个随机选择的槽里。在一个简单操作里,要被移动的课的数目由染色体参数里的突变大小决定。/ 执行突变操作void Mutation(); 第四章 基于遗传算法的课程规划44.1 遗传算法的来源和研究发展19世纪达尔文通过艰辛的考察多年的研究,最终提出了一个具有划时代意义的理论进化论。按照进化论,地球上的每一物种从诞生开始就开始了漫长的进化。生物种群总是从低级,简单的类型逐步发展到高级,复杂的类型,从简单单细胞生物逐步发展成为高级
33、多细胞生物。每种生物为了生存需要不停的斗争,包括同一种群内部的斗争,不同种群之间的斗争,和自然无机环境进行斗争。有些生物生存了下来,并繁衍壮大,因为它具有与众不同但是能够适应环境适合生存的特点;有的生物消亡了,不再存在于地球,留给我们只是化石和无边的猜测,这是因为它不能够适应环境,不能在生物竞争中取胜。达尔文通过研究考察发现了这一过程,并将它称为“物竞天择,适者生存”。 生物学家通过研究发现有的生物之所以繁衍壮大,有的生物之所以消亡,就是因为他们具有了一些别的种群没有的特点,而这些特点又是遗传基因决定的,遗传基因上有大量的遗传信息,这些遗传信息就是决定生物身上各种性征,而这些性征有一部分又能够
34、决定生物在自然界的竞争中胜败,而竞争的胜败直接决定了某一种生物的生存和发展。但是一种生物的壮大就需要生物能够把自己的性征传给下一代,而这一过程是通过遗传基因来做到的。 遗传基因是有一定组合规律的,这些组合的特异性决定了生物体的多样性,基因结构的稳定性保证了生物物种的稳定性,而基因的杂交和变异是生物产生了进化的可能。生物的遗传是通过父代向子代传递基因来实现的,而这种遗传信息的改变决定了生物体的变异。遗传算法采用类似基因演化的循环过程,其演算过程如下: 1)随机产生一定数目的初始种群 2)对个体适应度进行评估,如果个体的适应度符合优化准则,则输出最佳个体及其代表的最优解,并结束计算,否则转向第3步
35、。 3)依据适应度选择再生个体 4)按照一定的交叉概率和交叉方法生成新的个体 5)按照一定的变异概率和变异方法生成新的个体 6)由交叉和变异产生新一代的种群,然后返回第2步。如图1所示:图3-3 遗传算法示意图4.2 具体操作遗传算法相当简单。对于每一代,它执行两个基本操作:1、从当前种群里随机选择n对父母,并且通过在每对父母里执行杂交操作产出n个新的染色体2、从当前种群里随机选择n对父母,并且用新的代替他们。如果它是种群里最优的染色体之一,算法就不选择新的染色体这两个操作会一直重复直到最优的染色体的适应度达到1(意味着课表里的所有课程都达到要求)。正如之前提到的,遗传算法一直追踪种群里的m个
36、最优染色体,同时当他们属于最优染色体时保证它们不会被代替。/ 遗传算法class Algorithmprivate:/ 染色体的种群vector _chromosomes;/ 表明染色体是否属于最优染色体群vector _bestFlags;/ 最优染色体vector _bestChromosomes;/ 当前存储的最优染色体数目int _currentBestSize;/ 在每一代人被后代所取代的染色体数目int _replaceByGeneration;/ 指向算法观察员ScheduleObserver* _observer;/ 种群里的染色体原型Schedule* _prototype;
37、/ 当前的一代int _currentGeneration;/ 算法的执行状态AlgorithmState _state;/ 算法状态的同步CCriticalSection _stateSect;/ 指向算法的全局实例static Algorithm* _instance;/ 全局实例创建和毁灭的同步化static CCriticalSection _instanceSect;public:/ 返回算法全局实例的引用static Algorithm& GetInstance();static void FreeInstance();/ 初始化遗传算法Algorithm(int numberOf
38、Chromosomes, int replaceByGeneration, int trackBest,Schedule* prototype, ScheduleObserver* observer);Algorithm();/ 开始执行void Start();/ 停止执行void Stop();/ 返回种群里最优染色体的指针Schedule* GetBestChromosome() const;/ 返回当前这一代inline int GetCurrentGeneration() const return _currentGeneration; / 返回算法观察员的指针inline Sche
39、duleObserver* GetObserver() const return _observer; private:/ 增加染色体进最优染色体群void AddToBest(int chromosomeIndex);/ 如果染色体属于最优染色体则返回TRUEbool IsInBest(int chromosomeIndex);/ 清空最优染色体群void ClearBest();4.3 课表观察员ScheduleObserver 类处理由遗传算法触发的事件。这个类给应用程序的视图窗口发送消息。当算法的执行没有结束或者中断了,可以通过调用WaitEvent()阻塞呼叫方的线程。/ 当算法找到
40、新的最优染色体时启动的句柄事件void NewBestChromosome(const Schedule& newChromosome); / 当算法执行状态发生变化时启动的句柄事件void EvolutionStateChanged(AlgorithmState newState); / 阻塞调用者进程直到算法执行结束inline void WaitEvent() WaitForSingleObject( _event, INFINITE ); 如果你计划改变NewBestChromosome方法,记住如果要显示最优染色体,必须作一个硬件拷贝(通过使用Schedule类里的MakeCopy方
41、法)因为算法会在下一代里删除染色体。4.4 配置4.4.1 配置文件对象的标识符:1. professor ( #prof tag) 教授 2. course ( #course tag) 课程 3. room ( #room tag) 教室 4. group ( #group tag) 学生组 5. course class ( #class tag) 绑定了教授、课程、学生组的课每个对象以自己的标记符开始以#end结束,所有的标记必须在单独的行里。在对象的主题里,每行只包含一个键和值对(属性)以=分开。每个属性被一次性指定,除了#group对象里的group属性,它可以有多个group属性
42、。以下是对象属性的列表:1. #prof l id (number, required) 教授的编号 l name (string, required) - 教授的名字2. #course l id (number, required) 课程的编号 l name (string, required) - 课程的名字3. #room l name (string, required) 教室的名字 l size (number, required) 教室的座位数 l lab (boolean, optional) 教室是否有电脑,默认值为false4. #group l id (number, r
43、equired) 学生组的编号 l name (string, required) - 学生组的名称l size (number, required) - 学生人数 5. #class l professor (number, required) 绑定的教授编号l course (number, required) 绑定的课程编号 l group (number, required) 绑定的学生组编号,每门课都绑定多个学生组 l duration (number, optional) 课的持续时间 (单位小时),默认值为1l lab (boolean, optional) 这门可是否需要教室里
44、有电脑,默认值为false值得注意的是 professor、 students group、 course在绑定到class前都必须先定义。4.4.2 配置文件的例子#profid = 1name = 刘备#end#courseid = 1name = C+#end#roomname = S3-402lab = truesize = 24#end#groupid = 1name = 1O1size = 19#end#classprofessor = 1course = 1duration = 2group = 1group = 2#end#classprofessor = 1course =
45、1duration = 2group = 3group = 4#end#classprofessor = 9course = 1duration = 3group = 1lab = true#end4.4.3 解析一个配置文件由Configuration类来解析一个配置文件。ParseFile打开并分析一个配置文件。它寻找对象标识符并且调用合适的方法来分析对象。ParseFile清空之前解析了的对象。public:void ParseFile(char* fileName);private:Professor* ParseProfessor(ifstream& file);StudentsGroup* ParseStudentsGroup(ifstream& file)Course* ParseCourse(ifstream& file);Room* ParseRoom(ifstream& file);CourseClass* ParseCourseClass(ifstream& file); 解析一个文件:Configuration:GetInst