Пошаговая модель колебаний численности травоядных и хищников.
Входные данные
Исходное размещение растений и животных задается из текстового файла. Формат - на усмотрение студента.
Описание задачи
На двумерном поле произрастают растения и перемещаются животные. Растения разрастаются и постепенно стремятся занять все свободные ячейки. Животные размножаются, перемещаются, поедают растения и друг друга, умирают.
Справка
Википедия: Популяционные волны
Базовые операции над объектами
- Уничтожение - каждый объект обладает своим временем жизни (time to live - TTL). На каждом шаге модели это время уменьшается на единицу. По истечении TTL объект уничтожается. Также объект может быть уничтожен, если его кто-нибудь съел.
- Перемещение - объект перемещается из одной ячейки в другую. Из ячейки в середине поля можно переместиться в 8 соседних: вверх, вниз, вправо, влево и 4 варианта наискосок, + как вариант можно остаться на месте. За границы поля выходить нельзя. Если не указано особо, то перемещение объекта носит случайный характер: с помощью
rand()
выбирается одно из доступных направлений.
- Размножение - один объект порождает другой объект такого же типа в смежной свободной ячейке. Перемещение и размножение - взаимоисключающие действия. После размножения TTL делится пополам между потомком и родителем.
- Поедание - один объект уничтожает другой и получает прибавку к TTL. Для поедания необходимо либо уже находиться в одной ячейке с другим объектом, либо оказаться в ней в результате перемещения, тогда перемещение с поеданием может быть произведено за один шаг.
Стратегии поведения объектов
- Растение
- Не умирает, всегда «бесконечный» TTL.
- Не перемещается. Где выросло, там и растёт.
- Никого не ест. Не умеет.
- Разрастается. Раз в несколько ходов размножается (период размножения задается глобально), и заполняет растениями смежные ячейки поля. .
- Травоядное
- Либо перемещается, либо ест. На каждом шагу решает, пойдет оно дальше или останется кушать подножный корм.
- Потребляет траву. Каждая съеденная ячейка с травой увеличивает TTL травоядного (величина приращения задается глобально).
- Не ест хищников. Скорее наоборот.
- Убегает от хищников. Если в смежных ячейках есть хищники, то перемещается в свободную клетку как можно дальше от них.
- Размножается когда сыто и нет хищников. Размножение происходит когда TTL животного превышает определенный уровень (задается глобально). Потомок появляется в случайной смежной ячейке не занятой другими животными.
- Хищник
- Не ест траву. Диета.
- Перемещается и атакует. Перемещение совмещается с поеданием.
- Охотится на травоядных. Каждое съеденное животное отдаёт хищнику свой TTL, а также добавляет бонус к TTL хищника (величина бонуса задается глобально).
- Когда сыт, то размножается или спит. Размножение возможно когда TTL хищника превышает определенный уровень (задается глобально). Вероятность размножения 50%. В случае неуспеха, считается, что хищник просто спит. При успехе, потомок появляется в случайной смежной ячейке не занятой другими животными.
Детали реализации
Иерархия классов объектов:
Object
|- Plant
|- Herbivorous
+- Predator
Ячейка поля содержит указатель на объект, который может быть экземпляром классов Plant
, Herbivorous
и Predator
.
Сами объекты связаны в единый глобальный список. Необходимо уметь искать объект в списке, удалять выбранный объект, добавлять объект в конец списка, перебирать объекты в списке. Наиболее подходящим в данном случае может быть двусвязный список (хотя при определённой доработке можно обойтись и односвязным)
Один шаг моделирования включает в себя:
- Проход по списку объектов с удалением из списка всех с
TTL == 0
.
- Проход по списку оставшихся объектов с обработкой действий на текущем шаге:
- перемещение объекта в другую ячейку поля (если требуется)
- поедание/уничтожение других объектов с удалением их из списка (если требуется)
- создание новых объектов с добавлением их в хвост очереди (если требуется)
- Проход по списку с перерисовкой всех оставшихся/появившихся объектов на их позициях и подсчетом общего количества объектов разных классов.
Для визуализации результатов работы можно использовать библиотеку консольной псевдографики.
Студенту предлагается самостоятельно выбрать численные значения глобальных параметров описывающих модель, при которых будут наблюдаться периодические колебания численности хищников и травоядных.