我观看了 Mike Swanson 的这段视频,他需要一种算法来规划 PDC 或 TechED 等大型活动的会议。我正在考虑什么是代表解决方案的最佳方式。他的方法非常简单,他有一个数组,其中将索引映射到时隙空间,解决方案是一个包含这些索引列表的简单数组,其中每个时隙空间元素在被挑选后从数组中删除。
例如,给定 3 个时隙和 3 个房间,这是映射时隙+房间的数组:
0:时隙 0,房间 0
1:时隙 0,房间 1
2:时隙 0,房间 2
3:时隙 1,房间 0
4:时间段 1,房间 1
5:时间段 1,房间 2
6:时间段 2,房间 0
7:时间段 2,房间 1
8:时间段 2,房间 2
假设要安排 9 个会话。示例解决方案是 5,5,2,1,2,3,1,1,0,转换为:
会话 0,时间段 1,房间 2
会话 1,时间段 2,房间 0
会议 2, 时间段 0, 房间 2
会议 3, 时间段 0, 房间 1
会议 4, 时间段 1, 房间 1
会议 5, 时间段 2, 房间 2
会议 6, 时间段 1, 房间 0
会议 7, 时间段 2, 房间 1
会议 8,时间段 0,房间 0
(如果看不清楚,25:30视频很快就解释的很清楚了)
现在,我对遗传算法有了一些经验,如果我错了,我会纠正我,但我一直认为通过交叉和变异个体产生的解决方案必须与产生它的解决方案相似?即,如果我在两个解决方案之间进行交叉,则生成的解决方案必须与生成它的解决方案非常相似(并且对于突变也类似)。进化不就是这样吗?看起来 Mark Swanson 表示解决方案的方式没有考虑到它。
例如在交叉的情况下:
Parent 1: 5,5,2,1,2,3,1,1,0
Parent 2: 0,0,0,0,4,3,2,1,0
Child : 5,5,2,1,4,3,2,1,0(在这种情况下交叉索引为 4)
孩子与父母 1 和 5 与父母 2 有 4 个共同的基因。但是如果您像我上面所做的那样写下实际的解决方案(会话 x,时间段 x,房间 x),您很快就会意识到孩子解决方案有与父母 2 几乎没有共同之处。这不是问题吗?
再比如,对于这次的突变:
突变前:5,5,2,1,2,3,1,1,0
突变后:0,5,2,1,2,3,1,1,0
这个微小的变化导致了实际最终解决方案的 9 次变化中的 6 次。
这些是我提出的实际问题吗?还是没关系,因为遗传算法无论如何都会很好地工作?如果这些都是问题,你能提出更好的解决方案吗?
我的另一个问题是:如果一个会话必须安排多次怎么办?在这种情况下,您将如何表示解决方案?
非常感谢任何帮助。
谢谢!