我正在尝试实施轮盘赌选择。我已经理解了这个算法:
我不明白的是这对应于这样做:Roulette wheel selection algorithm(44票的回答)。这对我有意义,但不是上面的那个。
使用总和完成以下操作
def choose_parent_using_RWS(genes, S, points):
P = randint(0, int(S))
for x in genes:
P += evaluate(x, points)
if P > S:
return x
return genes[-1]
通过在0和1之间归一化来完成以下操作
def choose_parent_using_RWS(genes, S, points):
P = randint(0, int(S))/S
for x in genes:
P += evaluate(x, points)/S
if P > S/S:
return x
return genes[-1]
在44票的答案中,范围已在0到1之间归一化,这更容易理解,但需要额外的计算步骤。
您可以实施您提到的方法。在计算总和的同时,每个单独的染色体添加其自己的value
,因此当在0和S之间生成随机数时,我们假设如果r在2个数字之间,其范围等于上面提到的value
,则选择其中概率与其适应值成正比。值越大,r在其范围内的概率越大。
例如,假设一个具有23(假设)适应度的染色体是你迭代时的第5条染色体,总和S是130.前4条染色体的总和就是54.所以如果random r
介于两者之间选择55和77(包括两者),选择该染色体。
归一化后,55 / 130~ = 0.423和77/130~ = 0.5923是选择该染色体的随机数r2
(0和1之间)的范围。