我正在尝试实现轮盘赌选择。我已经理解了这个算法:
- 计算种群中所有染色体适应度的总和 S
- 从区间 (0,S) 生成一个随机数 r
- 从 0 到 S 循环遍历种群和适应度,这是部分和,称为 P。
- 当P > S:停止并返回对应的染色体。
我不明白这与这样做有何对应:轮盘赌选择算法 (44 票的答案)。这对我来说很有意义,但不是上面的那个。
我正在尝试实现轮盘赌选择。我已经理解了这个算法:
我不明白这与这样做有何对应:轮盘赌选择算法 (44 票的答案)。这对我来说很有意义,但不是上面的那个。
以下是使用 sum 完成的
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 之间)的范围。