Найти в Дзене
ТехноШаман

Кибербиология. Код-геном для "искусственной жизни"

Оглавление

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

Что бы понять, о чем здесь речь, стоит прочитать первую статью
Создание своих миров с "искусственной жизнью" на компьютере

У каждого бота есть код, управляющий его поведением. Это цепочка из 64 чисел, которые находятся в диапазоне от 0 до 63.
Именно этот код является геномом, который передаётся потомкам. При этом могут возникать ошибки (мутация), какое то число в цепочке меняется на другое случайное число.

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

Была задача придумать код для генома и интерпретатор, выполняющий его. Получилось достаточно удачно.

код-геном

Итак, геном бота - это цепочка из 64 ячеек и указателя (далее УТК), который указывает на одну из ячеек. В каждой ячейке записано какое то число от 0 до 63. Многим числам присвоена какая-нибудь команда, которую бот должен выполнить.

Интерпретатор считывает число из ячейки, на которую указывает УТК
и если числу присвоена команда, то запускается функция, которая выполняет эту команду и переносит УТК в новое место.

Если числу не присвоена команда, то это число автоматом считается безусловным переходом и интерпретатор увеличивает УТК на это число.
Если
УТК вышло за пределы цепочки, то из него вычитается 64, то есть цепочка генома представляет из себя замкнутое кольцо.

Здесь во всех ячейках записано число 23, это команда фотосинтез. Это геном самого первого бота, запущенного в мир.
Здесь во всех ячейках записано число 23, это команда фотосинтез. Это геном самого первого бота, запущенного в мир.

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

Простые команды без параметров

Рассмотрим пример. УТК указывает на ячейку, где записано число 23. Числу 23 соответствует команда "фотосинтез". Во время её выполнения бот получает энергию в соответствии с глубиной, на которой он находится, а УТК увеличивается на 1 (указывает на следующую ячейку). В следующий раз выполниться команда из следующей ячейки.

Допустим, в следующей ячейке было число 63 (смотри рисунок ниже) . Этому числу не присвоено никакой команды, поэтому интерпретатор считает его безусловным переходом и увеличивает УТК на это число.
Теперь
УТК указывает на предыдущую ячейку и следующей командой будет 23 - "фотосинтез".

Пример простой команды
Пример простой команды

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

Простые команды с параметром

У нас в ячейке может быть число от 0 до 63, то есть максимальное количество команд - 64. Это маленькое число и, что бы сэкономить числа, используются команды с параметром. Например, есть 8 направлений, куда может повернуть бот и вместо 8 команд мы используем одну, а направление берём из параметра.

Простая команда с параметром.
Простая команда с параметром.

Числу 25 присвоена команда "повернуть". Что бы узнать направление поворота, считывается число из следующей ячейки, делится на 8 и берётся остаток от деления. Получается 8 направлений.

Также команда "повернуть" увеличивает УТК на два, перепрыгивая параметр.

Стоит заметить, что ячейка, число из которой использовалось как параметр, в следующий раз может оказаться командой или смещением.
Это усложняет анализ кода человеком, зато интерпретатор очень прост в реализации.

Команды с условными переходами

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

Команда с параметром и условными переходами.
Команда с параметром и условными переходами.

Числу 33 присвоена команда "проверить количество энергии". Что бы узнать уровень, с которым будем сравнивать количество энергии, берём число из следующей ячейки.

Энергии у бота в моём мире может быть от 0 до 1000, а в ячейке может быть число от 0 до 63. Что бы уровнять эти диапазоны, мы умножаем число из ячейки на 15 и сравниваем количество энергии у бота с этим числом.

Если энергии больше, то УТК увеличивается на число взятое из ячейки УТК+2, если энергии меньше, то УТК увеличивается на число, взятое из ячейки УТК+3. Теперь поведение бота не линейно и пойдет разными ветками в зависимости от количества накопленной энергии.

Рассмотрим ещё один пример. Числу 26 присвоена команда "сделать шаг". Из следующей ячейки берется параметр для вычисления направления. А в следующих пяти ячейках содержаться смещения для УТК в зависимости от того, что находиться в том направлении, куда бот хочет сделать шаг.

Команда с параметром и условными переходами.
Команда с параметром и условными переходами.

Кстати, в примерена рисунке, если в той клетке куда собирается шагнуть бот, было пусто, то УТК увеличится на 0, то есть опять выполнится команда "сделать шаг". Получился цикл и он будет выполняться, пока бот не встретит препятствие.

Итоги

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

Некоторые моменты.

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

Код-геном бота выполняется, пока не будет выполнена замыкающая команда, такая, как "шагнуть", "съесть", "поделиться энергией" и подобные, но не более 15 команд. Потом управление передаётся следующему боту в цепочке.

Видео, с разбором проекта.

На этом пока всё.

Подписывайтесь на канал,
ставьте лайки,
пишите в комментариях ваши мысли и идеи.

foo52ru