2013-03-07 84 views
1

我想为一个生物模拟器创建一个非常简单的进化算法,我想要的是,这两个生物都有一个特征和一个优势等级,两者都以int表示。他们的孩子的特质将是生物A的特质与生物B的特质之间的随机数,然后偏向更占优势。所以如果A的性状为5,支配度为2,B的特质为10,支配度为7,那么他们的孩子更有可能具有8比6的特征。有没有一种好的方法来做到这一点?蟒蛇随机歪斜

回答

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