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