Я пытаюсь закодировать полиномиальный алгоритм, который будет в основном применять биномиальное распределение к каждому значению входного вектора, зная значения всех предыдущих. Это направлено здесь на создать новую популяцию для нескольких аллелей зная начальную популяцию.
Чтобы добиться этого, я использую этот рекурсивный алгоритм:
Вот как выглядит мой код прямо сейчас:
void RandomNumbers::multinomial(std::vector<unsigned int>& alleleNumbers) {
/* In this function we need two different records of the size.
* We need the size from the old populations, ( N - n1 - ... - nA )
* and we also need the size from the newly created population,
* ( N - k1 - ... - kA ).
* In order to achieve such a task, we'll use the integer "temp" to store
* the value n1 before modifying it to k1 and so on.
*
*
*/
double totalSize = 0;
for(auto n : alleleNumbers) totalSize+=n;
double newTotalSize(totalSize);
std::cout<< newTotalSize;
for(size_t i = 0; i < alleleNumbers.size(); ++i){
size_t temp = alleleNumbers[i];
alleleNumbers[i] = binomial(newTotalSize,
(alleleNumbers[i])/(totalSize));
newTotalSize-= alleleNumbers[i];
totalSize = temp;
}
}
Но я совсем не уверен в этом, и мне было интересно, существует ли уже существующий многочленный алгоритм такого рода …
Большое спасибо.
Вы можете попробовать использовать научную библиотеку GNU gsl_ran_multinomial
команда.
Функция называется как:
gsl_ran_multinomial (const gsl_rng * r, size_t K, unsigned int N, const double p[], unsigned int n[])
где (n_1, n_2, ..., n_K)
являются неотрицательными целыми числами с sum_ {k = 1} ^ K n_k = N, и (p_1, p_2, ..., p_K)
распределение вероятностей с sum(p_i) = 1
, Если массив p[K]
не нормализуется, тогда его записи будут рассматриваться как весовые коэффициенты и соответственно нормализуются. Массивы n[]
а также p[]
оба должны быть длины K
,
Функция реализует условный биномиальный метод из книги С. С. Дэвиса «Компьютерное генерирование полиномиальных случайных величин» (Comp. Stat. Data Anal. 16, 1993. ссылка на сайт), чтобы вы могли реализовать, используя этот подход. Дайте мне знать, если вам нужна копия документа.
Других решений пока нет …