【发布时间】:2012-10-01 08:47:00
【问题描述】:
我观看了 Mike Swanson 的 this video,他需要一种算法来规划 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 表示解决方案的方式似乎没有考虑到它。
例如,在交叉的情况下:
父 1:5,5,2,1,2,3,1,1,0
父级 2:0,0,0,0,4,3,2,1,0
Child:5,5,2,1,4,3,2,1,0(本例中交叉索引为4)
孩子与父母 1 有 4 个基因,与父母 2 有 5 个基因。但是,如果您像我在上面所做的那样写下实际的解决方案(会话 x,时间段 x,房间 x),您很快就会意识到子解决方案与父 2 几乎没有共同之处。这不是问题吗?
另一个例子,这次的突变:
突变前:5,5,2,1,2,3,1,1,0
突变后:0,5,2,1,2,3,1,1,0
这个微小的变化导致实际最终解决方案的 9 次变化中有 6 次发生变化。
这些是我提出的实际问题吗?还是没关系,因为遗传算法无论如何都会很好地工作?如果这些是问题,您能提出更好的解决方案吗?
我的另一个问题是:如果一个会话必须安排多次怎么办?在这种情况下,您将如何表示解决方案?
非常感谢任何帮助。
谢谢!
【问题讨论】:
-
确实,交叉运算符会破坏第二个父节点的输入——但这可能不是很重要!如果变异算子只稍微扰乱解决方案,你甚至不需要交叉爬山到一个好的解决方案,但是偶尔的“严重变异”(这就是这个交叉有效的)可以帮助你避免陷入困境局部最优。
-
我同意@satoshi 的观点,这对于遗传算法来说似乎是一个糟糕的模型。对简短的“好想法”进行有意义的重组是进化计算的本质;无向突变不能有效地处理解空间。
标签: algorithm scheduling genetic-algorithm heuristics