【问题标题】:python random with a skewpython随机倾斜
【发布时间】:2013-03-07 19:58:57
【问题描述】:

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

【问题讨论】:

    标签: python random skew


    【解决方案1】:

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

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

    例如,假设特征是 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(一种模拟退火)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      相关资源
      最近更新 更多