Реализация базовой симуляции хищник-жертва - PullRequest
2 голосов
/ 06 марта 2011

Я пытаюсь реализовать симуляцию хищник-жертва, но столкнулся с проблемой.Хищник ищет ближайшую добычу и ест ее.Если рядом нет жертвы, они перемещаются в случайную свободную ячейку.
По сути, у меня возникают проблемы, когда я продвигаю «поколение».
Скажем, у меня есть сетка 3х3, с каждойячейка пронумерована от 0 до 8.
Если у меня есть 2 хищника в 0 и 1, проверяется первый хищник 0, он перемещается либо в ячейку 3, либо в 4
Например, если он попадает в ячейку 3, то он идетчтобы проверить хищника 1. Это может показаться правильным, но это как бы «отдает приоритет» организмам с более низкими значениями индекса. Я пытался использовать 2 массива, но это тоже не работает, так как это проверяет места, гдеорганизмы есть, но не являются.._.
У кого-нибудь есть идеи, как сделать это «честно» и «правильно?»

Ответы [ 4 ]

2 голосов
/ 06 марта 2011

Я недавно сделал похожую задачу в Java.Обработка хищников, начиная с верхнего ряда до нижнего, не только дает «несправедливое преимущество» для понижения индексов, но и создает закономерности в движении как жертв, так и хищников.

Я преодолел эту проблему, выбрав и строку, и столбцыв случайном порядке.Таким образом, каждый хищник / жертва имеет одинаковую вероятность быть обработанным на ранних этапах поколения.

Способ рандомизации - создание связанного списка из (row,column) пар.Затем перемешайте связанный список.В каждом поколении выбирайте случайный индекс для начала и продолжайте обработку.

2 голосов
/ 06 марта 2011

Больше в качестве комментария, чем что-либо еще, если ваша добыча настолько плотна, что это обычная проблема. Я подозреваю, что у вас нет «популяции», которая будет жить долго.Также в качестве комментария обновляйте своих хищников случайным образом.То есть, вместо того, чтобы проходить через множество мест, возьмите список хищников и рандомизируйте их, а затем обновите их один за другим.Я думаю, что это необходимо, но я не знаю, достаточно ли этого.

1 голос
/ 06 марта 2011

Эта проблема решается с помощью метода, называемого двойная буферизация , который также используется в компьютерной графике (для предотвращения отрисовки изображения, которое в данный момент мешает изображению, отображаемому в данный момент на экране). Используйте два массива. Первый содержит текущее состояние, и вы принимаете все решения о перемещении на основе первого массива, но вы выполняете перемещение в другом массиве. Затем вы меняете их роли.

Редактировать: Похоже, я недостаточно внимательно прочитал ваш вопрос. Может потребоваться двойная буферизация и рандомизация, в зависимости от сложности ваших правил (но если нет правил, отличных от описанных вами, рандомизации должно быть достаточно). Однако они решают две разные проблемы:

  • Двойная буферизация решает проблему правильности , когда у вас есть правила, в которых решения о том, что произойдет с существом в клетке, зависят от содержимого соседних ячеек, а решения о соседних ячейках также зависят от этого клетка. Если вы, например, есть правило, которое гласит, что если два хищника находятся рядом, они оба удалятся друг от друга, вам нужна двойная буферизация. В противном случае, после того как вы переместили первого хищника, второй не увидит соседнего хищника и останется на месте.
  • Рандомизация решает проблему справедливости , когда ресурсы ограничены, например, когда добычу может съесть только один хищник (что, похоже, является проблемой, которая вас беспокоит).
0 голосов
/ 06 марта 2011

Как насчет какого-то метода циклического перебора?Поместите своих хищников в круговой связанный список и держите указатель на узел, который в данный момент является «первым».Затем продвигайте этот первый указатель на следующее место в списке каждого поколения.Вы можете с легкостью добавлять новых хищников либо спереди, либо сзади списка.

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