【问题标题】:Convert uniform random generation to binomial将均匀随机生成转换为二项式
【发布时间】:2016-08-14 15:51:26
【问题描述】:

我编写了以下函数来在我的genetic algorithm 项目中实现一种突变(creep)。由于我使用了 java 的内置随机生成库,所以得到每个index 的概率是一致的。我被要求修改函数,使其使用二项分布而不是均匀分布。据我用谷歌搜索,我找不到任何演示将统一转换为二项式的示例/教程。如何实现?

int mutationRate = 0.001;
public void mutate_creep() {
    if (random.nextDouble() <= mutationRate) {

        // uniform random generation
        int index = random.nextInt(chromoLen); 

        if(index%2 == 0) { // even index
            chromo[index] += 1;
        } else { // odd index
            chromo[index] -= 1;
        }
    }
}

注意:我已经在A efficient binomial random number generator code in Java 看到了解决方案。由于我这里的问题是特定于creep mutation algorithm,我不确定如何直接应用它。

【问题讨论】:

  • @pjs 我了解到您已经回答了重复标记的问题。仅供参考,我已经看过了,我不能直接在我的情况下使用它,因为我专门为creep mutation algorithm 需要它。所以请取消标记重复标志,如果可以的话,请在这里回答我的问题。
  • 二项式是二项式,链接的答案告诉您如何获得这些。按照目前的措辞,您的问题重复的。听起来您的问题不是如何生成二项式,而是如何在蠕变算法中使用它。
  • 您是否打算在指定索引处翻转位?如果是这样,你的逻辑是错误的。假设您选择索引 4 并且 chromo[4] 的值当前为 1,您将其更新为 2。如果您的目标是翻转位,请使用 chromo[index] ^= 1; 而不管偶数/奇数索引。
  • 我仍然认为您没有充分阐明您的问题以获得有意义的答案。二项分布是一种计数分布,它描述了在执行n 独立试验时观察到的“成功”次数,每个试验都有p 成功的概率。您打算如何使用该计数?

标签: java algorithm math distribution genetic-algorithm


【解决方案1】:

根据Wikipedia,你这样做:

从二项分布生成随机样本的一种方法是使用反演算法。为此,必须计算从 0 到 n 的所有值 k 的 P(X=k) 的概率。 (这些概率的总和应该接近 1,以包含整个样本空间。)然后通过使用伪随机数生成器在 0 和 1 之间均匀生成样本,可以将计算的样本 U[0,1]使用第一步计算的概率转换成离散数字。

我将留给您“计算从 0 到 n 的所有值 k 的概率 [...]”。之后是加权分布。

您可以使用TreeMap 来做到这一点,类似于我在this answer 中的显示方式。

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2010-12-04
    • 2013-12-09
    相关资源
    最近更新 更多