Моделирование хищник-жертва

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

Prey:

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

Predator:

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

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

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

5 ответов

Решение

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

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

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

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

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

  1. Следите за предполагаемыми движениями каждой жертвы и не позволяйте другой добыче захватывать их.
  2. Проверьте, не заняла ли другая цель место назначения, и ничего не делайте, если так.
  3. Уберите одну из жертв наугад, если они оба попытаются занять одно и то же место.
  4. Пересмотрите варианты перемещения, если пункт назначения занят.

На самом деле не существует "правильного" способа сделать это.

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

-1 - predator
n - preys

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

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

for each prey in preys
    move(prey)
end

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

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

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

Другие вопросы по тегам