В доисторический период (до перехода) большинство само-модификаций происходят на концах ленты с редкими мутациями в середине. Некоторые ленты полностью перезаписываются повторяющимися символами. Распределение символов устаканивается в районе стационарного с тенденцией к определённым операторам брейнфака. Сложность супа низкая. В эпоху номер 2355 в результате сложной перезаписи появляется первый репликатор (картинка 3 разбирает как именно на уровне кода это произошло). Небольшое число байт сохраняется на ленте с первой эпохи, но большая часть скопирована с другой ленты. У репликатора есть определённая симметрия. Сложность бульона начинает расти. Репликатор вскоре перезаписывает себя содержимым другой ленты, но его копии выживают. Затем лента перезаписывается снова, на этот раз повреждённым обратным репликатором. На концах ленты начинают появляться нули, это признаки “отравления нулями” (zero-poisoning) всего супа, поскольку оригинальная версия репликатора могла копировать нули, но не могла их перезаписывать, что вело к мультиплицированию этого добра в супе. Репликация стагнирует и сложность падает. 14% супа -- нули. Вскоре другой репликатор возникает в супе и начинает доминировать. У него более устойчивая структура, способная перезаписывать нули. С этого момента в супе постоянная движуха: куча разных репликаторов, постоянно друг друга перезаписывающих. Они содержат много токенов из оригинального репликатора, но в различном порядке. Сложность супа увеличивается сначала быстро, а затем медленно, но устойчиво. В пике примерно 80% токенов происходят с одной ленты. Авторы отдистиллировали пример репликатора, на него можно посмотреть на картинке 4, а также в этом видео. Эволюция сложности Эволюцию сложности анализировали на 1000 разных запусков с одинаковыми гиперпараметрами. Энтропия высокого порядка стабильно увеличивается в течение первых 1000 эпох, чтобы (в среднем) уменьшиться снова с отличным от начального распределением (которое было равномерным). Есть красивая визуализация на картинке 5. Чем больше эпох, тем выше вероятность перехода. Стабильные само-репликаторы возникают в 40% запусков в течение 16000 эпох. Некоторые особенно удачливые запуски получают фазовый переход практически сразу. Дефолтная частота мутаций была 0.024%, и в общем её увеличение ускоряет появление репликаторов (хотя не скажу, что по картинке 6 это прям заметно). Но и с отключенной мутацией фазовый переход случается примерно с той же частотой, так что дело явно не просто в мутации. Она может ускорять процесс, но она не необходима. Забавно, что при 1% мутаций возникновение репликаторов сильно деградирует. Отдельно проверили влияние случайной инициализации. Насколько вообще вероятно, что репликатор будет присутствовать уже при инициализации? Это не так просто понять, ибо репликатор может быть не просто копировщиком целой строки, но может являться частью более сложного автокаталитического набора. В любом случае репликатору требуется время для захвата всего супа и в процессе он легко может быть уничтожен. В 50% случаев одиночный само-репликатор будет в правой половине ленты и он может быть уничтожен кодом с левой половины. Да ещё и случайные мутации могут попортить. На рисунке 7 сравнивают несколько разных типов запуска: долгий (обычный на 16к эпох) -- примерно 40% таких запусков создали саморепликатор; короткий (128 эпох, достаточно времени для захвата супа, если репликатор уже был в инициализации, но он может быть уничтожен или возникнуть заново) -- очень редкое событие, 0.3%; подсаженный/seeded (на старте подселяют один созданный вручную репликатор и выполняют 128 эпох) -- 22% успеха, то есть 1 из 5 репликаторов выживает; долгий без шума (обычные 16к эпох без мутаций и с фиксированной последовательностью паттернов перемешивания, чтобы не увеличивать общую энтропию системы) -- оказывается ещё лучше, примерно в 50% случаев получаем переход. Из всего этого выводы, что само-репликаторы возникают в основном из само-модификации и взаимодействия между программами, а не просто из-за инициализации и мутаций.