Я работаю над алгоритмом диффузии частиц для клеточного автомата на сетке 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), но если вы можете предоставить текст на любом языке, меня это устраивает.