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