Вариант пространственной модели «Хищник-Жертва»
Пусть клетки автомата могут быть заняты растительностью и животными (хищниками или жертвами).
Растительность (трава) располагается в каждой клетке. Одним из простейших правил, управляющих ростом травы, может быть следующее:
- для каждой клетки задается максимальное количество травы, которое способно вырасти на данной клетке. Как только количество травы на клетке становится меньше максимального, она начинает расти вновь с заданной скоростью.
Основу расчетной программы составляет цикл итераций во времени, на каждом шаге которого происходит опрос и изменение состояния клеток автомата. Поэтому в дальнейшем, поясняя работу программы, мы будем описывать только тело этого глобального цикла.
Указанное выше правило можно записать следующим образом (рис. 1). Курсивом обозначены те агенты (трава, травоядные животные (жертвы) и хищники) к которым относится данное правило.
Траве: Предел роста не достигнут? Вырасти на заданную высоту. |
Рис. 1
Этот алгоритм реализован в функции serengeti1.m. Дело в том, что объектом, вдохновившим нас на разработку этой модели, является экосистема национального парка Серенгети (Танзания).
Одной из особенностей Серенгети является миграция животных. Ежегодно, в засушливый период октября и ноября, более миллиона антилоп гну и около двухсот тысяч зебр перемещаются с северных холмов на южные равнины, где в это время идут непродолжительные тропические дожди. Затем с наступлением дождливого сезона в апреле-июне животные мигрируют на запад и север. Ни засуха, ни хищники не могут их остановить. В течение этого ежегодного длительного путешествия животные проходят 3000 км, съедая около 4000 тонн травы каждый день. Много животных погибает, однако и в пути рождается примерно четверть миллиона детенышей.
Возвращаясь в функции serengeti1.m, отметим, что в ней также задано переменное количество травы, возрастающее линейно от левой к правой границе игрового мира.
function x = initVegetation(s, A)
[ X, Y ] = meshgrid( 1:s, 1:s );
x = A*X;
Коэффициент A характеризует градиент изменения растительности, s — определяет размер игрового «мира».
Добавим в нашу модель правила, задающие поведение животных. Пусть особи каждого вида характеризуются определенным запасом энергии, который расходуется со временем и пополняется за счет поедания корма (растительности — для жертв и жертв — для хищников). Если энергии особи недостаточно для существования, то она умирает, а если достаточно для воспроизводства, то — воспроизводит себе подобных.
Начнем с описания поведения травоядных (рис. 2).
В клетке есть агенты? M = Число агентов в клетке # M > 0 Для каждого агента из M выполнить: Травоядным: Корм в ячейке есть? Оставаться на месте. Уменьшить запас травы. Энергия += (Прирост энергии – Убыль энергии) Иначе Корм есть в ячейке по соседству? Вычислить ячейку по соседству с максимальным объемом корма Перейти в нее. Энергия -= Убыль энергии Иначе Перейти в произвольную ячейку по соседству. Энергия -= Убыль энергии Энергии недостаточно для существования? Умереть Конец цикла «Для каждого агента…» Конец «В клетке есть агенты?» |
Рис. 2
Начальное распределение травоядных задается функцией initAgents():
function a = initAgents(size, maxenergy)
k = 1;
for i = 1:size;
for j = 1:size;
if rand < 0.2 % поместить в клетку жертву и задать ее параметры
a(k).i = i;
a(k).j = j;
a(k).energy = maxenergy;
a(k).number = k;
k = k + 1;
end
end
end
Каждая особь задается структурой a, полями которой являются:
- координаты особи (i, j);
- энергия, которой обладает особь (energy);
- индивидуальным номером (number)/
С помощью функции selectNeighbour() определяются координаты одной из ячеек по соседству, обладающих заданным свойством, в данном случае — максимальным количеством травы.
Функция displayAgents(size, a,txt, ptime) отображает размещение животных. Параметр txt управляет выводом на экран количество животных в данной ячейке.
Алгоритм, показанный на рис. 2 реализован в функции serengeti2.m. Очевидно, что его необходимо дополнить возможностью воспроизводства животных (рис. 3).
В клетке есть агенты? M = Число агентов в клетке # M > 0 Для каждого агента из M выполнить: Травоядным: Инкрементировать счетчик воспроизводства Корм в ячейке есть? Оставаться на месте. Уменьшить запас травы. Энергия += (Прирост энергии – Убыль энергии) Иначе Корм есть в ячейке по соседству? Вычислить ячейку по соседству с максимальным объемом корма Перейти в нее. Энергия -= Убыль энергии Иначе Перейти в произвольную ячейку по соседству. Энергия -= Убыль энергии Энергии недостаточно для существования? Умереть Счетчик воспроизводства превысил верхнюю границу диапазона воспроизводства? Сбросить счетчик воспроизводства Иначе (Счетчик воспроизводства находится в диапазоне воспроизводства) И (Энергии достаточно для воспроизводства)? Воспроизвести потомство численностью не более заданной и с максимальной Энергией Сбросить счетчик воспроизводства Конец цикла «Для каждого агента…» Конец «В клетке есть агенты?» |
Рис. 3
Воспроизводство животных реализовано в функции reproduceAgents() (serengeti3.m).
Наконец, модель необходимо дополнить правилами, определяющими поведение хищников (рис. 4).
Хищникам: Инкрементировать счетчик воспроизводства Если в текущей ячейке корм (жертвы)? Оставаться на месте Энергия += (Вероятность прироста энергии * Прирост энергии – Убыль энергии) Уменьшить число травоядных. Иначе Корм есть в ячейке по соседству? Вычислить ячейку по соседству с максимальным объемом корма Перейти в нее. Энергия -= Убыль энергии Иначе Перейти в произвольную ячейку по соседству. Энергия -= Убыль энергии Энергии недостаточно для существования? Умереть Счетчик воспроизводства превысил верхнюю границу диапазона воспроизводства? Сбросить счетчик воспроизводства Иначе (Счетчик воспроизводства находится в диапазоне воспроизводства) И (Энергии достаточно для воспроизводства)? Воспроизвести потомство численностью не более заданной и с максимальной Энергией Сбросить счетчик воспроизводства |
Рис. 4
Алгоритм поведения хищников имеет много общего с алгоритмом для травоядных (рис. 3). Существенно отличие выделено на рис. 4 жирным шрифтом.
Таким образом, полный цикл работы модели «Серенгети» можно записать следующим образом (рис. 5).
Траве: Предел роста не достигнут? Вырасти на заданную высоту. В клетке есть агенты? M = Число агентов в клетке # M > 0 Для каждого агента из M выполнить: Травоядным: Инкрементировать счетчик воспроизводства В текущей ячейке хищник? Перейти в соседнюю ячейку Иначе Корм в ячейке есть? Оставаться на месте. Уменьшить запас травы. Энергия += (Прирост энергии – Убыль энергии) Иначе Корм есть в ячейке по соседству? Вычислить ячейку по соседству с максимальным объемом корма Перейти в нее. Энергия -= Убыль энергии Иначе Перейти в произвольную ячейку по соседству. Энергия -= Убыль энергии Энергии недостаточно для существования? Умереть Счетчик воспроизводства превысил верхнюю границу диапазона воспроизводства? Сбросить счетчик воспроизводства Иначе (Счетчик воспроизводства находится в диапазоне воспроизводства) И (Энергии достаточно для воспроизводства)? Воспроизвести потомство численностью не более заданной и с максимальной Энергией Сбросить счетчик воспроизводства Хищникам: Инкрементировать счетчик воспроизводства Если в текущей ячейке корм (жертвы)? Оставаться на месте Энергия += (Вероятность прироста энергии * Прирост энергии – Убыль энергии) Уменьшить число травоядных. Иначе Корм есть в ячейке по соседству? Вычислить ячейку по соседству с максимальным объемом корма Перейти в нее. Энергия -= Убыль энергии Иначе Перейти в произвольную ячейку по соседству. Энергия -= Убыль энергии Энергии недостаточно для существования? Умереть Счетчик воспроизводства превысил верхнюю границу диапазона воспроизводства? Сбросить счетчик воспроизводства Иначе (Счетчик воспроизводства находится в диапазоне воспроизводства) И (Энергии достаточно для воспроизводства)? Воспроизвести потомство численностью не более заданной и с максимальной Энергией Сбросить счетчик воспроизводства Конец цикла «Для каждого агента…» Конец «В клетке есть агенты?» |
Рис. 5
Цветом на рис. 5 выделены общие для хищников и жертв правила.
Эта модель реализована в функции serengeti4.m. Новыми в модели являются функции countPopulation(), определяющая численность популяции особей данного вида в данной клетке и delPrey(), реализующая сокращение популяции жертв на заданную величину (ndel).


