Пост 3. Детали проекта.

Окей!

Пора нам копнуть немного глубже и разобраться, что именно представляет из себя данный проект и “кто” сидит под капотом. Еще раз напомню, что мы говорим о программе – эмуляторе, которая “повторяет”(эмулирует) биологическую систему организмов (в нашем случае компьютерных программ). Их задача (как и в природе) приспособиться к окружающей среде максимально сильно. Более приспособленные – выживут(чуть с большей вероятностью) и дадут чуть больше потомства, чем менее приспособленные. Тем самым, происходит итеративное улучшение всей популяции со временем. Стоит так же упомянуть о том, что во всех перечисленных процессах нет полного детерминизма, чего стоило бы ожидать от программы. Есть лишь вероятности и вероятностные функции, которые конфигурируются оператором…

Перед тем, как перейти к технической части, напомню о том, что базовыми принципами нашей системы (и биологической тоже) являются:

  • отбор организмов по каким-то критериям (умертвление менее приспособленных)
  • возможность давать потомство (пока реализовано только клонирование)
  • мутации (изменения\удаления\добавления кода организмов)

Зная это, давайте опишем нашу систему более детально. Для начала, определимся с терминалогией:

  • оператор – человек, взаимодействующий с системой и имеющий возможность менять её параметры как до, так и во время работы
  • мир – 2D пространство заданного размера в памяти, где “живут” все организмы
  • визуализатор – отдельная программа, которая показывает мир организмов в окошке
  • терминал – окно с консолью, через которое можно конфигурировать менеджер или получать из него данные удаленно по сети
  • инстанс или менеджер – одна запущенная копия jevo. Она контроллирует мир и все организмы в нем. “Общается” с другими менеджерами и поддерживает удаленное конфигурирование с помощью терминала. Так же, может выводить киртинку мира на удаленный визуализатор. По факту – это TCP сервер.
  • организм – компьютерная программа на языке Julia. Из дополнительных параметров содержит энергию, координаты в 2D мире, код, его размер, уникальный id и т.д.
  • код организма – текст программы на языке Julia уникальный для каждого организма и определяющий что именно данный организм “умеет”. В некотором смысле код – это аналог нашего ДНК. В этом случае менеджер “выполняет” этот ДНК.
  • мутация – изменение\добавление\удаление одной атомарной конструкции в программе организма на языке Julia.
  • энергия – индивидуальное число для каждого организма описывающее его “успешность”
  • смерть организма – удаление его кода и всех ассоциированных с ним данных из системы.

Итак, у нас есть какое-то количество программ(организмов) на языке Julia. Их код хранится в двух представлениях – AST (Abstract Syntax Tree) и скомпилированный машинный код. Первый используется для мутаций, второй(бинарная копия первого) – работает постоянно, пока организм жив. При первом запуске системы код организмов одинаков и пуст. И поверьте мне, умрет немало поколений, до тех пор пока не появится первый “общий предок“. Еще, есть мир (прямоугольная область X на Y – кусок памяти), где живут все программы. Он состоит из пикселей. На данный момент есть три типа пикселей: организм, энергия и пустота. В будущем планируется добавить на много больше типов. Цель организмов найти и съесть, как можно больше энергии чтобы выжить и дать потомство. Это и является их критерием успешности. То есть энергия === успешность. Так же, есть текущий менеджер, который всем этим управляет(выполняет код организмов, следит за миром, убивает и создает потомство для организмов, ждет удаленных соединений от TCP клиентов и т.д.). Когда энергия какого-то организма доходит до нуля – он умирает. Система удаляет его отовсюду (из мира и памяти). С другой стороны, если у одного из организмов больше всего энергии, то шансы на производство потомства наибольшие. Обратите внимание на слово “шансы”. То есть, вероятен процесс, когда менее энергичный организм сможет обзавестись потомством обойдя более энергичного. Такой себе миллионер из трущоб 🙂 С другой стороны, в долгой перспективе более успешные все таки выиграют эту гонку. Вообще, по моим наблюдениям, со временем вся популяция заполняется родственниками таких успешных особей… Количество энергии организма зависит от нескольких факторов: кол-ва найденной и съеденой энергии и от размера кода. Чем больше код, тем больше энергии тратится на его поддержание. По этому, всегда есть компромисс между размером кода и его качеством.

Теперь, когда мы в общем представляем о том, как работает система, давайте взглянем на то, как выглядит мир организмов:

2016-04-262
кликабельный скриншот программы jevo

На рисунке выше, Вы можете видеть 4 окошка с разными данными. Давайте опишем каждое из них:

  • Визуализатор. В верхнем – левом углу Вы можете видеть большое поле зеленых точек – это энергия. Она генерируется менеджером исходя из настроек, которые задает оператор. Эти точки неподвижны и просто “лежат”. Синие точки – это организмы. Черные – пустота. На момент создания скриншота, организмы уже достигли такого уровня развития, что могли двигаться и “есть”. Это можно заметить по “проеденным” черным каналам(сверху справа в основном). Не вникая в детали, можно догадаться, что популяция “научилась” двигаться по горизонтали и при этом есть все, что попадет её по дороге. Маленькое окошко по центру, снизу – это терминал, который запустил визуализатор. Он так же работает по TCP протоколу и получает данные с сервера(менеджера).
  • Терминал. В правой части рисунка Вы можете заметить окошко терминала – это TCP клиент, который дал запрос на сервер (левое нижнее окошко) для получения данных о пяти лучших(наиболее успешных) организмах. Об этом свидетельствует последняя выполненная команда. Там хорошо видно их код. Предыдущие команды – получение количества организмов популяции – 277, 281, 295, 304, 367. Существует целый набор команд, который поддерживается на данный момент.
  • Сервер(или менеджер). В левом, нижнем углу находится окно сервера. Вы можете видеть часть лога, который он выводит. В часности, видно, что сервер создал несколько популяций(“Creating organisms”), а так же записал два бекапа.

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

В следующем посте мы поговорим о языке Julia, а пока – до встречи 🙂

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s