2016-08-14 5 views
1

私のgenetic algorithmプロジェクトで、あるタイプの突然変異(creep)を実装するために、次の関数を書いています。私はjavaの組み込みランダム生成ライブラリを使用しているので、すべてindexを得る確率は一様です。私は、ユニフォームの代わりに二項分布を使うように関数を変更するように求められてきました。私がグーグルで行った限り、私はuniform/binomialへの変換を示すサンプル/チュートリアルを見つけることができませんでした。どのように達成するのですか?一様乱数生成を二項式に変換する

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に固有なので、どのように直接適用できるかはわかりません。

+0

[Javaの効率的な2項乱数ジェネレータコード]の可能な複製(http://stackoverflow.com/questions/23561551/a-efficient-binomial-random-number-generator-code-in-java) – pjs

+0

@ pjs私はあなたが重複したマークされた質問に答えたことを理解します。参考までに、私はすでにそれを見てきました。私はそれを私の状況で直接使用することはできません。私はそれを 'creep mutation algorithm'のために必要としています。ですから、複製フラグを解除して、私の問題をここに答えてください。 – DhiwaTdG

+0

二項関係は二項式であり、リンクされた答えはそれらを得る方法を示します。現在言いましたように、あなたの質問は*重複しています。あなたの問題のような音は二項演算を生成する方法ではなく、あなたのクリープアルゴリズムでそれを使う方法です。 – pjs

答えて

0

Wikipediaによると、あなたは、次の操作を行います。二項分布からのランダムサンプルを生成するために

一つの方法は、反転アルゴリズムを使用することです。そうするためには、0からnまでのすべての値kについてP(X = k)の確率を計算しなければならない。 (これらの確率は、サンプル空間全体を包含するために、1に近い値に合計する必要があります)。次に、疑似乱数ジェネレータを使用して0と1の間で一様にサンプルを生成することによって、計算されたサンプルU [0,1]ステップ1で計算された確率を使用して離散数に変換します。

「0からnまでのすべての値kに対して確率[...]を計算する」に任せます。その後、体重計の分布になります。

this answerと同じように、TreeMapを使用してこれを行うことができます。