【发布时间】:2015-01-09 04:22:01
【问题描述】:
我正在尝试应用 GA 来解决一个问题并且有几个问题。
第一个问题是关于选择的——我在许多实现中看到人口是根据分数/适应度优先选择进行排序的。真的有必要吗?例如,在锦标赛选择中,个人应该被统一挑选,所以排序似乎没有任何意义。或者让我们考虑轮盘赌选择。使用以下实现再次排序似乎是不必要的(伪代码):
totalFitness = sum individuals i.fitness
rouletteValue = totalFitness * random 0.0 1.0
selected = null
i = 0;
while rouletteValue >= 0.0
selected = individuals[i++]
rouletteValue -= selected.fitness
return selected
那么真的有必要对人口进行排序以进行选择吗?
另一个问题是快速收敛:我正在尝试简单 GA,交叉概率为 0.9,变异概率为 0.01,种群大小为 30,初始种群包含“非常好的解决方案”(已知)。交叉总是产生两个后代,所以一个迭代如下(伪代码):
for i = 0 to population-size
mother = select-one population
while father != mother
father = select-one population
if should-crossover crossover-probability
(sister, brother) = apply-crossover mother father
else
sister = copy mother
brother = copy father
if should-mutate mutation-probability
apply-mutation sister
if should-mutate mutation-probability
apply-mutation brother
insert-at new-population i sister
insert-at new-population i+1 brother
i = i + 2
swap new-population population
也由于问题的性质,交叉几乎从来没有提供比父母更好的结果。
所以,粗略地说,发生的事情是因为“好的解决方案”比初始种群中的任何其他解决方案要好得多,它比其他个体更频繁地被选择用于繁殖(假设 30 个体的概率为 0.1)。如果不应用交叉(概率 0.1),那么“好的解决方案”将被转移到新的群体中。因此,由于人口规模为 30,平均交叉被跳过 1.5 对。因此,在 15 次迭代后,跳过了 22 次交叉。现在,由于“好解决方案”的选择概率为 0.1,那么在 22 次跳过的交叉之后,我将在新群体中插入 2 个“好解决方案”。发生这种情况后,“好的解决方案”会迅速扩散。
有什么办法可以解决这个问题吗?
【问题讨论】:
-
在上面的算法中,被选中的个体从
individuals中的位置0开始编号。因此,如果对该集合进行排序(最适合首先),它将选择一个随机数的最适合的个体。如果集合是未排序的(随机顺序),它将选择随机数量的随机个体。 -
在最合适的解决方案上快速收敛有什么问题?
-
关于选择前的排序 - 因为我们统一选择数字 0.05、0.5 和 0.99 是同样可能的,所以如果最适合的个人是第一个,这并不意味着它会被更频繁地选择。重要的是它占据了更大的范围,所以当我们多次选择它时,它有更多的机会被选中。例如,如果我有 3 个概率分别为 0.1、0.2 和 0.7 的人,那么哪个先走应该很重要 - 在选择了例如 10 个随机数之后,最后一个仍然会被更频繁地选择。
-
无论如何,我想我已经找到了关于排序问题的答案 - stackoverflow.com/questions/10531565/…
-
至于收敛 - 这很糟糕,因为解决方案仍然可以改进,我希望得到显着改进
标签: genetic-algorithm evolutionary-algorithm