Моделирование хищник-жертва
Я пытаюсь реализовать модель хищник-жертва. Это агентная модель. Каждые несколько миллисекунд это новый ход. На поле есть два типа существ: хищник и жертва. Поведение каждого из них определяется следующими правилами:
Prey:
- Только что переехал в незанятую камеру
- Каждые несколько шагов создает потомство в своей старой камере
- Ожидаемая продолжительность жизни ограничена количеством ходов
Predator:
- Хищник движется в камеру с добычей. Если таких ячеек нет, то в любой свободной соседней ячейке
- Так же
- Так же
У меня проблема с выбором хода добычи.
Например, у меня есть жертвы в ячейках 5 и 9. Каждая из них может переместиться в ячейку 6. Как я могу разрешить этот конфликт? Спасибо
5 ответов
Используйте асинхронное обновление. Перебирайте добычу в произвольном порядке, заставляя их поочередно решать, в какую клетку им следует перейти.
Это общий подход в моделировании. Он имеет дополнительное преимущество в том, что устраняет предельные циклы в динамике.
Сколько времени занимает "переезд"? Если вы перемещаете одно, то после перемещения жертвы вы перемещаете следующее, конфликта нет. Добыча просто увидит, что пространство уже занято, и переместится в другое место.
Если для перемещения требуется время, вы можете сказать, что жертва следит друг за другом и смотрит, пытается ли какая-то другая жертва куда-то двигаться (например, люди смотрят машины в движении). Затем вы изменили бы статус целевого поля на "зарезервировано для 5", когда добыча из 5 пытается переместиться туда. Тогда жертва из 9 может увидеть это и решить, хотят ли они столкнуться с 5 (может быть интересно:P) или избегать 5.
Существует несколько способов, в зависимости от того, решаете ли вы и переходите в два этапа или один и т. Д.
- Следите за предполагаемыми движениями каждой жертвы и не позволяйте другой добыче захватывать их.
- Проверьте, не заняла ли другая цель место назначения, и ничего не делайте, если так.
- Уберите одну из жертв наугад, если они оба попытаются занять одно и то же место.
- Пересмотрите варианты перемещения, если пункт назначения занят.
На самом деле не существует "правильного" способа сделать это.
Зависит от игровой логики. Если жертвы могут находиться в одной и той же ячейке, просто используйте индикатор, показывающий количество жертв. Если вы используете 2D-массив для представления текущего состояния поля, вы можете использовать такие коды:
-1 - predator
n - preys
n> = 0, (n = 0 - ячейка пуста, n = 1 ячейка содержит 1 жертву и т. д.).
В противном случае (если жертвы не могут появляться в одной и той же ячейке), используйте пошаговую стратегию. Сохраните все свои жертвы в массиве или дайте номер каждой жертве. В этом случае ходы preys представляют собой простой цикл (псевдокод):
for each prey in preys
move(prey)
end
Логика куда движется описывает алгоритм движения вашей добычи.
Смотрите этот связанный вопрос и мой ответ. Описывает хороший механизм обнаружения столкновений.