- PVSM.RU - https://www.pvsm.ru -
Приветствую вас, читатели!
Недавно прочитал статью про игру Жизнь [1], и вспомнилось мне, что я в мае этого года начинал писать свой проект [2] подобной направленности. Только вот интерес к нему за рутиной работы быстро угас, хотя написано было немало. И сейчас, вдохновлённый этой статьёй, я взял этот проект с пыльной полки и добавил несколько фич, о которых расскажу далее.
Вкратце, мой вариант [2] имеет следующие условия:
Кому интересны подробности, прошу под кат!
Программу я обозвал Evo [2] (git [6]), поскольку изначально планировалось, чтобы организмы там эволюционировали. Но ничто не мешает самому описать алгоритм поведения живности и подгрузить его в программу. На текущий момент только правкой кода (в MainWindow::MainWindow()), но загрузка живностей будет реализована в скором времени.
Evo написана на С++/Qt. Работоспособность проверена только под Linux, хотя программа должна работать на любой платформе, которая поддерживается библиотекой Qt.
Для получения бинарника достаточно выполнить:
git clone git@github.com:icoz/evo.git
cd evo
qmake
make
Для пользователей Windows я собрал бинарник, только скорее всего он уже устарел. Поэтому рекомендую поставить QtSDK и собрать проект из исходников.
Итак, при старте появляется окно с несколькими кнопками.Стартуем и наблюдаем как поле заполнилось цветами.
Поясню, что какой цвет имеет:
При старте генетический код живности генерируется с помощью ДСЧ. Так что никакого волшебства нет. Правда, позже волшебство появляется! Что-то произвольно сгенерированное начинает ползать, жрать друг друга, да и подножный корм тоже.
Есть несколько простых правил:
Логическое разбиение следующее.
Поле (класс Map) реализует функции хранения и перемещения объектов, а также фукнцию разбрасывания заданного количества пищи.
Мир (класс World) описывает взаимодействие живностей с окружающим миром.
Живности (экземпляры класса Animal) являются автоматами, программой которого является «генетический» код (и напомню, что каждая особь имеет память и возможность складывать и вычитать в уме). В процессе исполнения этого кода организм принимаетте или иные решения. Мир обрабатывает эти запросы (всё это реализовано посредством системы сигналов/слотов).
В случае приемлимого поведения живность премируется повышением параметра fitness. За поглощение травы fitness увеличивается на 1, за поедание другой живности — +10, за размножение — +50. Чем выше значение fitness, тем более успешен организм. Фактически, этот параметр описывает живучесть организма. Кстати, жду Ваших предложений по введению новых правил, чтобы усложнить этим милым существам жизнь и заставить их придумывать что-то новое.
Реализовано всё это безобразие так:
Хочется отметить, что была проведена работа по оптимизации работы программы, чтобы она не поглощала тонны ресурсов. Но ввиду специфики её работы — проц она загружает сильно. Самое медленное — это отрисовка кадра, поэтому по умолчанию отрисовка производится только каждый 100-й раунд.
При сохранении живности сохраняется не только бинарный код, но и создается текстовый файл с расширением *.code, в котором приведена расшифровка этого кода.
Список пожеланий таков:
Список предстоящих изменений таков:
Пока начинал писать эту заметку у меня в фоне крутилась эта программка (на пеньке четвертом и не было проведено оптимизаций по скорости работы). На тот момент я достиг для живности значения fitness = 3441. Для этого у меня пожило и умерло более 210000 особей, и прошло более 6500 раундов.
Для получения действительно интересных живностей, которые чего-нибудь интересное умели, надо (по моим оценкам) не менее 10^6 раундов. Может у кого комп помощнее, покрутит? Но интереснее, конечно, станет когда будут реализованы генетические алгоритмы и более интеллектуальный генератор первоначальных наборов. Ну и при дополнении генерируемых живностей особями, написанными живыми людьми. Это даст неплохой старт для следующих поколений.
Погоняв же программу на core i5 я довольно быстро получил гуляющие стада. Живучесть уже достигала 10390 единиц!
Интересно наблюдать за этими милыми тварюшками. Даже сопереживать начинаешь им.
Напоследок вот несколько интересных «жизненных» картинок. Видны пути миграции популяций, образование стад.
Самый серьёзный результат — 36480 (это после 10 часов работы и 2*10^6 раундов):
Качайте, запускайте, наблюдайте!
Кому интересно, можете сами попробовать написать ботов и посмотреть, кто сильней!
На этом всё. Спасибо за внимание!
Баг-репорты и предложения новых фич приветствуются.
UPD: мутация уже реализована на базовом уровне.
Автор: icoz
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/algoritmy/18160
Ссылки в тексте:
[1] игру Жизнь: http://habrahabr.ru/post/154015/
[2] свой проект: https://github.com/icoz/evo
[3] машину Тьюринга: http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%A2%D1%8C%D1%8E%D1%80%D0%B8%D0%BD%D0%B3%D0%B0
[4] Автомат с магазинной памятью: http://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82_%D1%81_%D0%BC%D0%B0%D0%B3%D0%B0%D0%B7%D0%B8%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C%D1%8E
[5] полная по Тьюрингу: http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%BF%D0%BE_%D0%A2%D1%8C%D1%8E%D1%80%D0%B8%D0%BD%D0%B3%D1%83
[6] git: http://git@github.com:icoz/evo.git
[7] map.h: https://github.com/icoz/evo/blob/master/map.h
[8] map.cpp: https://github.com/icoz/evo/blob/master/map.cpp
[9] world.h: https://github.com/icoz/evo/blob/master/world.h
[10] world.cpp: https://github.com/icoz/evo/blob/master/world.cpp
[11] animal.h: https://github.com/icoz/evo/blob/master/animal.h
[12] animal.cpp: https://github.com/icoz/evo/blob/master/animal.cpp
[13] mainwindow.h: https://github.com/icoz/evo/blob/master/mainwindow.h
[14] mainwindow.cpp: https://github.com/icoz/evo/blob/master/mainwindow.cpp
Нажмите здесь для печати.