- PVSM.RU - https://www.pvsm.ru -
Приветствую вас, читатели!

В продолжение поста «Аналог игры «Жизнь» — Evo» [1] хотелось бы дать более подробное описание команд «языка генов», который используется в Evo [2], и поделиться своими соображениями по методам скрещивания особей в этой игре.
Генетический код особей в Evo [2] представляет собой последовательность байт практически неограниченной длины. При этом каждый байт трактуется как команда для клеточного автомата. У автомата 2 ленты: команд и памяти. Соответственно есть два указателя cmd_ptr и mem_ptr. В качестве ОЗУ животного используется переменная data, размерностью в 1 байт (8 бит).
На текущий момент есть следующие команды:
В принципе такого набора команд достаточно, чтобы делать циклы и ветвления. Другой вопрос, что описывать алгоритмы на таком языке не так удобно, как на С++, например.
Но для примера покажу Вам программу, которая заставляет живность двигаться по квадратной спирали:
start
action_split
load_from_mem //load from var1
move_mem_right //save var2
data_dec
save_to_mem
move_mem_right //save to var3
data_dec
save_to_mem
//right
action_move_right
data_dec
jump_to_ifnz
AnimalCommand(-3)
//up
load_from_mem
data_dec
save_to_mem
action_move_up
data_dec
jump_to_ifnz
AnimalCommand(-3)
//left
load_from_mem
data_dec
save_to_mem
action_move_left
data_dec
jump_to_ifnz
AnimalCommand(-3)
//down
load_from_mem
data_dec
save_to_mem
action_move_down
data_dec
jump_to_ifnz
AnimalCommand(-3)
//dec var2
move_mem_left
load_from_mem
data_dec
save_to_mem
jump_to_ifnz
AnimalCommand(-33)
move_mem_left // restore var1
end;
В память же загружаются 3 значения: 10, 0, 0. Алгоритм пояснять не буду. По-моему всё довольно очевидно.
Этот код вы можете найти в mainwindow.cpp [3]:117.
Мутации в игре сейчас реализованы так. По желанию организма размножиться клонированием с мутацией создается клон. Клон подвергается мутациям в количестве от 0 до 9 (на усмотрение великого рандома). Для каждой мутации великий рандом выбирает один из 4 вариантов:
Теперь перейдём к размышлениям о том, как нам скрещивать два организма. Их код может быть разной длины, они могут иметь разную память.
Вот пожалуй и все варианты, которые сходу приходят мне в голову. Над наследованием памяти ещё не думал.
А! Вот ещё о чем забыл. Как вы считаете, что лучше?
Размышлений на тему не густо, конечно, но я надеюсь на богатое воображение читателей.
Спасибо. Жду отзывов.
Автор: icoz
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/algoritmy/18192
Ссылки в тексте:
[1] поста «Аналог игры «Жизнь» — Evo»: http://habrahabr.ru/post/156085/
[2] Evo: https://github.com/icoz/evo
[3] mainwindow.cpp: https://github.com/icoz/evo/blob/master/mainwindow.cpp
[4] коммит: https://github.com/icoz/evo/commit/fbb4060c6829caaa43cdadaf785dcfbfe938b942
Нажмите здесь для печати.