2016-08-14 3 views
1

Я написал следующую функцию для реализации типа мутации (creep) в моем проекте genetic algorithm. Поскольку я использовал встроенную библиотеку случайных поколений java, вероятность получения каждого index является единообразной. Меня попросили изменить функцию таким образом, что она использует биномиальное распределение вместо равномерного. Насколько я искал Google, я не мог найти ни одного примера/учебника, демонстрирующего преобразование униформы в биномиальный. Как мне это достичь?Преобразование однородной случайной генерации в биномиальную

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] (http://stackoverflow.com/questions/23561551/a-efficient-binomial-random-number-generator-code-in-java) – pjs

+0

@ pjs Я понимаю, что вы ответили на дублированный помеченный вопрос. FYI, я уже видел это, и я не могу использовать его в своей ситуации напрямую, поскольку мне это нужно специально для алгоритма алгоритма ползучести. Поэтому, пожалуйста, отмените флаг дублирования и ответьте на мою проблему здесь, если вы можете. – DhiwaTdG

+0

Биномальный битномиал, и связанный ответ подсказывает, как их получить. Как сказано в настоящее время, ваш вопрос * * является дубликатом. Похоже, ваша проблема заключается не в том, как генерировать биномиальную, а в том, как использовать ее в алгоритме ползучести. – pjs

ответ

0

Согласно Wikipedia, вы делаете это:

Один способа генерации случайных выборок из биномиального распределения использовать алгоритм инверсии. Для этого нужно вычислить вероятность того, что P (X = k) для всех значений k от 0 до n. (Эти вероятности должны суммироваться до значения, близкого к единице, чтобы охватить все пространство выборки.) Затем, используя генератор псевдослучайных чисел для равномерного формирования выборок между 0 и 1, можно преобразовать вычисленные выборки U [0,1] в дискретные числа, используя вероятности, вычисленные на первом этапе.

Я оставлю его вам, чтобы «рассчитать вероятность [...] для всех значений k от 0 до n». После этого это взвешенное распределение.

Вы можете сделать это с помощью TreeMap, как показано в this answer.

Смежные вопросы