python随机歪斜

时间:2013-03-07 19:58:57

标签: python random skew

我正在尝试为一个生物模拟器创建一个非常简单的进化算法,我想要的是,这两个生物都有一个特征和一个优势等级,两者都以整数注释。他们孩子的特质将是生物A的特质和生物B的特征之间的随机数,然后偏向更显性的特征。因此,如果A的特征为5且优势为2且B的特征为10且优势为7,则他们的孩子更有可能具有8比6的特征。是否有一个好方法可以做到这一点?

1 个答案:

答案 0 :(得分: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。]

在python中:

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