C# — Моделирование «разумной» жизни на базе нейронных сетей

Данная статья посвящена исследованию возможностей нейронных сетей при их использовании в качестве основы для индивидуального разума моделируемого объекта.
Цель: показать, способна ли нейронная сеть (или ее данная реализация) воспринимать «окружающий» мир, самостоятельно обучаться и на основе собственного опыта принимать решения, которые можно считать относительно разумными.
image
Задачи:

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


1. Информационная модель
Для описания информационной модели нужно понять какие основные характеристики объекта мы хотим увидеть, в качестве «основных» характеристик разумного существа я выделил следующие:

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


Под окружающим миром примем пространство в плоскости с эвклидовой метрикой, с некоторым конечным количеством моделируемых объектов.
Механизмы восприятия в пространстве могут быть различны, в данной модели такими механизмами приму 4 сенсора, объекта, которые могут дать информацию о окружающем мире. Под информацией об окружающем мире будет подразумеваться некое значение, пропорциональное расстоянию до ближайшего другого объекта. Так как 4 сенсора будут смещены относительно «центра» объекта он получит представление о том, где находится ближайший объект (в теории).
Механизм взаимодействия в модели примем следующий: 4 «движителя», каждый из которых представляет то, насколько быстро объект стремится двигаться в том или ином направлении. 4 «движителя» позволят свободно перемещаться в пределах плоскости. Взаимодействием в таком случае будет возможность двигаться в пространстве.
image
Наличие памяти возможно реализовать следующим образом: объекту будет сохранять информацию о данных с сенсоров и текущих «ускорениях» в движителях, таким образом имея массив из подобной информации можно составить полную информацию о том, что происходило с объектом.
 
image 
Под мыслительной системой будет подразумеваться нейронная сеть в той или иной конфигурации.
Возможность принимать решения обусловлена архитектурой нейронной сети, опыт и воспринимаемая информация предоставляется памятью и сенсорами.
image 
Для того, чтобы решения имели какой либо смысл примем «стремления» для объектов:
1. «Съесть» другой объект (в нашем случае объект будет «съеден» другим в случае, если приблизится на достаточное расстояние и будет «достаточно силен»)
2. «Не быть съеденным», в нашем случае стараться не позволить другим объектам приблизиться к себе, чтобы не дать им возможности себя «съесть»
Для принятия решения о «силе» ближайшего объекта примем еще 1 канал информации, который будет сообщать «сильнее ли ближайший объект». 
Таким образом описанная модель объекта удовлетворяет всем поставленным требованиям.


2. Реализация модели 
Для реализации модели будет использоваться язык программирования C#
В качестве реализации нейронной сети будет применяться Encog Machine Learning Framework. Он очень гибкий и быстрый, не говоря уже о простоте использования.
Код модели достаточно простой, это не единственная возможная его реализация, данную модель может дополнить и изменить каждый.
Функционирование объекта в данной реализации модели построено вокруг функции DoLive (), в которой поочередно происходят следующие жизненные этапы объекта:
RefreshSense — обновление данных сенсоров (огляделся вокруг) 
Move — сделал шаг (переместился в пространстве) 
SaveToMemory — обновил память, запомнил текущую обстановку 
Train — «обучился», проанализировал память 
Compute — принял решение о положении движителей на основе опыта и информации о ближайшем объекте 
Output — задал параметры движителей на основе принятого решения
image 
Таким образом протекает каждый жизненный цикл всех объектов на протяжении всего их существования. 

3. Проверка модели 
Для просмотра результата моделирования потребуется каким либо образом извлечь информацию о текущем состоянии модели на каждом ее этапе, т.к. модель динамическая наиболее эффективным будет использование видеозаписи. Для реализации вывода в видео файл воспользуемся библиотекой AForge.Video.FFMPEG. 
 
Пример 1. Без информации о силе ближайшего объекта (нет стремления избежать гибели)

 
Пример 2. Высокая «инертность» мышления (реже останавливается поразмышлять о окружающем его мире и проанализировать опыт)

 
Пример 3. Конечный вариант реализации 

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

© Habrahabr.ru