Принцип работы программы
// Сетка смещений (север-юг)
const offsetPairType northFront[]=
{{-2,-2}, {-2,-1}, {-2,0}, {-2,1}, {-2,2}, {9,9}};
const offsetPairType northLeft[]={{0,-2}, {-1,-2}, {9,9}};
const offsetPairType northRight[]={{0,2}, {-1,2}, {9,9}};
const offsetPairType northProx[]=
{{0,-1}, {-1,-1}, {-1,0}, {-1,1}, {0,1}, {9,9}};
// Сетка смещений (восток-запад)
const offsetPairType westFront[]=
{{2,-2}, {1,-2}, {0,-2}, {-1,-2}, {-2,-2}, {9,9}};
const offsetPairType westLeft[]={{2,0}, {2,-1}, {9,9}};
const offsetPairType westRight[]={{-2,0}, {-2,-1}, {9,9}};
const offsetPairType westProx[]=
{{1,0}, {1,-1}, {0,-1}, {-1,-1}, {-1,0}, {9,9}};
Здесь представлены два набора координат для векторов смещения. Предположим, что агент имеет координаты (7,9) в среде (используя систему координат (х,у)). Используя вектор northRight в качестве смещения координат, программа рассчитывает две новые пары координат: (7,11) и (6,11) (координаты (9,9) представляют конец списка). Данные координаты отображают два положения в правой зоне для агента, который смотрит на север. Если бы агент смотрел на юг, программа бы инвертировала координаты northRight перед тем, как добавить их к текущему положению. В результате получилось бы следующее: (7,7) и (8,7). Эти координаты представляют два положения в правой зоне при условии, что агент смотрит на юг.
Продолжим изучение трёх других частей функции simulateAgent. Следующий этап заключается в том, чтобы провести переменные inputs, полученные на предыдущей стадии, в выходные ячейки нейронной сети агента. Результатом является набор значений выходных ячеек, которые рассчитаны на основании входных сигналов с использованием весов соединений между нейронами в сети. Затем (базируясь на том, какая ячейка имеет наибольшее значение) программа выбирает действие, которое будет выполнено агентом, по принципу «победитель получает всё». Для выполнения действия используется оператор case, для выбора доступны следующие действия: повернуть налево, повернуть направо, съесть, продвинуться вперёд на одну ячейку.
Последний этап симуляции агента — проверка его энергии. На каждом этапе агент теряет часть своей энергии (количество потерянной энергии различно для травоядных и хищников). Если энергия агента падает до нуля, то он умирает от голода и выбывает из симуляции.
Рассмотрим функции, используемые simulateAgent в порядке их вызова (percept, turn, move, eat и killAgent).
Функция percept использует цикл для изучения всех плоскостей и рассчитывает суммы на основании информации о соответствующей плоскости. Дляодин объект.
Функция turn изменяет направление, в которое агент смотрит. В зависимости от текущего направления агента и направления для поворота устанавливается новое направление.
Функция move немного сложнее. Используя набор смещений для установки нового положения по осям координат, а также направление, которое помогает определить нужную пару смещений программа рассчитывает новый набор координат. Перед движением агента изменяется плоскость, его содержащая, чтобы отобразить движение. После перемещения плоскость снова изменяется, чтобы показать, что агент находится на другой ячейке на заданной плоскости.
Выволнение функции eat разбито на два этапа: поиск объекта для съедения в области «близости» агента и, если таковой существует, запись об удалении съеденного объекта.
Суть первого этапа заключается в том, чтобы выбирается плоскость для поиска. Выбор основывается на типе текущего агента. Если агент является травоядным, то поиск ведётся на плоскости растений, в противном случае — на плоскости травоядных (для хищников). Далее, используя направление движения агента, программа вызывает функцию ChooseObject, чтобы вернуть координаты объекта интереса на нужную плоскость. В этой функции вновь задействованы пары смещения, но внимание уделяется только области близости — в напралении движения агента. Если объект был найден, функция ChooseObject возвращает значение, которое не равно нулю, и заполняет координаты x и y в соотвествии с функцией eat.
Функция ChooseObject очень похожа на функцию percept, однако вместо того, чтобы суммировать объекты, расположенные в плоскости данной зоны, она возвращает координаты первого найденного объекта.