我正在编写一个自动大学类(class)表组合应用程序,并将其用于此遗传算法。但现在我在实现方面遇到了一些问题。
一开始我假设我们的类(class)持续时间为 1 个时隙(时隙 = 1 小时),我们可以简单地将其放入数组中(表示时间表网格:一维数组,容量为 numberOfRooms*numberOfDays* numberOfTimeslots) 并且可以毫无问题地执行变异和交叉。
但我知道我想改进应用程序并允许上课时长为多个时隙。随之而来的是很多问题:
我们如何将一个类对象放入数组中并填充类必须占用的所有槽(多个数组单元格)(一个对象 - 多个单元格)? 而按照我们将如何放入数组中,如何进行变异和交叉操作呢? 提前致谢!非常感谢您的帮助!
最佳答案
一个好的规则可能是只跨越具有相同时隙的类(class)。例如,您可以将一个占用两个时间段的类(class)与两个占用一个时间段的类(class)交叉。
要表示具有多个时隙持续时间的类,最简单但棘手的方法是为每个时隙设置一个标志,告诉您该时隙是被新类占用还是只是之前开始的类的延续.当你穿越时,你会看到那个标志,以确保你没有穿越部分类(class)。
另一种(更好的)方法是创建更复杂的数据结构:DailyRoomOccupation
。该数据结构将包含:
- 房间的每日容量,以时段数表示;
- 当天在该房间安排的类(class)的(双链接)列表;
- 一个函数,用于计算列表中的类是否适合时间段;
- 允许跨越两个不同的
DailyRoomOccupation
的函数,负责只跨越相同数量的时间段。
关于algorithm - 类(class)表组合的遗传算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10126814/