我一直致力于算法,我需要从大小为k的群体中选择n个个体,其中k比n大得多。所有个体都具有适应值,因此选择应该有利于更高的适应值。但是,我不想简单地选择最好的个人,更糟糕的也应该有机会。 (自然选择)
所以,我决定在人口中找到最小和最大适应度值。所以,任何人都会有
p =(当前 - 最小)/(最大 - 最小)
被选中的概率,但我不能只迭代所有这些,掷骰子并在概率成立时选择一个,因为那样我最终会有超过n个人。我可以随机播放列表并从前面迭代,直到我获得最多n个人,但这可能会错过列表末尾的好人。
我还可以执行多次传球,直到剩余的人口规模达到n。但是这可能会有利于更好的那些,并且转向我提到的天真的选择方法。
是否有任何建议或对此类选择过程的引用?如果您可以参考,我可以阅读相关的统计方法。
感谢。
答案 0 :(得分:6)
使用Roulette-wheel 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时代码可能会更短,但我希望算法尽可能清晰。