Равномерно распределяет запах в матрице совместной диффузии - PullRequest
1 голос
/ 25 марта 2012

Я впервые пытаюсь реализовать метод совместной диффузии, и у меня возникла проблема. Я понимаю, как создавать препятствия, не распространяющие запахи, и как ослаблять запах других дружественных агентов, если один из них уже преследует его. Что я не могу понять, так это как я делаю ароматы, чтобы равномерно распределять их в матрице. Мне кажется, что каждый способ итерации в матрице определяет запах для более быстрого и лучшего распределения в плитках, которые я проверяю позже в итерации. Я имею в виду, что если я буду выполнять итерацию от i до maxRows и от j до maxCols, а затем я применю уравнение диффузии в каждом тайле, то с «северной» и «западной» стороны цели у меня будет только один тайл с правильным потенциалом, тогда как в с «восточной» и «южной» стороны у меня их будет больше, поскольку их соседи уже имеют назначенный потенциал. Как сделать так, чтобы значения распределялись равномерно? Двойная итерация как от конечностей матрицы, так и от их объединения результатов выглядит как пожиратель памяти, как и целенаправленный подход, поскольку, если я попытаюсь начать с целей и обойти их, мне придется выполнить вычисления для каждая цель и каждый тайл с назначенным потенциалом, что означает, что мне придется делать это в течение 4 ^ (ход с момента начала распространения) * nrOfGoals больше каждый ход, что кажется неэффективным в большой матрице с большим количеством целей.

Мой вопрос заключается в том, как эффективно распределить значения в матрице равномерно. Я использую муравьев AiChallenge, если это поможет!

Я благодарю вас в ожидании и извиняюсь за грамматические ошибки, которые я допустил в этом посте.

1 Ответ

0 голосов
/ 30 июня 2012

Возможно, есть лучшее решение, но самый простой способ сделать это - использовать что-то похожее на простую реализацию игры жизни.

У вас есть два буфера. Один из них имеет текущее «поколение» ароматов (и, если вы делаете многозадачность, его можно заблокировать, чтобы на него могли смотреть только читатели) ... а у другого вычисляется отправленное следующее поколение. Вы только «смешиваете» ароматы текущего поколения.

Как только вы закончите, вы поменяете местами два буфера, просто изменив указатели / ссылки.

Еще один способ подумать об этом - заставить все плитки вычислять их новые отправленные, задавая их соседям и усредняя. Когда их соседи спрашивают, каков их уровень запаха, они сообщают свои предварительно рассчитанные значения из предыдущего прохода. Новое отправленное блокируется только после того, как все закончат вычисления.

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