Моделирование хищник-жертва - PullRequest
5 голосов
/ 20 января 2012

Я пытаюсь реализовать модель хищник-жертва. Это агентная модель. Каждые несколько миллисекунд это новый ход. На поле есть два типа существ: хищник и жертва. Поведение каждого из них задается следующими правилами:

Prey:

  1. Только что переехал в незанятую ячейку
  2. Каждые несколько шагов создают потомство в своей старой камере
  3. Продолжительность жизни ограничена количеством ходов

Хищник:

  1. Хищник перемещается в клетку с добычей. Если таких клеток нет, в любом свободная соседняя клетка
  2. То же самое
  3. То же самое

У меня проблема с выбором хода добычи. Prey

Например, у меня есть жертвы в клетках 5 и 9. Каждый из них может перейти в ячейку 6. Как я могу решить этот конфликт? Спасибо

Ответы [ 5 ]

4 голосов
/ 20 января 2012

Использовать асинхронное обновление. Перебирайте добычу в случайном порядке, заставляя их поочередно решать, в какую клетку им следует перейти.

Это обычный подход в симуляции. Это имеет дополнительное преимущество в том, что устраняет предельные циклы в динамике.

0 голосов
/ 20 января 2012

Смотрите этот связанный вопрос и мой ответ. Описывает хороший механизм обнаружения столкновений.

Избегайте сложности O (n ^ 2) при обнаружении столкновений

0 голосов
/ 20 января 2012

Зависит от игровой логики. Если жертвы могут находиться в одной и той же ячейке, просто используйте индикатор, показывающий количество жертв. Если вы используете 2D-массив для представления текущего состояния поля, вы можете использовать такие коды:

-1 - predator
n - preys

n> = 0, (n = 0 - ячейка пуста, n = 1 ячейка содержит 1 жертву и т. Д.).

В противном случае (если жертвы не могут появляться в одной и той же ячейке), используйте пошаговую стратегию. Сохраните все ваши жертвы в массиве или дайте номер каждой жертве. В этом случае ходы preys представляют собой простой цикл (псевдокод):

for each prey in preys
    move(prey)
end

где логика перемещения описывает алгоритм движения вашей добычи.

0 голосов
/ 20 января 2012

Существует несколько способов, в зависимости от того, решаете ли вы и перемещаетесь ли двумя шагами или одним и т.д.

Проверьте, занята ли еще одна жертва, и ничего не делайте, если это так. Удалите одну из жертв наугад, если они оба попытаются занять одно и то же место.* Пересмотрите варианты перемещения, если пункт назначения занят.

На самом деле нет «правильного» способа сделать это.

0 голосов
/ 20 января 2012

Сколько времени занимает "переезд"?Если вы перемещаете одну, то после перемещения жертвы вы перемещаете следующую, конфликта нет.Добыча просто увидит, что пространство уже занято, и переместится в другое место.

Если перемещение требует времени, вы можете сказать, что жертва следит друг за другом и смотрит, пытается ли какая-то другая добыча куда-то двигаться (как люди наблюдают)авто в пробке).Затем вы изменили бы статус целевого поля на «зарезервировано для 5», когда добыча из 5 пытается переместиться туда.Тогда добыча из 9 может увидеть это и решить, хотят ли они столкнуться с 5 (может быть интересно: P) или избегать 5.

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