Искуственный интеллект

Опубликовано 16.11.2009 в 21:08 в разделе ,

Разум и преподаватели университета порой ставят перед нами очень интересные и в некотором смысле даже неразрешимые задачи. Одной из таких задач на моей памяти оказалось создание искусственного интеллекта, хотя бы на самом элементарном уровне.

Искусственный интеллект (ИИ) (англ. Artificial intelligence, AI) — это наука и разработка интеллектуальных машин и систем, особенно интеллектуальных компьютерных программ, направленных на то, чтобы понять человеческий интеллект. При этом используемые методы не обязаны быть биологически правдоподобны. Но проблема состоит в том, что неизвестно какие вычислительные процедуры мы хотим называть интеллектуальными. А так как мы понимаем только некоторые механизмы интеллекта, то под интеллектом в пределах этой науки мы понимаем только вычислительную часть способности достигнуть целей в мире.

Wikipedia.

Хоть нам и неизвестно, что такое интеллект, тем более искусственный интеллект (в дальнейшем ИИ или AI), попробуем создать идею и очертить круг интеллектуальных задач для элементарной системы.

Идея


Попытаемся создать ИИ на базе идеи стратегической компьютерной игры. Основным отличием от типичного мира стратегий будет то, что в нашей игре не будет участвовать пользователь как таковой — все действия будут выполняться самим компьютером.

В нашем виртуальном мире будут жить и развиваться техногенные организмы. Основой каждого из них будет главная единица (юнит), которую мы будем называть мозгом. Этот юнит будет отвечать за всю жизнедеятельность организма в целом. Наделим его способностью порождать новых юнитов своей группы (организма) и управлять их действиями.

Все события мира будут разворачиваться на карте ограниченного размера, по которой беспорядочно разбросаны ресурсы. Ресурс будет необходим мозгу для жизнедеятельности — то есть для создания новых юнитов и расширения организма.

Юниты могут быть различных типов, выполнять различные функции, в том числе поиск ресурсов, разведку территории, защиту более слабых единиц и атаку противника, то есть любого другого организма.

Основной задачей в этом игровом мире сделаем выживание и захват территории, потому что это больше всего похоже на жизнь реальных биологических систем. В итоге, в нашем случае система будет чем-то напоминать пчелиный улей, в котором есть матка и рабочие пчёлы разного рода деятельности.

Подходы к решению задачи

Чтобы наш мир вёл себя интеллектуально, нам нужно будет применить ряд интересных идей и решений при его создании и написании кода.

  1. Генетика.
    Основой деятельности и размножения вида должен стать генетический алгоритм. В нашем случае мы планируем реализовать некоторый аналог естественного отбора в этом безумном мире. Для этого у каждого юнита мы предусмотрим такую характеристику, как генотип. Наш ген будет отвечать за основные характеристики юнита, такие как его жизненная сила, сила атаки, переносимый груз, кругозор, самопожертвование и т.д.
    В самом развитии организма при размножении мы применим стандартные для природы функции. Возьмём генетические материалы от двух особей, используем их как отцовскую и материнскую хромосому. Разумеется, проведём кроссинговер (обмен частями генетического кода между хромосомами), и внесём маловероятную мутацию.
    Генетический материал мы будем отбирать у самых опытных юнитов, таким образом в нашем мире появится естественный отбор.
  2. Принятие решений.
    Разумеется, каждый юнит будет наделён способностью мыслить. Пусть ему никогда не стать гением поэзии, но выполнять свою задачу он должен чётко, и легко уметь принимать решения в определённых ситуациях.
    Для принятия решений мы воспользуемся системой приоритетов. На каждом заходе своей мысли юнит будет составлять для себя список возможных действий. Для каждого из этих действий будет проставлен приоритет в соответствии с его важностью и удалённостью места действия от текущей позиции юнита.
    В дальнейшем, анализируя этот список, юнит будет выбирать с большей долей вероятности наиболее важное и приоритетное решение. С другой стороны, мы оставляем элемент случайности — может быть выбрано в теории любое действие.
  3. Настроение.
    Маленькая тонкость, которая позволит нам разнообразить скучный ход событий нашего мира — это настроение юнитов. Настроение будет зависеть напрямую от поведения юнита в процессе жизнедеятельности. Если у юнита жизнь будет «складываться», то есть он будет легко выполнять свои задачи, то и настроение у него будет повышаться. Когда же выполнение задач будет неудачным, то юнит будет «грустить» и настроение медленно понизится. Когда настроение упадёт до самого низкого уровня, юнит покончит с собой, в соответствии с идеей Премии Дарвина.
  4. Опыт и взросление.
    Жизнь не стоит на месте, и юнит в процессе своей работы набирается опыта. Этот опыт будет напрямую влиять на способности и поведение юнитов. Введём такое понятие, как «уровни», за который примем текущий уровень развития юнита. В зависимости от накопленного опыта, этот уровень будет повышаться, а тем самым будут повышаться и характеристики юнита. В целом, это похоже на уровневые модели в РПГ-играх.
  5. Жизненные роли.
    Среди множества рабочих пчел улья каждая играет свою роль в жизни сообщества. В нашем случае мы тоже выделим юнитам поведенческие роли, в соответствии с которыми они и будут служить своему организму.
    Сами же роли выделим по роду деятельности:

    1. добытчик ресурсов будет отвечать за доставку ресурса к мозгу;
    2. защитник займётся охраной добытчиков и мозга;
    3. разведчик осмотрит территорию на предмет врагов и ресурсов;
    4. воин устранит врагов и поможет захватывать территорию.

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

  6. Общение.
    Обмен информацией в организме будет проходить на основе отправки сообщений между нитами и мозгом. При этом сообщения доставляться смогут только юнитами мозгу или наоборот, коммуникации между отдельными юнитами мы предусматривать не будем, оставив эту заботу мозгу.
    Основой сообщений будут служить несколько важных блоков данных — тип сообщения, позиция, уровень (опасности или полезности) и, собственно, отправитель. На основе таких сообщений мы легко реализуем сбор данных разведки и раздачу заданий юнитам.

Этот основной список задач мы реализуем в нашем интеллектуальном мире. В процессе работы появятся и другие более мелкие задачи, решение которых будет рассмотрено в конкретных разделах.

Технологии

Для реализации нашего мира потребуется удобная и мощная программная среда. Лично я выбрал язык C++ и среду разработки Microsoft Visual Studio, которая обнаружилась в нашем университете. Основой такого выбора послужили не только личные пристрастия, но и удобства работы языка C++ с объектами и динамической памятью, без которой в такой программе обойтись невозможно.

Основой для графической реализации послужил OpenGL. Так как графика в нашем случае играет вторичную роль, Вы можете легко избрать любой другой способ реализации, как и я подобрал наиболее простой для самого себя.

Функционирование программы

В основе технической реализации лежит стандартное оконное приложение Windows.

Все действия обрабатываются в основном объекте программы, который называется world (англ. мир). Внешне мы используем четыре основных метода — создание, процессинг, рендеринг и удаление.

Основной цикл программы состоит в следующим. Мы производим обработку интерфейса на каждом шаге. Раз в определённое число шагов мы, кроме того, вызываем обработчик объектов, который отвечает за проработку групп и отдельных объектов. После обработки мы осуществляем рендеринг мира на текущей стадии. Синхронизация этого потока ведётся в реальном времени с частотой 50 кадров в секунду.

Реализация


Вся система ИИ была реализована на платформе Windows и графической системе OpenGL. Вы легко можете наблюдать пример скриншота из программы, на котором толпятся юниты.

Этот продукт получил название Battle Of The Spheres, когда ещё в самой первой реализации объекты были простыми шариками, катающимися по полю. С тех пор форма поменялась, но название было решено оставить …

Вся информация по данному проекту доступна для скачивания:

Вы легко можете проанализировать эти материалы и лично понять их работу.

Автор

Автором данного программного продукта и собственником прав на него является Антон Резниченко aka AlterVision, опубликовано 6 мая 2009 года. Публикация любых материалов, представленных в статье, возможна только с разрешения автора и с указанием источника информации.

Детальный разбор функционала

Объект мира – world


Основу функционирования программы составляет объект мира, класса c_world. Он реализует основные задачи функционирования. Весь спектр его задач можно разбить на четыре основных блока.

  1. Система – переменные и функции, отвечающие за обработку оконных функций, нажатие клавиш и прочие системные функции, которые требуются для корректной работы программы.
  2. Основной поток – функционал, обеспечивающий выполнение основной задачи программы, то есть собственно вызовов функций реализации искусственного интеллекта.
  3. Работа с объектами – вызовы для создания, уничтожения и поиска объектов в основном массиве.
  4. Дополнительный функционал – функции вычисления расстояния, получения данных об объектах и подобные операции, которые желательно реализовывать «поближе» к объектному уровню мира.

Системные функции мы рассматривать не будем – они далеки от предмета нашего проекта, остановимся поближе на работе с объектами и основным потоком.

Функционирование мира, как и всех остальных объектов в моём исполнении, основано на 4 базовых функциях – create (создание), process (обработка), render (вывод на экран) и destroy (завершение работы).

Функция create и конструктор объекта вызываются в самом начале работы программы. Они подготавливают программную среду к функционированию – создаются объекты карты, интерфейса, группы и ключевые объекты групп. Кроме того, подготавливаются основные переменные объекта, обнуляется память, указатели на объекты.

Соответственно, деструктор и функция destroy отвечают за очистку памяти, удаление основных функциональных объектов и остановку программы.

Основной функционал реализуется в функции process. Сам «процесс» заключается в следующем – функция вызывает process-обработчики всех объектов и think-обработчики групп, проводит синхронизацию времени и вызывает обработчик интерфейса. На этом её роль заканчивается. Абсолютно аналогично работает и функция render, вызывая соответственные обработчики всех вложенных объектов.

Для удобства создания и обработки объектов виртуального мира был реализован простой и удобный функционал работы с памятью. Он состоит из следующих процедур:

  1. create_object – функция создаёт новый объект и записывает его адрес в массив объектов. Для удобства этот массив реализован «полудинамически» — выделена память под большое (но фиксированное) число объектов, но алгоритм обрабатывает всегда только определённую их долю, выделяя по мере необходимости новые блоки адресов.
  2. delete_object – вызывает деструктор объекта и удаляет его адрес из массива.
  3. reset_objects – сбрасывает указатель поиска объектов на начальное положение.
  4. get_next_object – возвращает указатель на следующий в списке объект, используя общий указатель выборки. Предварительно желательно установить его в нулевое положение предыдущей функцией.
  5. get_object_by_role – находит следующий объект данной группы с заданной ролью. Функция работает аналогично предыдущей, но использует не глобальный указатель, а локальный. Изначально указатель устанавливается в «-1» и передаётся в функцию по ссылке.
  6. get_object_by_id – возвращает ссылку на объект по заданному идентификатору.

С помощью этого функционала реализуется основной механизм работы с объектами.

Обработчик карты – map


Карта в программе является основным источником информации об окружающем мире и активно используется объектами для анализа ситуации вокруг них. Кроме того, этот объект отвечает за вывод на экран ландшафта.

Сама карта реализована на базе динамического массива записей типа map_point.

typedef struct map_point {
	unsigned char	land;
	unsigned char	recource;
	unsigned char	texture;
	unsigned char	height;
	int		object;
} map_point_t, *map_point_p;

Эта структура содержит в себе основную информацию о ячейках мира. Рассмотри переменные подробнее.

  1. land – бит занятости поверхности, удобен при реализации неровных поверхностей или воды. С его помощью мы можем показать, занят ли текущий участок земли, или например он является непроходимым (овраги, вода).
  2. recource – наличие ресурсов и их количество в данной точке карты. В зависимости от количества ресурсов различается скорость их добычи.
  3. texture – идентификатор и поворот текстуры. Байт разделён на две части – первые два бита отвечают за поворот текстуры (0, 90, 180, 270 градусов), вторая за номер применяемой текстуры (0-63). Сама текстура накладывается по координатам, которые выбираются в зависимости от поворота и идентификатора, накладывая различные участки одной крупной текстуры.
  4. height – высота точки над базовым уровнем.
  5. object – идентификатор объекта, который в данный момент находится в точке. Если в данной точке объекта нет, то значение параметра будет установлено в «-1».

Основной функционал реализован всё теми же стандартными функциями create, destroy и render, функционал которых очевиден – выделение и освобождение памяти и вывод карты на экран.

Возможны два варианта создания карты – автоматическая генерация и загрузка из файла. В первом случае карта заданных размеров генерируется с нулевой текстурой, на нулевой высоте и со случайно разбросанными источниками ресурсов. Второй вариант удобен, если хочется задать какую-либо карту собственного изготовления, благо на то есть редактор карт, который в данной статье не рассматривается. В этом случае весь массив точек карты напрямую загружается из файла. Соответственно, он точно также целиком сохраняется при её сохранении. При этом идентификаторы объектов на карте игнорируются, так как сохранение всего мира целиком вместе с объектами в данной версии пока не реализовано.

Наиболее полезный для объектов мира функционал карты – это get- и set-функции, которые отвечают за получение информации о данной точке карты. Большинство из них напрямую возвращает значение заданного параметра. Функция is_free при этом анализирует два параметра – занятость участка (land) и наличие объекта (object != -1). В работе этих функций используются две дополнительных, которые проверяют, является ли переданная координата правильной относительно размеров карты, и вычисляют номер элемента в массиве, соответствующего этой координате.

Кроме того, имеются две функции, используемые при работе искусственного интеллекта. Функция nearest_free определяет ближайшую к заданной свободную точку на ландшафте, например, для размещения нового объекта. Функция random_free определяет случайную точку около данной с заданным радиусом.

Группа объектов – group


Данный класс отвечает за обработку группы объектов. Все эти функции отвечают за выполнение двух важных частей работы группы – обработка сообщений и хранение сведений о данных группы, таких как состав и используемые цвета.

Здесь реализованы схожие с «мировыми» функции доступа и поиска объектов. Они используются для последовательного доступа к объектам группы.

Функция message помещает новое сообщение в очередь группы. Эти сообщения в дальнейшем используются объектом HQ данной группы.

Генетический алгоритм – genotype


Создание новых объектов базируется на основе генетического алгоритма. У каждого из объектов имеется своя переменная, называемая генотипом объекта. Это 32-битное число, в котором закодирована генетическая информация данного объекта. Информация о генах используется в дальнейшем при обработке искусственного интеллекта.

Данный класс реализован статическим и используется в совокупности с объектом мира.

Единственная внешняя функция этого класса – получение нового гена make_genes. Принцип её работы заключается в следующем. Функция собирает полный список генетического материала объектов, которые выбираются из заданной группы по заданной роли. При этом ведётся отбор наиболее «опытных» объектов, тем самым реализуя естественный отбор генетического материала. Далее, из десятки наиболее качественных геномов выбирается «пара», которая составит «родителей» будущего объекта. Генетический материал пары подвергается мутации (mutate) и затем имитируется процесс кроссинговера, то есть обмена генами между хромосомами. Итоговый ген возвращается как результат выполнения функции.

Интерфейс приложения – iface


Камера управляется объектом интерфейса, который отвечает за обработку нажатий клавиш пользователей. Две базовые функции process и look используются для реализации взгляда на мир.

Базовая подоснова для объектов мира – abstract basic


Основанием для реализации всех объектов мира является класс c_basic, в котором реализованы базовые механизмы поведения объектов, которые специфичны для всех объектов данного мира.

Базовыми мыслительными процессами, общими для всех объектов, выделены:

  1. Передвижение
  2. Атака
  3. Мышление
  4. Настроение
  5. Опыт и уровни

Кроме того, в общие ресурсы мы можем выделить такие переменные, как идентификатор, группа, роль, количество жизней и ресурсов, уровень и другие схожие общие данные. Большинство этих переменных определяется генетической информацией, и вычисляется функцией recount.

Перемещение по миру является одной из наиболее сложных задач в области проектирования искусственного интеллекта компьютерных игр. В нашем случае построение пути реализовано по схеме поиска кратчайшего пути. Для удобства, всё пространство мира разбито на отдельные ячейки, которые могут быть заняты либо свободны, в зависимости от объекта или значения land ячейки, то есть соответственно функции map->is_free(x,y), которая активно используется в алгоритме поиска пути.

Сам алгоритм состоит из трёх стадий. На первой стажи набирается информация о кратчайшем пути до точки. Для этого изначально создаётся крупный массив точек передвижения. Размер массива выбирается в том соотношении, чтобы быть в восемь раз больше расстояния до точки прибытия. При этом считается, что сам путь не должен занять больше чем четырёхкратное расстояние до точки, а число итераций в поиске считаем восьмикратной величиной пути.

На каждом шаге алгоритма отбора пути вычисляется следующая ячейка, в которую должен передвинуться объект. При этом учитывается его координата и угол поворота. Изначально выбирается клетка, которая ближе всего на пути, в зависимости от направления движения. Если эта клетка занята, производится сдвиг направления влево на одну клетку, далее вправо на одну клетку, затем на две и три клетки соответственно и сдвиг строго назад. На каждой из таких итераций точка поиска пути, вместе со своим углом поворота, сохраняется. Если на каком-то из шагов путь пересекает старую траекторию, то в этом случае траектория сбрасывается до точки пересечения, и поиск пути начинается со следующего угла, который был использован в точке пересечения.

По достижении конечной точки первая фаза поиска пути заканчивается. Вторая фаза отвечает за формирование стек-массива, по которому в дальнейшем будет проходить путь объекта. Создаётся новый массив точек перемещения, в который последовательно заносится весь путь. Если путь найден удачно, то объект получает новую точку и полный массив пути до пункта назначения.

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

Атака и обзор являются одними из наиболее простых, но при этом наиболее важных процессов функционирования искусственного интеллекта. В момент обзора местности определяется объект, который наиболее подходит для атаки, в зависимости от уровня опасности объекта. Объект имеет определенный радиус обзора и несколько меньший радиус атаки, определённые в зависимости от генома. В случае обнаружения опасных объектов в непосредственной близости от объекта-игрока, в группу объекта отправляется сообщение о нахождении нового противника.

Сама атака производится наиболее элементарным образом. С некоторой вероятностью противнику посылается сообщение об атаке с определённой величиной. Атакуемый объект, в зависимости от удачи атакующего, получает повреждения с определённой вероятностью. В зависимости от генетической информации, атака может производиться с разной силой. Кроме того, в случае, если у объекта есть ген «берсерка», то в случае очень малого количества жизней (менее 10%) объект «теряет голову» и бросается в атаку с удвоенной силой. С другой стороны, по достижении объектом малого количества жизней (менее определённого генетикой минимального уровня) у него случаются «контузии» — генетический материал объекта при ударе мутирует, используя стандартную функцию мутации генома, и значения характеристик объекта пересчитываются.

Процесс мышления и принятия решений основан на выборе с приоритетом, с привнесенным элементом случайности. На каждом заходе принятия решений объект получает определённый список вариантов, на основе которых можно принять готовое решение. Выбор вариантов осуществляется на основе системы приоритетов, зависящей от расстояния до точки решения (чем ближе, тем лучше) и заданной важности объекта. Каждому решению выставляется его приоритетная оценка. При прогоне эти оценки суммируются, вычисляется общая сумма всех баллов решений, и на её основе генерируется случайное число. В зависимости от вхождения этого числа в интервал определённого варианта, он принимается главенствующим и реализуется.

При жизни объектов важным параметром является столь несвойственная искусственным организмам категория настроения. Само настроение складывается из удач и неудач объекта в выполнении заданий. Чем лучше объект выполняет задания, тем больше у него повышается настроение. Соответственно, при недостижении цели настроение уменьшается. Как только уровень настроения принизит допустимый минимальный порок, в жизнь вступает элемент «срыва нервов» и несчастный объект совершает «суицид». Таким образом, мы решаем проблему перенаселения (объекты толпятся вокруг матки и не хотят работать) и естественный отбор наиболее удачливых генов.

Большинство генных характеристик объекта зависит не только от его генотипа. Основной множитель на большинство значений накладывает уровень объекта и его опыт. При каждом действии объект получает определённое количество опыта, как процент от значения этих действий. По достижении определённого уровня, равном, как правило, трём в степени уровня, помноженным на тысячу, объект получает новый уровень и обсчёт всех своих характеристик.

На основе этих базовых функций строится остальной функционал двух классов реальных объектов мира, которые будут рассмотрены далее.

Мыслитель – unit hq


Центральным объектом любой группы является «мыслитель», он же «матка», «мозг» и «hq». На этот объект ложатся все задачи принятия решений и раздачи заданий в рамках группы объектов. У объекта определена дополнительная функция ai, которая и отвечает за анализ ситуации мира.

Сам процесс принятия решений достаточно прост и состоит в анализе списка сообщений группы. Все сообщения анализируются мозгом последовательно, и на каждый из видов сообщения появляется своя реакция. В процессе предварительного анализа пополняются списки ресурсных точек, составляются списки свободных ресурсодобытчиков и воинов. На основе списка ресурсов мгновенно раздаются задания на их добычу свободным воинам. После анализа всего списка сообщений об атаках и обнаруженных врагах, объекты – воины получают случайным образом по определённому списку указаний, на основе которых они принимают решение об атаке объектов, наиболее оптимальных для них, используя описанный выше алгоритм принятия решений.

Кроме функции анализа ситуации, а мозга присутствует задача строительства. В том случае, если в данный момент строительство не ведётся, и есть ресурсы, мозг строит вероятностные пути решения задачи создания нового объекта. Для этого вычисляется количество объектов групп по их ролям и составляется сводный список количества объектов по отношению к их оптимальному соотношению между собой. Идеальным вариантом было бы принимать оптимальные соотношения на основе текущей ситуации опасности в мире, но это будет реализовано только в последующих версиях. После составления вероятностной таблицы строительства, она отправляется объекту, и на её основе принимается решение о создании нового юнита.

Дополнительно, чтобы разнообразить жизнь мозга, ему на каждом заходе принятия решений предлагается вариант с перемещением на новое место, недалеко от текущего. Это решение маловероятно, но в некоторых случаях мозги всё таки меняют дислокацию.

Рабочий юнит – unit work


Большую часть объектов составляют стандартные рабочие объекты. Все рабочие юниты подразделяются на четыре основных роли: ресурсодобытчики, охранники, разведка и армия.

Ресурсодобытчик, как следует из названия, организует поиск и доставку ресурсов к мозгу. Его рабочий цикл разделён на целиком разграниченные стадии – поиск месторождения, добыча и доставка. На этих этапах как правило не происходит какие-либо сдвигов функционала. В случае, если добраться до точки сбора невозможно, юнит освобождается и отправляет мозгу запрос на выдачу новой точки сбора ресурсов.

Замечено, что юниты этой роли наиболее активно развиваются. Причиной тому может служить их неконфликтность от природы и большое количество опыта, получаемого как процент за доставленные ресурсы. В целом, на 4-5 уровне такой юнит способен уничтожить одним выстрелом любой молодой юнит противника.

Охранники отвечают за безопасность юнитов-добытчиков. Как правило, к каждому добытчику привязывается как минимум один охранник (у более опытных добытчиком может оказаться и больше охраны). Он неустанно следует перемещениям охраняемого юнита, и уничтожает все подозрительные объекты в пределах своей зоны поражения. Цикл действий охранников ограничен двумя стадиями – следование и ожидание. В случае ожидания охранник каждый раз отсылает «мозгу» сообщение о своей незанятости.

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

Разведчик занимается неустанным обзором территории. Эти юниты наиболее быстро вымирают в мире, так как постоянно находятся в движении. Вся основа их деятельности – перемещение с места на место в случайные точки пространства карты и поиск новых ресурсов и точек скопления врагов. Их рабочий ход состоит всего из одного повторяющегося цикла: сгенерировать случайную точку – доехать.

При долгом функционировании интеллекта эти юниты так же оказываются излишними в мире. Причин тому две – со временем накапливается достаточно информации о ресурсах и врагах мира, и враги становятся достаточно сильными, чтобы убивать разведчиков ещё на подходе к лагерю.

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

На длительных прогонах интеллекта армия вымирает практически на самых первых этапах. Причину этого объяснить не сложно – из-за сильной опасности обстановки мира вояки слишком часто бросаются в поле боя, поэтому их естественный отбор не успевает проходить в нужной мере. А на этапе устоявшейся системы даже самый идеальный солдат первых уровней не сможет противопоставить ничего «шахтёру» 10-12 уровня, убивающему целые армии без видимых повреждений.

Действия юнитов как правило основаны на обработке сообщений одним из двух способов – прямой посыл сообщения мозгом юниту через метод action, либо анализ очереди сообщений message в блоке принятия решения.


Выводы и результаты


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

В итоге после месяца работы над программой мы смогли добиться реализации всех основных целей – наши объекты мира были наделены интеллектом, они смоги принимать полезные решения для жизни своего организма, жить в зависимости от своей социальной роли, развиваться и даже обладать настроением.

В будущем возможно множество вариантов развития этого проекта, способных привнести в него различные интересные вариант развития событий.

Одним из примеров может быть введение модели поведения объекта. Например, мы можем выделить две-три базовых модели поведения (состояний), характерных для объекта: обычное поведение, ожидание, испуг и бегство, агрессивное состояние. На базе этих моделей мы можем развивать поведение объекта различным образом.

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

Дополнительным усложнением можно сделать более реальный вариант передачи сообщений – выделить отдельный тип юнитов, которые будут передвигаться между другими юнитами и передвигаться между другими юнитами и отвечать за передачу сообщений, выполняя роль гонцов.

Существует множество вариантов развития событий, и каждый интересен по-своему.

Антон Резниченко, 27 июня 2009 года, 2.30 – 7.00