0

我正在尝试实现轮盘赌选择。我已经理解了这个算法:

  1. 计算种群中所有染色体适应度的总和 S
  2. 从区间 (0,S) 生成一个随机数 r
  3. 从 0 到 S 循环遍历种群和适应度,这是部分和,称为 P。
  4. 当P > S:停止并返回对应的染色体。

我不明白这与这样做有何对应:轮盘赌选择算法 (44 票的答案)。这对我来说很有意义,但不是上面的那个。

4

2 回答 2

0

以下是使用 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]
于 2019-02-14T14:33:25.073 回答
0

在 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 之间)的范围。

于 2019-02-13T08:52:27.453 回答