如何在基因算法中进行二进制编码以获得更好的课程表调度问题结果?

6
我有一个大学课程表调度的问题,我正在尝试使用遗传算法来解决。我想知道对于此问题最好的编码类型是什么,它也可以帮助我满足一些限制条件。对于这个问题,时间表将具有以下结构,
  • 将安排总共5天的时间表(星期一到星期五)。
  • 每天将有5个不同的时间段,并且一个时间段将有一个授课。
  • 然而,实验课将在连续两个时间段内进行。
  • 时间表还将告诉每个授课的教室编号(或实验室编号)以及每个授课的讲师姓名。

现在,时间表看起来像这样,(图片中有多个时间段,但我将只考虑将时间表划分为这么多时间段之一的5个时间段

enter image description here

这是一个部分班级的时间表。一个单独的时间表中大约有25个班级。

现在,我已经按照以下格式将每门课程、其班级和授课教师的数据写入一个文件中,

1
Object Oriented Programming 
CS-3B
Dr Ali Hassan 
,
2
Object Oriented Programming 
SE-3A
Dr Ali Hassan 
,
3
Remote Sensing and GIS 
CS-7F
Dr Tom Baker

为了表示时间表,我已经将文件制作成这样:

0
1
2 2 9
3 2 9
0
2
2 1 9
3 1 9
0
3
2 5 36
4 1 36
  • 0 是分隔符,用于将一个对象与另一个对象分开。
  • 第一个数字基本上是课程的ID。 "1" 实际上代表了我的第一个文件中的第一个对象(即面向对象编程,CS-3A,Ali Hassan博士)。
  • 第二行表示课程时间表中课程 id = 1 的第一堂课。格式如下,第一个数字星期几。 第二个数字时间段第三个数字教室号码。 因此,在这种情况下,它表示课程id = 1的第一次讲座将在“星期二”,在“第2个时间段”和“9号教室”举行。
  • 第三行表示同一门课程的第二堂课

现在我需要对这个时间表进行编码。我选择使用二进制编码(当然,我可以转向其他编码方式,但需要知道哪种编码方式以及如何操作),并进行编码如下:

00000001 00000010 00000010 00001001 00000011 00000010 00001001 
00000010 00000010 00000001 00001001 00000011 00000001 00001001 
00000011 00000010 00000101 00100100 00000100 00000001 00100100 
00000100 00000010 00000001 00001101 00000100 00000010 00000110 
00000101 00000010 00000010 00001101 00000011 00000001 00000011 

考虑到课程总数可能在200-220之间,因此我选择了8位编码

采用以下格式进行编码:

Course_ID First_Lecture_Day First_Lecture_Slot First_Lecture_Room 2nd_Lec_Day 2nd_Lec_Slot 2nd_Lec_Room

现在,我想知道以下几件事情:

  • 这个编码方式是否正确?或者我应该用其他方式来处理?
  • 这个方案存在一个严重问题,即我有以下两个限制条件:

ss

  1. 实验室讲座必须在连续的两个时间段内进行。
  2. 课程讲座必须在不同的天数进行,即同一天不能有两个课程讲座。

现在,我可以通过在适应度函数中实现来解决第二个问题(我假设。我还没有进入那里,但我正在考虑我可以在那里解决此问题)

然而,我不知道如何解决第一个问题?是否有特定的方法可以指示遗传算法始终将实验室讲座保持在连续的时间段内?例如,我在我的二进制编码中使用另一个位,就像这样:

00000001 00000010 00000010 00001001 00000011 00000010 00001001 00000000

00000010 00000010 00000001 00001001 00000011 00000001 00001001 00000001

其中最后一位将告诉课程是实验室还是课程。根据该位,如果您更改讲座时间,则如果实验室位打开,则同时更改两个讲座时间,以便它们保持在一起,因此实验室将连续进行?我如何确保这一点?有人可以指导我吗?

另外,是否应该在遗传算法的编码过程中使用其他方法?谢谢。


有一个关于你问题的会议: https://www.sportscheduling.ugent.be/ITC2021/ 但他们把重点转移到了体育时间表上。你可能想研究其他技术,这里有一篇关于如何使用ASP解决课程时间表的论文: https://www.cs.uni-potsdam.de/wv/publications/DBLP_journals/anor/BanbaraIKOSSTW19.pdf - Max Ostrowski
@MaxOstrowski非常感谢您的回复。 您还可以告诉我如何查找在此次会议中提交解决方案的每个小组的解决方案(或步骤)吗? 是的,我也会研究ASP技术。 谢谢您,这也将是非常有帮助的。但是,现在我想专注于遗传算法,然后在同一个问题上使用其他技术,然后比较哪种方法可以给出更好的结果。 - Awais Shahid
很遗憾,我不知道。我认为今年的结果还没有公布,也许你可以找到去年会议的一些链接或通过谷歌搜索参与者?很抱歉我帮不上更多忙。祝你好运。 - Max Ostrowski
你坚持要使用遗传算法解决问题吗?如果你的规模很小,你是否尝试编写一个描述你想要的所有内容的优化函数,并应用整数求解器(这将在无限的时间内产生最优解)? - ldog
@ldog 不,我不必“必须”使用遗传算法。但是我们一直在研究遗传算法,并为此制定了一份路线图,这就是为什么我想用遗传算法解决这个问题,但这并不意味着我们不能尝试其他方法。我认为我也会为这个问题研究整数规划求解器。我确实查了一下资料,但我认为它并没有比遗传算法更容易应用,哈哈 :/ - Awais Shahid
1个回答

3
如果您的实验室房间与正常房间不同,则应分别解决实验室和正常课程。
如果您希望课程始终使用相同的房间,那么您不需要对房间进行两次编码,只需使用位掩码表示课程将占用的多个时段即可。
[课程编号] [房间编号] [时段位掩码]
[课程编号]是一个字节1-255
[房间编号]是一个字节,假设少于256个房间
[时段位掩码]是一个UInt32位掩码,提供了32个时段,但您只需要使用25个(每天5个时段)
[课程编号]和[房间编号]对应于您的Normal和Lab,Courses和Rooms列表。
[正常课程的时段位掩码]限制为2 ^ n(n = 0-24)BitwiseOr 2 ^ m(m = 0-24),其中Floor(n / 5)!= Floor(m / 5)。这等于每周2个独特的日子,每天1个时间段。
[实验室课程的时段位掩码]限制为3 * 2 ^ n(n = 0-3, 5-8, 10-13, 15-18, 20-23),其中Floor(n / 5)!= Floor(m / 5)。这等于每周1天,每天2个连续时段。编辑只需要1天实验室
您的适应函数只是错误得分。当[房间编号A] == [房间编号B] AND([时段位掩码A] BitwiseAnd [时段位掩码B])> 0时,就会出现错误。适应性=(总数-误差)/总数。
编辑:示例编码:
课程编号= 1,房间编号= 2,普通课程时段=星期一第3个时间段和星期五第4个时间段。星期一第3个时间段(2 ^ n,n = 2)。星期五第4个时间段(2 ^ m,m = 23)。 Floor(n / 5)= 0,Floor(m / 5)= 4,因为0和4不相等,这是一个有效的正常课程时段位掩码。
时段位掩码UInt32位索引31到位索引0
(ZZZZZZZ5 43215432 15432154 32154321)
(0000000F FFFFTTTT TWWWWWTT TTTMMMMM)
完整编码课程、房间、时段
00000001b 00000010b 00000000 10000000 00000000 00000100b

非常感谢您的回复。如果可以的话,我能问几个问题吗?首先,通过分别解决实验室和课程,您是指我应该运行两次遗传算法,第一次安排实验室,第二次安排课程,对吗?从我的问题角度来看,这肯定会起作用,谢谢!其次,我想知道为什么要使用Uint32位掩码?我的编码方式不行吗?第三,您所说的24位是指我的课程/实验室的日期和时间段的位掩码应该长达24位吗?(而不是32位?) - Awais Shahid
第四点,您能否详细说明一下如何将位掩码与解决课程问题时每周2个独特的日期和每天1个时间段相对应?我已经试图弄清楚它几个小时了,但是无法理解其背后的逻辑,实验室问题也是如此(此外,实验室不需要在2天内安排,它们只需要在每周的一天安排,但在连续的2个时间段内...这使事情变得简单了,我想)。 - Awais Shahid
然而,在我的这个逻辑中,我需要Loss函数的帮助来安排课程讲座在两天内进行。我认为你的逻辑不需要这个Loss函数,因此使用你的逻辑会是更好的方法,但是我无法完全理解它:/ - Awais Shahid
2
  1. 是的,分别解决它们,然后合并结果。2. UInt32给你足够的空间来处理所有内容。3. 我从未在我的答案中提到“24位”;我使用2的幂符号来显示位掩码的约束条件。 2^0(2的0次方或2^n,其中n = 0)等于索引为0的位(00000001b),字节具有位索引0到7。我添加了一个带有示例编码的编辑。4. 参见(3)。
- Louis Ricci
好的,基本上即使是遗传算法在进化,由交叉和突变生成的新位不会是“完全”随机的,而是我们可以对它们进行“条件”限制,即每个位都必须存在于我们的查找表中,其中包含所有有效的位掩码。我明白了,非常感谢您在这里提供的所有帮助!我也学到了很多新东西! - Awais Shahid
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接