Случайное разделение населения на 6 - PullRequest
3 голосов
/ 01 августа 2020

Я работаю над алгоритмом диффузии частиц для клеточного автомата на сетке tri angular. Это означает, что каждая ячейка имеет 6 соседей.

Каждая ячейка имеет определенное количество частиц.

Каждая ячейка распространяет свои частицы на соседние ячейки на каждой итерации.

Я у него много проблем с тем, чтобы сделать это эффективно, так как существуют сотни тысяч (а иногда и миллионы) ячеек, каждая с большим количеством частиц n в них (n >> 100).

I ' м ищу алгоритм, который разбивает число случайным образом на 6 частей

Рабочий, но неэффективный подход:

Сгенерировать столько случайных чисел, сколько есть частиц в ячейке, взятых из равномерного распределения на интервале (0,6).

  • Если число находится в (0,1): распространить частицу на соседа 1.
  • Если число находится в (1,2): распространить частицу на соседа 2.
  • Если число находится в (2,3): распространите частицу на соседа 3.
  • et c ...

Это работает для «небольшого» числа частиц (n <50), но получает <strong>очень вычислительных ресурсов.

Мой теоретический подход:

Назовите количество частиц, которые должны быть распределены n.

Сгенерируйте 5 случайных чисел, взятых из нормального (гауссовского) распределения со средним 0 и дисперсией 1. Назовите их числа r0, r1, r2, r3, r4

r0 = n/2 + r0*(n/4) // this transforms r0 to a random number drawn from a normal distribution with mean n/2 and variance n/2

r0 эффективно разделяет популяцию из n частиц на две группы, каждая из которых будет распределена между тремя соседями. Один размером r0, другой размером n - r0

r1 = r0/3 + r0*(r0/9) // this transforms r1 to a random number drawn from a normal distribution with mean r0/3 and variance r0/3

r1 эффективно разделяет популяцию частиц r0 на две группы, одна из которых распределяется между одним соседом, а другая - двумя соседями. Первая имеет размер r1, вторая - размер r0 - r1

r2 = (r0 - r1)/2 + r2*((r0 - r1)/4) // this transforms r2 to a random number drawn from a normal distribution with mean (r0 - r1)/2 and variance (r0 - r1)/2

r2 эффективно разделяет популяцию (r0 - r1) частиц на две группы, каждая из которых должна быть распределена между одним соседом.

Числа r0, r1 и r2 теперь должны быть разделены на 3 случайные части из совокупности n частиц, каждая в соответствии с нормальным распределением.

Продолжайте тем же способом, разделяя совокупность (n - r0) на три части.

Этот подход кажется мне разумным, но я считаю, что мои дисперсии здесь могут быть очень далекими, поэтому я получаю странные результаты, когда слишком много частиц «отщепляется» от одной группы соседей, и ни одна не остается. для других соседей. Это вводит странно выглядящие эффекты анизотропии c.

Предпосылки: Комбинация множества однородных распределений хорошо аппроксимируется гауссовым. Этот алгоритм представляет собой попытку изменить алгоритм, описанный Бастиеном Чопардом в главе 5.7 «Моделирование физических систем клеточными автоматами»

Любая помощь в обнаружении ошибки в моем подходе или в другом, был бы очень признателен такой же эффективный.

Я не указал язык, на котором я кодирую, потому что я просто ищу алгоритм в целом. Я использую java (Processing 3.5), но если вы можете предоставить текст на любом языке, меня это устраивает.

1 Ответ

3 голосов
/ 01 августа 2020

Насколько я могу судить из обзора литературы, современным уровнем техники является алгоритм, созданный Брауном и Бромбергом («Эффективная двухэтапная процедура для генерации случайных величин из полиномиального распределения», 1983 г.), который специализируется на вашей проблеме следующим образом.

Для некоторой константы c выборка шести независимых Пуассона изменяется со скоростью cn. Если их сумма больше n, перерисовывайте их, пока их сумма не станет меньше или равна n. Распространяйте частицы в соответствии с этими вариациями, а остальные распространяйте, используя свой неэффективный подход. c должно быть примерно в 1/6; слишком высоко, и мы рисуем вариации слишком много раз, слишком низко, и мы делаем слишком много работы для неэффективного алгоритма. слишком много работать, чтобы снизить затраты на настройку для рисования вариаций Пуассона. Для каждого возможного n настройте с помощью псевдоним метода для выборки усеченного распределения Пуассона со скоростью cn при условии, что результат не превышает n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...