Так вот Марков выкатил новую свою работу «Коэволюция мозга и культуры», абстракт на элементах, доклад на ютубе и оригинал в рецензируемом журнале на басурманском наречии. И мне захотелось поиграть его моделями и пооптимизировать его код. К чему я вас и приглашаю.
Суть работы если коротко, в гипотезе, что изобретение новых интересных мемов повышает эволюционный спрос на большой мозг, а большой мозг в свою очередь позволяет знать больше интересных мемов — навыков полезного поведения. И уж коли нашлась экологическая ниша где интересных мемов — может быть много то начинается самоподдерживающийся процесс, от которого наш мозг раздуло как фурункул на попе наших менее удачливых конкурентов в эволюционной гонке.
Для того чтобы этот процесс показать была написана на C# моделька, в которой сотни особей живут, умирают, передают друг-другу гены, изобретают всякие мемы, и учатся им друг у друга. Искусственная жизнь умеет совместно охотиться или отлынивать от работы, убеждать соплеменников отдать больше совместно нажитой добычи, учиться более эффективно охотиться и кооперироваться с другими охотниками. Конкурировать с соседними племенами за еду. Хотеть и уметь учиться у других, а так же хотеть и уметь учить. Стремиться наказывать халявщиков не желающих охотится, и отдельно учится определять того ли ты наказал. Ещё будущие геты умеют заниматься всякой бессмысленной фигнёй, и отращивать себе память в мозгу. Всё это они умеют как в виде генов, которые они передают потомству при заведении виртуальных детёнышей, так и приобретая соответствующие приёмы — мемы, которые живут в популяции свой жизнью, используя мозги обитателей симуляции как свою среду обитания. В общем запуская симуляцию вы делаете примерно то же самое, что забыв в раковине не помытую посуду — ставите эволюционный эксперимент. Только с графиками и возможностью сравнить свои результаты с результатами серьёзных учёных.
В общем, хватит заниматься пересказом, лучше сходите и посмотрите оригинальный доклад.
Часть первая, про Оптимизацию.
Make it work, Make it right, Make it fast! © Kent Beck
Автором симулятора был сын нашего учителя Михаил JellicleFencer Марков. В комментариях под статьей он выложил ссылку на репозиторий: jelliclefencer.visualstudio.com/_git/TribeSim. Написать то он её написал, причём так чтобы происходящее внутри было понятно любому биологу без комментариев. Но времени на то чтобы заниматься оптимизацией у него явно не было. В результате залезши внутрь я в порядке хобби ускорил работу симуляции в 10-20 раз даже не прибегая к unsafe коду и прочим излишествам и потрогав пока только половину тормозящих мест. Читаемость снизилась, надеюсь, не критично. Азур меня почему-то не любит, поэтому я форкнулся на гитхаб вот сюда: github.com/kraidiky/TribeSim и там можно по коммитам проследить как я отъедал в куче мест по 5-15% прироста.
Я планирую ещё какое-то время продолжить этим заниматься и приглашаю желающих поучаствовать в этом занятии. Для этого надо форкнуть репозиторий, сделать коду хорошо, после чего отправить Pull Request. Честно то говоря никогда раньше так не делал за больше чем 20 лет программистской карьеры. Так что если я что-то делаю неправильно — поправляйте.
Только давайте с развёрнутыми комментариями, без unsafe и экстримизма. Представьте, что читать и использовать этот код предстоит универовскому профессору, у которого в руках ваша зачётка. 🙂
Александр Владимирович планирует дальше развивать эту модель. С Михаилом я связался, он теперь контребьютор в этом репозитории, так что оптимизация, которая для вас всего лишь развлечение и хобби сможет реально помочь науке, а Маркову-старшему высвободит ещё чуточку времени и возможно он запишет ещё какой-нибудь шикарный ролик наподобие «Эволюционной биологии любви«.
Есть ещё одно занятие, которое я давно хочу: стримы с разбором кода. Это как транслировать свои игры в твиче, только с аудиторией в 1000 раз меньше. :)))
Вот в среду вечером можно будет присоединиться к трансляции, и увидеть как я медленно открываю дифы своих коммитов, плавно двигаю по ним мышкой и тихим голосом рассказываю, почему я сделал именно так, а не иначе.
Я не большой спец по оптимизации, со мной в моей жизни работали люди сильно покруче, но среднего уровня программист на C# наверняка вынесет для себя кучу полезного. Потому что примерно то же самое я вижу не только в домашних проектиках в свободное время, но и в больших игровых проектах с миллионными бюджетами.
Часть вторая, про Биологию.
Настройки программы хранятся в файлах *.trsim, и в репозитории я оставил только два использующихся для измерения производительности кода, Один с минимальным набором фич и другой в котором всё, кроме комплексной культуры и сбора статистики наоборот включено. Оба файла используются для профилирования, поэтому в них стоит галочка не использовать многопоточность. Не забудьте снять если решите заняться своими экспериментами на их основе. Попрошу ещё Михаила подкинуть парочку trsim-ов соответствующих экспериментам описанным в статье, если они у него сохранились. Примеры заполнения настроек программы использовавшиеся Марковым-старшим для статьи можно можно посмотреть в приложении к оригинальной статье, правда не в виде файла а в виде текстовых табличек, и написаных по буржуински.
Если вам интересно позапускать симуляцию с разными настройками и посмотреть какую культуру вам вырастит свой собственный легион Гетов — добро пожаловать в комментарии. Выкладывайте свои trsim-ы, показывайте графики с наблюдениями и сравнениями, какие ваши изменения приводят к каким эффектам. Удалось ли воспроизвести результаты показанные Марковым к статье? Какие опыты вы бы сами хотели поставить?
Я хотел тут расписать значение всяких параметров модели, но это длинно и не очень интересно. Вместо этого поставьте брейкпоинт в функции World.SimulateYear, загрузите trsim allFeatures и пройдите один год симуляции по шагам. Сразу поймёте что там к чему и зачем.
Часть третья, про Мечты.
У меня вот есть такой опыт мечты, я сейчас закончу с оптимизацией и попробую его прикрутить к симулятору, чтобы посмотреть при каких параметрах то о чём я давно раздумываю действительно имеет смысл:
Представьте, что не во всех комбинациях мемы одинаково полезны. Существуют мемплексы — комплексы мемов которые взаимно дополняют друг-друга и дают хороший результат. Но если смешать шаблоны поведения из двух разных культур, отвечающие за решение одних и тех же задач, может изредка получится оригинальный симбмоз, но чаще всего получается неработоспособная каша.
В генетике такое представлено в полный рост, неспособность дать плодовитое потомство является самым простым критерием вида, лишь иногда дающим сбои в виде лигров. Мало кто знает, что то же самое наблюдается и внутри одного вида. Некоторые существа научились оценивать своё генетическое расстояние до потенциального партнёра и корректировать в связи с этим свои репродуктивные стратегии. Самый запомнившийся мне пример, когда дрозофилы оказавшись в состоянии пищевого стресса чаще выбирают в партнёры своих ближайших родственников, я ссылочки сейчас найти не могу, к сожалению, может позже отыщется. Но интересно что поведение мух очень логично, близкородственное скрещивание позволяет легче проявится странным рецессивным мутациям среди которых может найтись что-то полезное в сложившейся непростой жизненной ситуации. Люди селекционеры поступают точно так же. И мухи не только научились узнавать степень родства, но и научились этим пользоваться. Вообще не стоит мушек недооценивать. Строго показано, что у них может вырабатываться культура и передаваться из поколения в поколение.
В статье Маркова и Куликова (см. обзор: «Видообразование — личное дело каждого» ) описывается распространённое сейчас предположение, что оценка генетического расстояния делается по запаху молекул имунной системы и приводятся примеры других животных которые так умеют. Например рыбы колюшки и мы с вами. Некоторые исследования показывают что люди с помощью вомероназального органа способны по запаху неосознанно оценить потенциального партнёра на степень родства — слишком близкие и слишком далёкие непривлекательны на запах. Есть правда и другие исследования. Тема продолжает изучаться.
Так вот, возвращаясь к мемам: комплексы взаимодополняющих и взаимно мешающих шаблонов поведения очевидно есть, и у меня есть предположение, что как и в генетике люди научились определять на сколько сильно по меметическому базису отстоит от них потенциальный пример для подражания, и соответственно этому легко перенимать его стереотипы поведения или же напротив всесторонне его мемы проверять и изучать с сильно меньшей скоростью. Предполагаю, что этот механизм позволяет при отсутствии репродуктивной изоляции поддерживать некоторую целостность мемплексов. Или наоборот некоторый небольшой процент населения может предпочитать заимствовать чужую культуру, становясь для эволюции мемов — чашками петри для изолированных экспериментов по заимствованию. Хочется убедиться, что в определённых условиях такое разделение «свой-чужой» может быть чрезвычайно полезно. Если это так внезапно получается, что разделение людей на своих и чужих, причём именно без учёта генетической составляющей не только вредная ксенофобия, но и очень полезная особенность, нужная для развития эффективных культур. Будучи подтверждённым такое предположение имело бы огромную не только биологическую, но и культурную и политическую значимость.
А есть ли у вас какие-нибудь интересные идеи, которые можно проверить в моделировании с помощью марковского симулятора после небольшой доработки. Делимся идеями, обсуждаем в комментах.
Часть третья, про Сингулярность.
Сам Александр Владимирович оговаривается, что в их модели не получилось увидеть стремительного гиперболического разгона мощности культуры, свойственного истории человечества. Также он упомянул, что есть идея поискать условия такого роста в виде комплексов взаимно усиливающих друг друга мемов. У меня же есть несколько иное предположение. Посмотреть про сингулярность можно очень меня вдохновившее выступление Панова на GF2045. А с ещё более скептическим взглядом ознакомиться в паре статьей Сергея Карелова «Техносингулярность становится технорелигией» и её второй части.
Ну так вот. Кроме того что наша культура развивается со всё более нарастающим темпом, точно то же самое происходит с нашей численностью населения. Капица (младший) в своей книге «Парадоксы роста» показывает, что суммарная численность населения земли более легко предсказуема, чем численность населения в любой отдельно взятой стране, и долгие столетия, тысячелетия и десятки и сотни тысяч лет она росла по гиперболическому закону, пока несколько десятков лет назад не начала стабилизироваться и выходить на константу, причём демографический переход случается в том числе и в странах с самым разным уровнем развития экономики и самой разной культурой.
Можно предположить, что быстрый экспоненциальный, или гиперболический (их не так легко различить вдали от асимптоты) рост наблюдается до тех пор, пока наш вид не заполнил полностью экологическую нишу, в которой мозги способны приносить пользу.
Понятно, что чтобы это проверить, в первую очередь потребуется изменить зашитый в модель способ конкуренции за ресурсы. Сейчас буквально задано максимальное количество ресурсов, которое наши геты могут выжать из кормящей территории, и после короткого участка в самом начале эволюции развитие идёт только в том чтобы отжать больше ресурсов у соседнего племени. Реальная же палеолитическая революция радикально изменила продуктивность кормящего ландшафта и вместе с ней нашу численность. То есть с соседями надо конкурировать за контроль над условными гектарами земли, а сколько центнеров можно собрать со своего гектара определять с помощью дополнительной фичи, зависящей как от генов так и от мемов. Сейчас такой «Эффективности природопользования» нет, но её легко добавить в модель.
Проблема в том, что на нынешнем симуляторе этап роста численности толком не увидишь. Разумные скорости моделирования наблюдаются пока количество особей порядка тысяч, а начальная популяция обычно десятки-сотни. В реальности же наша численность на интересующем промежутке времени поменялась на 5-6 порядков. Вот что и как нужно поменять в программе чтобы можно было успешно смоделировать рост численности агентов на 5 порядков — вопрос конечно интересный. С удовольствием обсужу его в комментариях. Пока у меня из идей только какие-то сомнительные группировки похожих особей. Ну или всё нафиг переписать с нуля для вычислений на GPU с помощью CUDA. В общем если кому есть что сказать добро пожаловать в комментарии.
Заключение:
На этом творческий коллектив нашей передачи прощается с вами, и желает чтобы у вас тоже чесались руки поучаствовать в чём-то действительно важном, вместо того чтобы круглые сутки пилить интерфейсики для ограниченных потребностей, за которые нам всем платят ресусики сильно непропорционально нашей HuntingEfficiency.