我一直在研究一种算法,我需要从大小为 k 的群体中选择 n 个个体,其中 k 比 n 大得多。所有个体都有适应度值,因此选择时应优先考虑较高的适应度值。然而,我不想简单地选择最好的n个人,最差的人也应该有机会。 (自然选择)
因此,我决定找到人群中的最小和最大适应度值。所以,任何一个人都会有
p =(电流 - 最小值)/(最大值 - 最小值)
概率被选择,但我不能只是迭代所有的人,掷骰子并选择一个如果概率成立的话,因为那样我最终会得到超过 n 个个体。我可以打乱列表并从前面迭代,直到获得最多 n 个个体,但这可能会错过列表末尾的重要个体。
我还可以执行多次传递,直到剩余的种群数量达到 n。但这可能会更倾向于更好的选择,并收敛到我提到的朴素选择方法。
对这样的选择过程有何建议或参考?如果您可以参考的话,我可以阅读一些相关的统计方法。
Thanks.
Use 轮盘赌选择 http://en.wikipedia.org/wiki/Fitness_proportionate_selection。基本思想是根据概率大小分配轮盘赌轮的区域:
然后你只需旋转它n
时间来选择您想要的人。
ruby 中的示例实现:
def roulette(population, n)
probs = population.map { |gene| gene.probability } # TODO: Implement this
selected = []
n.times do
r, inc = rand * probs.max, 0 # pick a random number and select the individual
# corresponding to that roulette-wheel area
population.each_index do |i|
if r < (inc += probs[i])
selected << population[i]
# make selection not pick sample twice
population.delete_at i
probs.delete_at i
break
end
end
end
return selected
end
注意:如果您是 Ruby 黑客,您会发现使用更多 Rubyism 代码可能会更短,但我希望算法尽可能清晰。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)