1677

Симулятор эволюции на Unity + исходный код

Здравствуйте, товарищи.

Так уж сложилось исторически, что я люблю разного рода извращения. И вот к чему меня это привело в этот раз:
Я написал симулятор эволюции, используя Unity.

Суть происходящего:
В замкнутую среду помещается клетка, обладающая собственным геномом, состоящим из 64 случайных команд, расположенных в случайном порядке. Клетка выполняет все свои действия в соответствии с геномом. В зависимости от результата выполнения очередной команды, заложенной в гене, клетка переключается на команду в другом гене. Клетки живут в аквариуме, на который светит солнце. Клетки могут фотосинтезировать, чтобы восстанавливать свою энергию. Когда клетка накопит достаточное количество энергии - она делится. Если клетке пора делиться, но она со всех сторон окружена (нет свободного места) - клетка умирает, превращаясь в питательный трупик, который могут сожрать другие клетки.
Если у клетки заканчивается энергия - она умирает, не оставляя за собой трупа. Клетки могут жрать друг друга, и распознавать, родственник перед ними, или нет. При рождении каждой новой клетки есть 25% шанс, что один из её генов мутирует (одна из команд в алгоритме поведения изменится на другую случайную команду). Когда клетка фотосинтезирует - она зеленеет, когда жрёт органику - краснеет.


Всего клетка может выполнять 7 команд:
1 - смотреть прямо перед собой
2 - поворачиваться
3 - двигаться вперёд
4 - жрать объект перед собой
5 - фотосинтезировать
6 - проверять, сколько осталось энергии

7 - размножаться



На следующей гифке изображён аквариум, в котором живёт одна клетка, все гены которой заполнены одной командой - фотосинтез, поэтому она бесконтрольно размножается, оставляя за собой кучи задавленных трупов. Но в какой-то момент появляются клетки-мутанты, которые начинают двигаться и питаться органикой:

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

На следующей гифке я поэкспериментировал с гравитацией, сделал так, чтобы трупы опускались на дно. От затеи пришлось отказаться, потому что fps, который и так довольно сильно проседал, сморщился ещё сильнее, как-будто его в ледяную воду опустили:

Ну и посделедняя гифка. На ней в аквариуме практически сразу появились хищники:

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

Критика по поводу кода принимается. Особенно буду рад услышать советы по оптимизации от компетентных людей.

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

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

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

42
DELETED
Автор поста оценил этот комментарий
"Всего клетка может выполнять 7 команд:
1 - смотреть прямо перед собой
2 - поворачиваться
3 - двигаться вперёд
4 - жрать объект перед собой
5 - фотосинтезировать
6 - проверять, сколько осталось энергии
7 - размножаться"
Вся моя жизнь в 7 пунктах.
раскрыть ветку (1)
76
Автор поста оценил этот комментарий

Фотосинтезируешь небось?

показать ответы
98
Автор поста оценил этот комментарий

Ссылка на исходник:
https://github.com/tyzegt/AlmostEvolution/

показать ответы
DELETED
Автор поста оценил этот комментарий
Выглядит интересно, только это скорее симулятор рандома, нежели эволюции, ведь все "случайные команды" заданы изначально(?) И меняются они не на основе эффективности предыдущей команды, а просто так. Тогда это просто визуализация алгоритма случайных чисел Unity.
раскрыть ветку (1)
8
Автор поста оценил этот комментарий

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

показать ответы
0
Автор поста оценил этот комментарий
Почему такой низкий fps? Для появления и удаления клеток вы используете Instantiate и Destroy или пул?
раскрыть ветку (1)
7
Автор поста оценил этот комментарий

Instantiate и Destroy, да. Если я правильно понял, о каком пуле речь, (заранее созданные неактивные объекты на сцене, которые активируются и перемещаются на нужную позицию и деактивируются, когда их нужно убрать), то такой пул не совсем подходит. Обычное количество клеток в аквариуме - порядка трёх тысяч, не считая трупы. Максимальная ёмкость аквариума - 8000 клеток.

показать ответы
Автор поста оценил этот комментарий

На Unity! На Unity, Карл! Зачееем?!?!?? Из пушки по воробьям? Достаточно HTML+CSS+JS!

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

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

1
Автор поста оценил этот комментарий

Уже было.
https://www.youtube.com/watch?v=jXa5IASmlkg
На это канале найдёшь ещё 3 видео на эту тему.
Не удивлюсь, если это и подтолкнуло, очень уж похоже.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Это и подтолкнуло. И очень похоже внешне. Исходников того, что представлено в видео, я не видел, но могу со стопроцентной уверенностью сказать, что реализация у нас очень разная. И в прошлом посте про генетические алгоритмы я писал, что один из видосов на этом канале меня к затее и подтолкнул.

0
Автор поста оценил этот комментарий

а как запустить?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Скачать исходники, открыть их в юнити, скомпилировать, запустить :)

показать ответы
14
Автор поста оценил этот комментарий
colliders = Physics2D.OverlapCircleAll(sensor.position, 0.1f);

Тут не в пуле дело

Каждая клетка, каждый кадр вызывает эту функцию, конечно тут будет низкий fps
Попробуйте двумерный массив вместо подобного поля


Не надо трогать физику!

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Была такая мысль. Скорее всего однажды к ней вернусь. Но вот так бывает, загорелся идеей - и надо срочно сделать хоть как-то, лишь бы работало :)

показать ответы
0
Автор поста оценил этот комментарий

В чем существенные отличия от Game of Life?

https://ru.wikipedia.org/wiki/%D0%96%D0%B8%D0%B7%D0%BD%D1%8C...

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Проще сказать, в чём сходства. Достаточно прочитать раздел "Правила" в статье по ссылке, и сравнить с тем, что описано в этом посте.

2
Автор поста оценил этот комментарий

@Neptun, пожалуйста, добавляйте себе в проекты .gitignore файлы.
Для Unity можно взять темплэйт вот тут:
https://github.com/github/gitignore/blob/master/Unity.gitign...

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Принял к сведению.

0
Автор поста оценил этот комментарий

Когда делал когда-то свою проверку пересечений, делил экран на области и проверял среди 9 ближайших квадратов. Может, сейчас это встроено в Юнити как-то?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

В юнити много разных способов проверки пересечений, но @sarcasman прав, все они в данном случае неэффективны и потратят больше ресурсов, чем банальная проверка восьми ячеек двумерного массива.

Автор поста оценил этот комментарий

Не, с алгоритмами-то понятно. Непонятно другое (только это и не понятно): в той игре нужно точки соединить линиями. Эти точки являются GameObject-ами? Или это на канвасе рисуется, ну типа как в андроиде на канвасе drawShape() и всё такое?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Я бы всё делал через GameObjectы. В юнити крайне просто и удобно ими манипулировать.

показать ответы
0
Автор поста оценил этот комментарий

О, круто. Ну вот слушай. Я в Unity полунуб, но пытаюсь овладеть им. И вот незадача, приспичило мне написать игру наподобие этой https://play.google.com/store/apps/details?id=com.zerologicg.... Вот я всем задним механизмом чую, что это не особо сложно, но просто не знаю с какой стороны копать? С чего начать учить? На чем рисовать? Как рисовать эти точки и линии, ну в смысле, использовать GameObject и LineRenderers или еще каким образом?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Здесь вопрос скорее не про юнити, а про алгоритмы. Начать учить проще всего с видосов на ютюбах, про рисование не совсем понял вопроса. Могу точно сказать, что все вопросы сами собой развеиваются с опытом. Нужно просто брать и делать, практиковаться.

показать ответы
0
Автор поста оценил этот комментарий

Товарищ, я смотрю ты с Unity дружишь, сможешь откликнуться на парочку вопросов?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Зависит от вопросов. Могу попытаться.

показать ответы
0
Автор поста оценил этот комментарий

Можешь для нубов пояснить как запустить сие?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Скачать и открыть проект в юнити.

1
Автор поста оценил этот комментарий

Поясни пжлст суть происходящего тут:


// переход

else if (genome[controller] > 12)

{

controller += genome[controller];

return;

}


Зачем индекс текущей команды в геноме сдвигается на значение команды? Далее еще есть похожие места, где индекс команды увеличивается на 2-3-4, т.е. команды пропускаются. Так же не понимаю, зачем это.


И по размножению вопрос. Чем отличается деление от родов? Оба действия доступны только если хватает энергии, но при этом деление происходит независимо от генома, а роды только по достижению нужной команды. При этом родов по факту не происходит никогда, т.к. если энергии хватает, то клетка делится и при этом теряет половину энергии.

Второй вопрос по размножению - насколько я понял, доступное место для новой клетки всегда начинает подбираться в одном и том же направлении, т.е. в идеале когда вокруг никого нет, новая клетка появляется с одной и той же стороны от клетки-родителя. Если это действительно так, то лучше бы переделать, иначе "колония" будет плавно утекать всегда в одном и том же направлении

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Переход - это переход. Индекс переходит на заданное значение. Это нужно для того, чтобы у клеток была возможность составлять сложные алгоритмы поведения, чтобы в качестве реакции на разные события индекс переходил на разные команды.


Роды и деление - одно и то же, только одно происходит по команде, а другое при достижении максимума энергии.


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

показать ответы
0
Автор поста оценил этот комментарий

Автор, а ты планируешь продолжать развивать данный проект? И не против ли, если я маленько подшаманю с оптимизацией?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Пока что не планирую продолжать. На счёт оптимизации - я же не просто так исходники выложил, можешь делать с ними всё, что хочешь =)

показать ответы
0
Автор поста оценил этот комментарий

Ну не будешь же ты драйвер OpenGL сам делать или драйвер видеокарты? Любой движок работает с готовыми библиотеками DX или OpenGL, поэтому и быстро получается. Я вот сейчас SFML пытаюсь освоить, он тоже к OpenGL обращается. Сначала хотел за SDL взяться, но потом погуглил и решил, что SFML немного лучше, может и субъективно.

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Я имел в виду, что хочу совсем без графония обойтись по возможности.
Как вот здесь, например: http://178.141.253.94/bacs5.php

Или что-нибудь клиент-серверное сделать.

показать ответы
0
Автор поста оценил этот комментарий

Была мысль сделать что-то подобное, но всё руки не доходили. Хотел представить каждое существо в виде небольшой виртуальной машины, с Тьюринг-полным набором команд и чтобы их код генетически менялся, чтобы выживали существа с полезным(часто используемым) набором команд. Чтобы существа объединялись для достижения какой-то цели (распознавание текста с оракулом) или изображения с веб-камеры.

Планируете рефакторинг?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

показать ответы
0
Автор поста оценил этот комментарий
Как раз недавно смотрел на ютубе канал чела, который написал эволюцию, по такой же логике. "Набор команд из списка в случайном порядке" (не могу сейчас с мобильного найти). Только реализовал на с или ассемблере
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Идея не новая, много кто её реализовывал в той или иной степени. И я вполне понимаю почему - это очень увлекательное занятие :)

0
Shit happens
Автор поста оценил этот комментарий

ТС, а что ты можешь посоветовать мне? Я писал подобную штуку, только система была другая - последние 9 выживших клеток давали потомство по 10 штук каждая. И проблема в том, что уже поколению к 10му все родившиеся клетки имели одинаковый геном, даже мутанты не спасали. На них тупо было не интересно смотреть. Я и количество безусловыних переходов в геноме увеличивал, и цикл жизни. Один эффект - на 8-12 поколении все, кто есть, шагают как рота солдат на параде.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Я, если честно, даже не знаю. Я тоже делал похожую вещь, но у меня там в разных "мирах" получались боты с разными моделями поведения.

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

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества