1

我正在尝试为生物模拟器创建一个非常简单的进化算法,我想要的是,两种生物都有一个特征和一个优势级别,两者都由整数记录。他们孩子的特质将是生物 A 的特质和生物 B 的特质之间的一个随机数,然后偏向更占优势的一方。因此,如果 A 具有 5 的特质和 2 的优势,而 B 具有 10 的特质和 7 的优势,他们的孩子更有可能拥有 8 的特质而不是 6。有没有好的方法来做到这一点?

4

1 回答 1

0

你可能不想要你所描述的那样,因为人口会收敛得太快。那是因为您要求的孩子总是介于父值之间。所以极端值会很快消失。

更有可能的是,您想要的是一个具有固定噪声量的数字,但以您描述的计算值为中心。这很容易做到——中心只是一个加权平均值。

例如,假设特征是 T1 和 T2,优势值是 D1 和 D2。孩子特征的中心值是 TC:

TC = (D1 * T1 + D2 * T2) / (D1 + D2)

然后你会添加一些噪音,同样正面或负面,最后转换为整数。

[顺便说一句,只是为了说明上述内容是有道理的:您可以看到,如果优势相等,则 D1=D2 则上面变为

TC = (T1 + T2) / 2

如您所料,这是平均值。如果 D1 比 D2 大得多,那么

TC ~ T1

这也符合预期,因为那时 1 占主导地位 2。]

在蟒蛇中:

from random import uniform

delta = 2 # the amount of noise

def child(t1, d1, t2, d2):
    tc = float(d1 * t1 + d2 * t2) / float(d1 + d2)
    tc += uniform(-delta, delta)
    return int(0.5 + tc) # convert to int unbiased

如果我用你作为例子的数字运行几次:

>>> child(5, 2, 10, 7)
7
>>> child(5, 2, 10, 7)
11
>>> child(5, 2, 10, 7)
8
>>> child(5, 2, 10, 7)
9

看起来是对的。请注意,该值并不强制介于父值之间 - 在一种情况下它是 11 - 但正如预期的那样,它以 8 附近的某个位置为中心。

最后,delta随着种群的稳定,您可能会慢慢减少(一种模拟退火)。

于 2013-03-07T22:28:04.793 回答