与我的轮盘选择方法相比,如何更好地评估更好的后代?

时间:2016-10-22 18:50:01

标签: genetic-algorithm evolutionary-algorithm

我正在玩基因编程算法,我想知道如何通过替换或改进我选择哪一个会重现的方式来增值并确保我的最佳示例更多。目前我使用的方法如下:

function roulette(population)
    local slice = sum_of_fitnesses(population) * math.random()
    local sum = 0
    for iter = 1, #population do
        sum = sum + population[iter].fitness
        if sum >= slice then
            return population[iter]
        end
    end
end

但是我不能让我的人口达到一定的平均适应度,我担心这是因为不太合适的成员与更适合的成员一起复制,从而继续传播他们的弱基因。

那么如何改进我的轮盘选择方法呢?或者我应该使用完全不同的健身比例选择器?

1 个答案:

答案 0 :(得分:1)

这里有几个问题。

您正在根据其适应度选择个体复制的概率,因此您正在使用的适应度函数需要夸大细微的差异,否则健康状况的轻微下降并不是那么糟糕。例如,如果适应度从81下降到80,这种变化可能在系统的噪声范围内,并且不会对进化产生太大的影响。如果由于选择性压力不够强大而需要进行一系列微小变化,那么几乎不可能爬到非常高的适应度。

解决这个问题的方法是使用锦标赛选择等方法。在它最简单的形式中,每当你想选择另一个人出生时,你就会选择K个随机个体(K是已知的和“锦标赛大小”)。您可以计算出每个人的健康状况,以及复制最高适应度的人。如果健身差异是81对80或者10000和2对比没关系,因为它只需要最高的适应度。

现在问题是:你应该把K设置为什么? K可以被认为是选择的力量。如果你把它设置得很低(例如,K = 2),那么许多低健身的人将会幸运地溜走,与其他低健身的人竞争。你将获得很多的多样性,但很少有部分。另一方面,如果你将K设置为高(比如,K = 100),你总是会选择人口中最高的一个,确保人口平均值更接近最大值,而且降低人口多样性。

这里的具体权衡取决于具体问题。我建议尝试不同的选项(包括您的原始算法)以及一些不同的问题,看看会发生什么。例如,尝试所有问题:潜在的解决方案是位串,而适应性只是1的数字。如果您的选择较弱(如在原始示例中,或者K = 2),您将看到它从未完全达到完美的全部解决方案。

那么,为什么不总是使用高K?好吧,考虑一个问题,其中一个是负面的,除非它们出现在一个连续四个(或八个,或多个)的块中,当它们突然变得非常积极时。这样的问题是“欺骗性的”,这意味着你需要探索看起来很糟糕的解决方案,以便找到好的解决方案。如果你将选择的强度设置得太高,那么你永远不会收集三个最终突变,给你第四个。

存在许多更高级的技术,使用您可能想要查看的锦标赛选择。例如,随着时间的推移,甚至在人口中改变K,选择使用低K的一些个体和使用高K的其他个体。如果您计划构建更好的算法,则值得阅读更多。