我看了Mike Swanson的this video,他需要一个算法来计算像PDC或TechED这样的重大事件的会话。我在想什么是代表解决方案的最佳方式。他的方法非常简单,他有一个数组,他将索引映射到时间段,解决方案是一个包含这些索引列表的简单数组,其中每个时间段元素在被选中后从数组中删除。 / p>
例如,给定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代表解决方案的方式并没有考虑到这一点。
例如,在交叉的情况下:
父1:5,5,2,1,2,3,1,1,0
父2:0,0,0,0,4,3,2,1,0
子:5,5,2,1,4,3,2,1,0(在这种情况下交叉指数为4)
孩子有4个与父母1共同的基因,5个与父母2有共同点。但如果你写下我上面所做的实际解决方案(会话x,时间段x,房间x),你会很快意识到儿童解决方案与父母2几乎没有任何共同点。这不是问题吗?
另一个例子,这次突变:
突变前:5,5,2,1,2,3,1,1,0
突变后:0,5,2,1,2,3,1,1,0
这个小小的变化导致了实际最终解决方案中9个变化中的6个。
这些是我提出的实际问题吗?或者无所谓,因为遗传算法无论如何都会运作良好?如果这些都是问题,你能提出更好的解决方案吗?
我的另一个问题是:如果会话必须多次安排怎么办?在这种情况下,您将如何代表解决方案?
非常感谢任何帮助。
谢谢!