Grabduck

Путешествия во времени и программирование 2: парадоксы

:


Эпоха путешествий во времени еще не наступила, а человечество уже давно пытается разрешить сопутствующие им парадоксы. Мы поговорим о самом очевидном из них: что же все-таки произойдет при вмешательстве в ход истории? Существует несколько вариантов того, как поток времени реагирует на действия путешественника из будущего. Эти модели можно увидеть в фантастических фильмах, о них все больше начинают говорить ученые, но какая модель ближе к истине — единого мнения пока нет. Мы только начинаем проникать в тайны времени, и еще не обладаем возможностью экспериментировать с перемещениями в прошлое. Что же можно прояснить в данном вопросе уже сейчас? Под катом нас ждет экскурсия по основам механики времени, мы порассуждаем о парадоксах, и проведем небольшой эксперимент. Да, это будет испытание виртуальной машины времени, построенной на основе алгоритма «Жизнь»!

Предыдущая статья цикла.

Если вы вдруг ничего не слышали о парадоксе дедушки, суть его в следующем: счастливый обладатель МВ улетает в прошлое, и своими действиями мешает собственному появлению на свет. Например, мешает знакомству своих родителей. В новом варианте истории путешественник отсутствует, нет его полета в прошлое – значит, история не меняется. Но тогда путешественник все-таки появится на свет, и в итоге полетит в прошлое… — замкнутый круг взаимоисключающих условий, поэтому и называется это парадоксом.

Примечание

Думаю, все понимают, что возникновение парадокса не привязано ни к бедному дедушке, ни к стиранию себя самого из истории. Путешественник может просто попросить себя молодого не заниматься изобретением машины времени (ага, так он и послушал!). Или отправить на 5 минут в прошлое записку «не отправляй записку». Суть одна: результатом полета в прошлое является отмена этого полета в прошлое.


Парадокс существует лишь как наше недопонимание того, как устроено время. Наверняка природа не допускает возникновения парадоксов, но как именно? Рассмотрим основные модели времени, отмечая их плюсы и минусы.

Модели

Модель 1: невозможность путешествий во времени

Суть: законы природы запрещают перемещения в прошлое, полностью, либо с какими-либо серьезными ограничениями. Имеется несколько вариаций на данную тему:
  • Перемещения в прошлое принципиально не возможны.
  • Перемещение в прошлое, или как минимум его серьезное изменение, приводит к разрыву ткани пространства-времени, схлопыванию Вселенной и прочим тотальным катаклизмам
  • Перемещаясь, скажем, на 1 год в прошлое, путешественник окажется на расстоянии 1 светового года от Земли, и сможет достигнуть исходной точки только к моменту своего отлета назад – тем самым, не имея возможности повлиять на себя в прошлом (т.е. мировая линия не замыкается в кольцо).

Плюсы: тривиальность решения. Самый простой способ разрешения парадокса – исключить условия его возникновения из сферы возможного.
Минусы: а как же мечта о машине времени?) Если серьезно, то принципиальная возможность путешествий во времени – слишком обширная тема, чтобы сейчас об этом говорить, поэтому рассмотрим, что еще у нас есть в запасе, надеясь, что они все-таки возможны.
Модель 2: предопределенность истории

«В этот момент он понял, что он и есть тот самый Джо. Джо, с которым он уже встречался перед этим. Словно молнией вдруг озарило в голове Боба тот факт, что это была не просто такая же ситуация, через которую прошел он сам, а это была именно т_а _с_а_м_а_я_ ситуация. Только теперь он воспринимал ее с другой точки зрения.» Р. Хайнлайн «По пятам».

Суть: полеты в прошлое возможны, но изменить там ничего не получится, поскольку страницы истории зафиксированы. Если археологи нашли свидетельство того, что вы посещали Эхнатона в древнем Египте – этот полет обязательно состоится, причем пройдет именно так, как это было в прошлом. Совершить там другие действия, или просто отказаться от полета – в силу каких-то обстоятельств вы не сможете.
Отсюда вывод, что некоторые точки истории могут быть созданы путешественниками во времени. Например, вы решили предотвратить затопление «Титаника» — оказавшись на борту, либо вы столкнетесь с кучей трудностей и не сможете увести корабль от айсберга, либо с ужасом осознаете, что ваши действия – настоящая причина катастрофы.
Уместно выделить два варианта модели: сильная и слабая. Сильная предопределенность подразумевает, что невозможно изменить ни одной детали прошлого. Слабая допускает изменение мелких деталей, но ключевые точки истории, общая направленность событий сохраняются.

Очевидно, что предопределенность распространяется не только на прошлое, но и на будущее. Ведь если прошлое зафиксировано, и содержит события прилетов людей из будущего, будущее тоже в некоторой степени предопределено, ведь в нем обязательно должны сложиться обстоятельства для этих полетов. В рамках данной модели становится возможным получить своего рода «гарантии истории». Например, ученые находят доказательства посещения прошлого людьми из XXX-го века – это означает, что в течение ближайшей тысячи лет человечество не только будет существовать, но и активно развивать науку. Здесь важно не отступать от законов логики и понимать, что отсутствие доказательств подобных посещений ровным счетом ничего не доказывает. «Если путешествия во времени возможны, то где наши потомки из будущего» — это, согласитесь, не серьезно, объяснений тому можно выдвинуть множество.
Примеры: фильм «Охотники за реликвией», рассказ Р. Хайнлайна «По пятам».
Плюсы: есть в этой модели некая элегантность. Может потому, что она занимает золотую середину между полным отрицанием возможности путешествий (модель 1) и их описанием с привлечением не самых тривиальных понятий (модель 3). Кроме того, имеются косвенные экспериментальные подтверждения данной модели на уровне квантовой информатики.
Минусы: идея предопределенности прошлого и будущего кажется как минимум странной. Даже если это слабая предопределенность, не вполне понятно, как именно законы физики ограничивают свободу выбора человека совершить, и тем более не совершить те или иные поступки. Понятно, что это ограничение происходит посредством обстоятельств. Неужели у каждого путешественника в прошлое всегда возникают такие обстоятельства, которые не позволят ему отказаться от полета? Нечто подобное еще можно представить на уровне квантовых частиц, но работа данного механизма в макромире пока не достаточно описана.
Уходя от фатализма к слабой предопределенности, мы сталкиваемся с вопросом критерия. До какой степени история позволяет себя менять? Что считается ключевой точкой? К этому вопросу мы еще вернемся.

Модель 3: альтернативные реальности

"-По всей видимости временной континуум был нарушен, и возникла новая событийная последовательность, которая изменила действительность
-Док, попроще можно?
-Сейчас, позволь проиллюстрировать. Представим, что эта линия обозначает время, вот настоящее, 1985 год, будущее и прошлое. До этой точки во времени, где то в прошлом линия отклонилась под таким углом и возник другой 1985 год, другой для тебя, для меня и для Эйнштейна, но настоящий для всех остальных.", «Назад в будущее-2»

Суть: изменение истории порождает новый поток времени, где развивается альтернативный сценарий событий. Сам путешественник остается в созданной им реальности.

Рис.1 – классическое представление о ветвлении реальности
Обычно подразумевается, что реальность ответвляется только при серьезном (ага, вот оно опять – критерий?) влиянии на историю. Например, вы отправляетесь в прошлое, а в точке старта остается наблюдатель (Н). После вашей спокойной прогулки по прошлому в качестве туриста он увидит ваше возвращение.

Рис. 2 – петля времени замкнулась
Но если вы отправитесь совершить (или предотвратить) революцию, то для наблюдателя вы так и не вернетесь из прошлого, т.к. станете частью новой реальности.

Рис. 3 — петля времени разорвана

Для не-программистов: в статье часто используются термины «ветка» (она же «branch»), «trunk», «merge» — пусть они вас не пугают. Эти понятия используются в системе контроля версий SVN, знать которую не обязательно для понимания того, что:
trunk — первоначальный, «наш» поток времени, ход истории.
branch, ветка — альтернативный поток времени, образуемый при вмешательстве в историю.
merge — процесс вливания ветки в транк, т.е. последствия событий альтернативной истории становятся частью основного потока истории (понятие основного/дополнительного потока — условно, тут скорее речь об одном потоке как родительском, и втором, как ответвлении от него).

Таким образом, можно хоть переписать историю с нуля – только это будет ее новая ветка, а старая останется в сохранности. Этакий GitHub с форками от любой прошлой ревизии.

В данной модели время перестает быть одномерной линией, т.к. добавляется ось вариации событий. Полученный таким образом Мультиверсум (Вселенная со множеством альтернативных реальностей) наглядно изображается в виде дерева.
Дерево можно изобразить в развернутом виде, где узлы – это события, а исходящие ветки – это возможные исходы (рис. 4А). Когда речь идет об изменении истории, удобнее взять один из маршрутов дерева как эталон (нулевая реальность, trunk), изобразить ее в виде прямой, а альтернативный маршрут изобразить в виде ответвления (рис. 4Б).

Рис.4 — древо альтернативных реальностей в двух представлениях
Логично: после вмешательства в прошлое ход событий развивается по новому пути, прочерчивая тем самым другую траекторию в пространстве вариантов. Вопрос только в том, что представляет собой это пространство: теоретическая модель, или же реально существующие параллельные реальности. Дело в том, что с понятием альтернативного хода событий мы сталкиваемся не только при путешествиях в прошлое. Вспомните теорию «делящейся Вселенной» Эверетта. В ее популярном изложении говорится о том, что при каждом событии Вселенная расщепляется на несколько реальностей, где реализуются возможные исходы события. Грубо говоря, при броске монеты реальность клонируется на три копии: в одной выпадает орел, в другой решка, в третьей монета встает на ребро. Мы бросили монетку и выпал орел – чем фактически являются две остальные реальности? Потенциальными состояниями квантового мира, или физически существующими параллельными мирами? Это фундаментальный вопрос современной физики, ответа на который у нас пока нет.
Примеры: фильм «Назад в будущее»
Плюсы: эта теория действительно разрешает парадоксы. И делает она это без вызывающего много вопросов ограничения свободы действий в прошлом. Представление об альтернативных потоках времени перекликается с рядом теорий (делящаяся Вселенная Эвверета, многолистная Мега-Вселенная Сахарова, трехмерное время Бартини и др.), и в целом видится логичным расширением модели одномерного времени.
Минусы: блистательно разрешив одни вопросы, модель привнесла другие. Если ветка истории образуется только при серьезном вмешательстве в историю, то каков критерий этой «серьезности»? Если же ветка образуется всегда, то как именно она вливается обратно в основной поток, обеспечивая тем самым возвращение путешественника из прошлого? Гипотеза слияния реальностей не нова, но пока остается недостаточно раскрытой.

Резюме по моделям

Существует еще одна модель. Она редко встречается в литературе, она фундаментально отличается от остальных, и сейчас вы сами поймете почему. Итак, те же исходные данные: путешественник стирает себя из истории, т.е. в новом сценарии событий он не появляется на свет. В этой модели нет параллельных реальностей, изменился основной, он же единственный поток времени. Вернувшись в свое время, путешественник будет никем не узнаваемый. То, что теперь никто не летит в прошлое — не означает, что путешественник все-таки появится на свет, ведь изменение истории уже произошло, и оно просто сохраняется.
Представьте, что некий злодей отправился на машине времени в далекое прошлое, чтобы коренным образом изменить историю человечества. Мы просто исчезнем из реальности, слово нас никогда и не было. Логично, что уже свершившиеся события не могут быть «аннулированы» и просто вот так исчезнуть. Точнее говоря, это нам диктует интуиция, а о логическом обосновании нужно подумать. Предлагаю пока это просто считать аксиомой: историю невозможно переписать. Все предыдущие модели – это различные варианты реализации данной защиты:
  1. Не дает полететь в прошлое
  2. Не дает в прошлом что-то изменить
  3. Не дает изменить основной поток времени, уводя изменения в дополнительный

Сам поиск человечеством модели разрешения парадоксов подразумевает следование данной аксиоме. Поэтому, в нашем распоряжении 3 модели времени. Будем считать, что так мы обрисовали контуры первого вопроса: защита истории от изменений. Что теперь можно сделать с этими моделями? Предлагаю сразу исключить первую: если путешествия во времени невозможны, то все наши предыдущие и последующие рассуждения бессмысленны. Остается две модели – какая же верна? А может, верны обе, являясь частными случаями более общей модели? Прежде, чем мы поговорим об этом, нам необходимо взглянуть на вопрос изменения истории с другого ракурса.

Прав ли Рэй Брэдбери


Забудем на секунду о рассмотренных моделях, о предопределенности истории или параллельных реальностях. Перед нами поток истории, в него вносится изменение – нас интересует лишь одно: будут ли последствия от этого влияния затухать, или же степень отклонения от первичного сценария будет нарастать как снежный ком?
В рассказе Рэя Бредбери «И грянул гром» раздавленная в юрском периоде бабочка приводит к масштабным изменениям нашего времени. Автор развивает версию о высокой связности событий, что делает историю крайне не устойчивой: даже малейшее изменение в прошлом, особенно далеком, вызывает серьезное отклонение.
Фрагмент

Мы не хотим изменять Будущее. Здесь, в Прошлом, мы незваные гости. Правительство не одобряет наши экскурсии. Приходится платить немалые взятки, чтобы нас не лишили концессии Машина времени — дело щекотливое. Сами того не зная, мы можем убить какое-нибудь важное животное, пичугу, жука, раздавить цветок и уничтожить важное звено в развитии вида.
— Я что-то не понимаю, — сказал Экельс.
— Ну так слушайте, — продолжал Тревис. — Допустим, мы случайно убили здесь мышь. Это значит, что всех будущих потомков этой мыши уже не будет — верно?
— Да.
— Не будет потомков от потомков от всех ее потомков! Значит, неосторожно ступив ногой, вы уничтожаете не одну, и не десяток, и не тысячу, а миллион — миллиард мышей!
— Хорошо, они сдохли, — согласился Экельс. — Ну и что?
— Что? — Тревис презрительно фыркнул. — А как с лисами, для питания которых нужны были именно эти мыши? Не хватит десяти мышей — умрет одна лиса. Десятью лисами меньше — подохнет от голода лев. Одним львом меньше — погибнут всевозможные насекомые и стервятники, сгинет неисчислимое множество форм жизни. И вот итог: через пятьдесят девять миллионов лет пещерный человек, один из дюжины, населяющей весь мир, гонимый голодом, выходит на охоту за кабаном или саблезубым тигром. Но вы, друг мой, раздавив одну мышь, тем самым раздавили всех тигров в этих местах. И пещерный человек умирает от голода. А этот человек, заметьте себе, не просто один человек, нет! Это целый будущий народ. Из его чресел вышло бы десять сыновей. От них произошло бы сто — и так далее, и возникла бы целая цивилизация. Уничтожьте одного человека — и вы уничтожите целое племя, народ, историческую эпоху. Это все равно что убить одного из внуков Адама. Раздавите ногой мышь — это будет равносильно землетрясению, которое исказит облик всей земли, в корне изменит наши судьбы. Гибель одного пещерного человека — смерть миллиарда его потомков, задушенных во чреве. Может быть, Рим не появится на своих семи холмах. Европа навсегда останется глухим лесом, только в Азии расцветет пышная жизнь. Наступите на мышь — и вы сокрушите пирамиды. Наступите на мышь — и вы оставите на Вечности вмятину величиной с Великий Каньон. Не будет королевы Елизаветы, Вашингтон не перейдет Делавер. Соединенные Штаты вообще не появятся. Так что будьте осторожны. Держитесь тропы. Никогда не сходите с нее!

Теперь рассмотрим маленький пример. Вы собираетесь утром на работу, выходите из дома, и на метро доезжаете до нее. Каким-то образом в историю вносится коррекция: вы узнали, что метро сегодня не работает. Взяв велосипед, вы доезжаете на нем. Вносим еще одну коррекцию: прокалывается шина. Но вы дойдете пешком!

Рис. 5 — стремление реальностей к объединению

На хронокарте видно:
1. Вливание веток в транк происходит в разные моменты времени, т.к. достижение целевого состояния (попасть на работу) происходит разными путями.
2. Деформация полностью не затухает, т.е. несмотря на то, что во всех трех случаях вы на работе, есть некоторые незначительные вариации (припаркованный велосипед, грязная обувь и пр.).

Что происходит, если абстрагироваться от действующих лиц? Если у системы есть цель, она стремится к ней при любых сценариях, обладая, таким образом, определенным запасом устойчивости (к отклоняющим воздействиям). Сейчас мне бы не хотелось уходить в дебри философии и говорить на тему цели у материальных объектов, людей, общества и пр. То, что события в окружающем нас мире подчиняются законам физики и в некотором смысле упорядочены – думаю, очевидно. Историю нельзя считать набором совпадений, в ней есть своя обусловленность. После первобытно-общинного строя не смог бы наступить капитализм, минуя рабовладельческий и феодальный строй. Если предотвратить начало войны в 1939 году, наверняка она все равно началась позже, ведь в мире сохранились бы предпосылки для этого. Если некое научное открытие не сделал бы один ученый, его бы сделал позднее кто-то другой, и так далее. События истории обладают направленностью, тенденцией, а это значит, что любое отклонение хода истории имеет свойство затухать.
Данная гипотеза выводит нас на следующий уровень понимания механики времени, ведь она фактически объединяет две рассмотренные ранее модели. В одной мы говорили о сопротивлении истории изменениям, в другой – о параллельных потоках времени. Полагая, что параллельные потоки времени стремятся влиться обратно в основной поток, мы выделяем из этих двух моделей единую суть: упругость потока времени.

Как происходит слияние реальностей?


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

Рис. 6 — настоящее, как проекция альтернатив прошлого и корень вариантов будущего
Верхний конус – будущее, это возможные исходы от текущего состояния, нижний конус – прошлое, это некоторый спектр возможных предшествующих состояний. Стенки конусов очерчивают границы достижимости, т.е. выйти за пределы конуса означает перейти в такое состояние (дельта по оси b), которое из текущего состояния за данный промежуток времени (дельта по оси t) достигнуть невозможно.
Слияния событий конуса прошлого в точке настоящего означает общий для них результат. Но как это происходит на уровне изменения структуры объектов, как они накладываются? Возможно, происходит нечто подобное тому, что показано в «Назад в будущее», где заголовок газеты плавно меняется прямо на глазах – это «бранч мержится в транк».

Квантовая монетка


В комнате сидят двое: Алиса и Боб. Пять минут назад Алиса бросила монету и выпала решка, они оба это видели. У нас есть машина времени, и мы проводим коррекцию истории: пять минут назад выпадает орел. В итоге у нас получается две реальности:

Рис. 7 — эксперимент с двумя наблюдателями
Алису и монету нельзя разъединить, поскольку результат броска монетки не существует в отрыве от его наблюдения. Но у нас еще есть Боб, который с некоторой задержкой тоже узнает итог броска монетки, и они с Алисой обмениваются парой реплик. Два исхода, и две реальности – мы это видим на схеме.
Изменим условия эксперимента: Боб не видит результата. С точки зрения Боба эти две реальности идентичны, в обоих из них он видит бросок монетки, но не знает исхода. Важная деталь (спасибо Agent_J за поправку): Алиса не говорит результат Бобу, тогда для него ход событий действительно одинаков в обоих случаях. Боб тоже может уйти в два бранча, как только Алиса скажет ему результат опыта. Попробуем это нарисовать в 5D: image
Рис.8 — эксперимент с одним наблюдателем
Подумайте об этом, это действительно любопытно! Словно бы две Алисы общаются с одним Бобом, а просто произнесение одной фразы инициирует деление потока времени слушателя.

Здесь мы подходим к пониманию роли наблюдателя в модели параллельных реальностей. Линия на хронокарте – это не реальность, это состояние группы объектов, наблюдение любого из которых включает наблюдателя в эту линию. Природа не делает полной копии Вселенной, она просто хранит dif их отличий.

Так все-таки, как происходит слияние?


Первое: слияние не следует трактовать буквально, будто бы миры становятся идентичны. Два мира в чем-то различаются, в чем-то схожи — и вот эта схожесть представляет собой нечто вроде их стыка в пространстве вариантов. Как в том примере, где тремя путями человек все равно попал на работу — в этот момент у трех реальностей появился данный стык, произошло их частичное слияние. Разумеется, некорректно говорить о полном слиянии реальностей, потому как сама реальность, как уже было показано в парадоксе квантовой монетки, это всего лишь срез пространства состояний. Как разные объекты могут быть в разных стыках, карманах и потоках пространства вариантов — это хорошая тренировка для воображения!

Частый вопрос: а почему сливаются бранчи, откуда вообще идея упругости истории? Отвечу другими словами и коротко: устойчивость систем. Это универсальное свойство практически любой более-менее сложной системы, будь то человек, экономика страны, мировая политика и пр. У системы есть цель (в том, или ином виде), и работа системы подобна автоматическому регулятору, корректирующему движение к цели. Поэтому вносимые в прошлое возмущения будут встречать сопротивление устойчивости систем мира. Точки бифуркации — это совсем другое дело, воздействие на них может кардинально изменить ход событий. Но затухание dif'а все равно будет, просто на большем масштабе.

В ходе обсуждений MrSeventh предложил интересную гипотезу: а что если физическим носителем лога различий бранчей является темная материя и/или энергия?

Могу предположить следующее

Темная энергия отвечает за ускоренное расширение Вселенной. По ряду соображений мне близка теория пульсирующей Вселенной, т.е. после большого взрыва и расширения следует сжатие (циклическая пульсация, как биение сердца). Это означает, что параметры темной энергии должны будут измениться.
Как вариант, дело тут вот в чем: сейчас Вселенная молодая, и большинство бранчей идет на расхождение, им потребуются триллионы лет на то, чтобы начать сближаться (в соответствии с кривой затухания). Начнется синтез различных вариантов Вселенной в один, соединение различных бранчей, лог dif'а при этом будет сокращаться, параметры темной энергии (если это физический носитель этих логов) — меняться, Вселенная сжиматься до состояния сингулярности, где соединится не только вся материя, пространство, и время, но и все варианты (потоки времени).

Единая модель


А теперь соединим все ранее сказанное. Две модели времени (предопределенность истории и ветки) фактически соединились в одну: «ветки с merg’ом». Любые изменения истории (даже сам факт пребывания в прошлом) прочерчивают альтернативные маршруты в пространстве вариантов, но поток времени обладает свойством упругости, что проявляется как постепенное стремление альтернативных маршрутов влиться в основной. При этом наблюдаемый мир представляет собой срез сложного квантового переплетения потоков времени, когда находящиеся в одном пространстве объекты могут относиться к разным потокам времени (пока между ними нет факта наблюдения).

Математическая модель


Итак, нам необходимо смоделировать затухание отклонения истории, возникающее при вмешательстве в прошлое.

Первый вариант: самый тривиальный, мы считаем что затухание бранча происходит с неким постоянным ускорением. Описывается формулой равноускоренного движения.
Второй вариант: более правдоподобный, где поток времени сравнивается с пружиной, и тогда сила (а значит, и ускорение) пропорциональны текущему отклонению. То есть, чем дальше поток истории ушел в сторону, тем сильнее он стремится вернуться назад. Описывается формулой затухающей синусоиды.
Третий вариант: а здесь интересная история. Первая версия статьи содержала


Благодаря Strepetarh, Sayonji, mayorovp была замечена ошибка: расчет основан на формуле равноускоренного движения, которая здесь не подходит. Но эта формула, как оказалось, хорошо подходит для описания наблюдаемой картины (см. далее).

  1. Равноускоренное затухание.
  2. Затухание по правильной формуле «пружины».
  3. Третья, старая формула.

А теперь пора перейти от теории к практике.

Эксперимент


А что если данные об истории можно смоделировать? Нужна некая упрощенная модель мира, состоящего из множества взаимодействующих элементов. Мы будем фиксировать ход событий, затем отматывать его назад, вносить изменения в «мир», запускать симуляцию, и наблюдать новый сценарий. Останется только количественно оценивать разницу между этими двумя реальностями, и выдавать ее в виде графика. Тогда мы получим экспериментальную, а не теоретическую кривую затухания отклонений истории.

Осталось придумать алгоритм, который сгодился бы на роль «модели мира». Перебрав несколько вариантов, я остановился на алгоритме Конвея «Жизнь». Ранее о нем я почти ничего не слышал, поэтому засел за поиск – и с удивлением обнаружил на Хабре множество статей на эту тему. Осталось понять, как оценивать разницу между мирами. Мне хотелось построить решение на неком эволюционном принципе, поскольку история реального мира – это все-таки прогресс и совершенствование, а не устоявшийся режим «кипения клеток». Может быть, нечто вроде механизма генетического отбора, или чего-то подобного, что вводило бы в мир какие-то измеримые характеристики, позволяющие сравнивать разные варианты истории (например, «количество клеток 42-го уровня»). Поверх алгоритма Конвея оказалось довольно сложно что-то прикрутить. Он выбрал оптимальные параметры «Жизни», и мои попытки добавить свои правила в алгоритм делали мир неустойчивым. Спустя некоторое время я выбрал самое простое решение: использовать классический вариант алгоритма без всяких наворотов, и просто вычитать попиксельно один мир из другого (расстояние по Хэммингу) – это и будет степень расхождения истории.

Сказанное я воплотил в проект: https://github.com/TimeCoder/LifeTime

Там же можно скачать сбору под Windows: https://github.com/TimeCoder/LifeTime/raw/master/bin/lifetime.1.0.0.12.bin.win32.zip
А также под Linux (спасибо vershov):
lifetime.1.0.0.12.bin.linux.x86.tar.gz
lifetime.1.0.0.12.bin.linux.x64.tar.gz

Видео:

Перед запуском нашей машины времени, познакомимся с UI и кодом программы.

Рис. 10 — элементы управления
Интерфейс программы состоит из 4-х областей:

  1. Мир – здесь отображается процесс развития жизни, после случайного заполнения клетки образуются и распадаются по алгоритму «Жизнь» Конвея. Края мира «сшиты» между собой.
  2. Хронокарта – фактически здесь мы видим хронодрево, Мультиверсум, пространство вариантов – называйте как хотите. Изначально перед нами одна прямая – первичный поток времени, нулевая реальность (зеленая). Когда мы совершим перемещение в прошлое, над основным потоком образуется тоннель (синий), а новый сценарий развития событий будет представлен кривой (желтая).
  3. Блок управления, где включается машина времени и запускается перемещение.
  4. Область вывода различных данных о мире, путешественнике и перемещении.

Теперь рассмотрим порядок работы с машиной времени:

  1. Сразу после запуска программы вы увидите кипящий океан жизни и бегущий счетчик времени. Подождите немного, и нажимайте кнопку «Begin».
  2. Машина времени активирована, мир замер в ожидании. Что по логике должно произойти далее? В машину времени должен сесть путешественник. Кликайте мышью в области мира по клеткам, выбирая тем самым объект для перемещения. Выбор можно менять, или отменять вовсе, кликая на пустую область.
  3. Когда объект выбран, автоматически разблокируется слайдер, находящийся над хронокартой. Тяните его влево, отматывая историю до нужного момента времени. Это еще не перемещение: мы только выбираем точку назначения.
  4. Нажимайте «Leap» — вперед, в прошлое! Объект перенесется в выбранный вами момент времени, станет частью мира, и симуляция продолжится с этой точки. По графику будет видно отклонение нового сценария истории, а в том месте, где был объект, будет легкая его подсветка. Когда время дойдет до вершины петли (точки, откуда был сделан переход в прошлое) – программа встанет на паузу, на монитор выведется ряд данных.

В данной версии есть некоторые особенности:

  • Только один полет в прошлое за один сеанс работы программы. Возможность множественных бранчей в программу заложена, но пока отключена, в том числе из-за нерешенной задачи «о трех ветках», см. ниже.
  • Путешествий в будущее нет (не увидел в них смысла).
  • Переключаться между потоками можно только после петли.
  • После того, как вы начали двигать слайдер времени, выбрать другой объект для перемещений нельзя (нужно немного дописать код).
  • На больших размерах мира программа тормозит (нужно оптимизировать).
  • Рендер происходит с помощью OpenGL (вроде как нормальное решение).

Существуют и другие кандидаты на роль базового алгоритма, взамен «Жизни», например Tierra или Avida. Разработка проекта продолжается.
Задача о трех ветках

Проблема в том, что мы количественно оцениваем качественные величины. Итак, представьте 3 мира: основной поток времени, и два альтернативных. Что брать за систему отсчета при изображении отклонения истории? В случае 2-х веток все просто: первую нарисовали как прямую линию, вторую изображаем в виде кривой, показывающей степень отклонения от базовой реальности. Но теперь нам нужно изобразить третью кривую. Допустим, эта реальность отпочковалась от транка, и отличается от него настолько же (количественно), как и вторая – получается, что траектории второго и третьего потока совпадут – но в них происходят качественно разные события! Другой вариант: третья реальность отпочковалась от второй, и в ней ход истории быстро приходит к варианту транка (например, сначала изменили прошлое, возникла реальность 2, потом полетели в прошлое чтобы все вернуть как было – образовалась реальность 3, почти идентичная 1-й). Отклонение третьей реальности от второй такое же, как второй от первой. Задача заключается в том, чтобы придумать оптимальный метод рисования хронокарт с учетом подобных нюансов.
Код

Коротко рассмотрим архитектуру проекта, и ключевые моменты отдельных фрагментов. Ниже диаграмма основных классов проекта:

Рис. 11 — упрощенная диаграмма классов
Все начинается с алгоритма расчета жизни, реализованного в LifeModel. Эта штука содержит в себе текущее состояние мира (для работы с которым есть класс World), умеет заполнять мир случайными клетками (это нужно для первого старта) или продолжать «покадровую» симуляцию с заданного мира (это нужно при внесении изменений в прошлое). Класс LifeView отвечает за визуальное отображение модели жизни, связываются они через сигналы/слоты.
Жизнь симулируется, но это лишь мимолетное «настоящее», нам потребуется знать все прошлые состояния мира, т.е. нам необходимо от трех измерений перейти к четырем: появляется класс TimeFlow (поток времени, ветка реальности). Он агрегирует LifeModel, содержит коллекцию World (история прошлого), а также точки для построения кривой отклонения истории. Также у него есть указатель на родительский поток, от которого он отпочковался.

Конечно же, потоков времени может быть много, и все они хранятся в TimeModel, фактически представляющий собой древо времени. Именно TimeModel предоставляет интерфейс для просмотра прошлого и перемещения в заданный момент. Он хранит не только коллекцию потоков и номер текущего из них, но путешественника во времени (коллекция клеток). В классе TimeView происходит рендер хронодрева с динамическим масштабированием.

На самом верхнем уровне у нас находится класс MainWindow. Он содержит все view и TimeModel, отвечает за логику работы UI и связывает модели с представлениями посредством сигналов\слотов. Рабочий цикл организован таймером, по тикам которого вызывается next у TimeModel, а он уже пробегается по всем потокам времени, требующим в настоящий момент вызова next (ведь мы можем быть в прошлом, и наш родной поток уже просчитан на какое-то количество шагов вперед).

Все остальные подробности проще посмотреть непосредственно по коду. Да, поскольку это мой первый опыт разработки на фреймворке Qt, конструктивные замечания по коду приветствуются)

Запуск!

Совершим пробный запуск, размер мира 300х300:

Рис. 12 — пример путешествия во времени
Истории перешла в интенсивное отклонение не сразу, достигнув максимума пошел некоторый спад. Отношение отклонения в точке начала путешествия («вершина петли») к максимальному отклонению можно увидеть на мониторе, параметр Dif coef. Здесь он равен 0.82, то есть деформация истории успела уменьшиться почти на 20%.
Dif и характер кривой бранча

Установив размер мира в 100х100, я совершил прыжок в прошлое, и получился такой график:

Рис. 13 — один из вариантов кривой потока времени
Желтая кривая – это вычисленный программой альтернативный поток истории, а поверх я наложил рассмотренные в разделе математической модели графики. Конечно, его пришлось масштабировать их по обеим осям, ведь в них не соблюдены реальные размерности. Они нам просто не известны: мы не знаем коэффициент упругости времени, и мы не знаем коэффициент масштабирования графика по оси времени.

На графике видно, что первый вариант (равноускоренное затухание) явно мимо, второй («пружинная» формула) больше похож на правду, но кривая слишком рано начинает затухать. Третий вариант (формула, полученная в результате ошибки) почему-то более других отражает характер реальной кривой.

На самом деле мне просто повезло с первой попытки получить такую кривую. Не всегда dif затухает, иногда отклонение непрестанно растет, в том числе после вершины петли. Для того, чтобы точно выявить от чего это зависит, нужны доработки программы и тщательные эксперименты. Пока что я не заметил, чтобы на характер кривой влиял размер мира, объекта, дальность переноса. Скорее всего, как и в реальном мире, все дело в конкретных обстоятельствах путешествия, т.е. тех «событиях», среди которых появляется пришелец из будущего.

В любом случае, полученные кривые ближе к правде, нежели обычно принятое условное изображение реальности в виде прямой линии. Во-первых, отклонение реальности вряд ли происходит линейно. Совершается одно событие, само по себе незначительное, которое через какое-то время вызывает (или не вызывает) другое, уже куда более мощное. Это как в I-й части «Назад в будущее»: сначала Марти оттолкнул своего отца от машины – кривая отклонения реальности незначительно ушла. И только потом события начинают развиваться стремительно. Во-вторых, постоянно происходят колебания, миры становятся то ближе, то дальше (в плане схожести).

Важен ли размер мира?

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

Рис. 14 — сравнение trunk'а и branch'а
В прошлое был отправлен объект из 4-х клеток, и за каких-то 200 поколений мир изменился почти полностью (на рисунке показано две реальности).

Посмотрим мир 1000х1000:

Рис. 15 — распространение области изменений
Если наложить два варианта мира через 500 поколений, то можно увидеть вполне четкое пятно разницы (все остальное – идентично). Радиус пятна со временем растет, т.е. изменение истории охватывает все большее пространство. Но опять же, не всегда. Иногда происходит странная череда событий, и все изменения сглаживаются, порою даже до нуля, и миры становятся идентичными.
Кстати, после достижения вершины петли можно нажать «Play» и продолжить симуляцию, чтобы посмотреть дальнейшее поведение ветки. Как правило, если dif монотонно рос внутри петли, он продолжает свой рост после (возрастает радиус пятна). Впрочем, рост происходит довольно медленно, и при больших размерах мира относительный радиус пространственных изменений крайне мал.

Три типа Петля времени

По ходу статьи мы уже несколько раз сталкивались с вопросом: что считать «серьезным» вмешательством в историю, а что нет? Быть может, уже в обозримом будущем мы научимся просчитывать траектории реальности как Вычислители в «Конец Вечности» А. Азимова, а пока нужно начать хоть с чего-то.
Начнем с понятия системы отсчета. Их две, хотя они и неразрывно взаимосвязаны: мир и путешественник. Можно отправиться в прошлое, и внести колоссальные изменения в соседнюю галактику, но на прошлое путешественника здесь на Земле это никак не повлияет. Другой пример: путешественник может отправиться на день назад и внести в поток событий своего двойника некую мелочь, в результате которой через день он не полети
т в прошлое. Отклонение истории в первом примере огромно в системе отсчета мира, но незаметно с точки зрения путешественника. Во втором примере наоборот: для мира это исчезающе малая флуктуация, а с точки зрения путешественника запустился совершенно иной сценарий событий.

Измерение отклонений истории в системе отчета мира – крайне интересная и важная тема, только пока в ней больше вопросов. Потоки истории затрагивают слишком много людей, пока не разработаны необходимые модели, чтобы количественно оценивать значимость мировых событий. Скажем, какое изменение истории значительнее: спасение президента Кеннеди или предотвращение Чернобыльской аварии?

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

Рис. 16 — три типа петли времени

  1. Изменение практически полностью затухает до вершины петли. Например, устроили пикник в Юрском периоде, до наших дней не сохранится даже пластик.
  2. К вершине петли изменение затухает, но не полностью, остается некоторый след. Например, слетали во вчерашний день и в своем блокноте нарисовали картинку. Вернувшись, откроем блокнот, и увидим ее (главное до начала эксперимента не смотреть в блокнот).
  3. Отклонение истории настолько мощное, что может отменить сам полет.

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

В программе у меня почему-то не получилось с ходу поймать петлю II-го типа:

Рис. 17 — примеры из программы

Тип петли на мониторе выводится в параметре Leap Type. Практически всегда там номер 3. Что происходит? Когда симуляция доходит до того момента, из которого совершался спуск в прошлое, происходит наложение объекта (который улетал) на текущий мир (бранч). Если расположение клеток совпадает, т.е. в новой версии истории в этой же точке пространства-времени есть этот объект – значит «коэффициент инвариантности» равен 1. Если же ни одна клетка не совпала – то он равен 0. Пока что в коде заданы условные пороги этого коэффициента, разграничивающие 3 типа петли (абсолютно «с потолка»).

Означает ли это, что любое перемещение в прошлое приводит к парадоксам? Думаю, что нет, просто алгоритм «Жизнь» крайне чувствителен к вносимым изменениям. Он дает модель мира в очень грубом приближении, без целеориентированности процессов, тогда как человеческая деятельность так или иначе имеет свой вектор. За счет этого, как я предполагаю, эффект затухания dif’а в симуляции меньше, чем в реальном мире.

У читателей возникло немало вопросов типа «так затухает ли история, разве моделирование в программе это не опровергло?». Думаю, что не опровергло, а частично подтвердило. Случаев, когда отклонение монотонно растет не больше, чем когда отклонение затухает, хотя бы на 5-10%. Даже сам факт того, что эти случаи зарегистрированы — говорит о том, что история способна «выправляться» в принципе, обладает упругими свойствами. Некоторые заметили специфические условия, при которых ветка особенно быстро вливается в транк — и эти условия можно трактовать двояко. Да, история мира в программе, как и у реального мира — неоднородная, состоит несколько «эпох»:

  • высокая плотность жизни и ее однородность
  • жизнь редеет и образуются более сложные структуры, обособленные группы клеток
  • эпоха равновесия

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

Заключение


Можно ли сказать, что в целом история чаще всего стремится вернуться в свое русло? Как минимум, такой эффект зарегистрирован, а чтобы говорить о его частоте, нужно больше экспериментов. Конечно, опыты необходимо проводить в автоматизированном режиме, т.е. вместо UI реализовать API программы + скрипты, где задавать различные сценарии испытаний со множеством повторов. Что это даст?

Как минимум, мы сможем оценить динамические характеристики потока времени. Как кривая затухания деформации истории зависит от размера объекта, размера мира, каков наиболее общий вид этой кривой?

Сделав машину времени «многоразовой», мы сможем смоделировать сложные парадоксы, и посмотреть, что действительно происходит. Отмена отмены изменения истории? День Сурка? Парадокс статуи? Все это можно будет увидеть «вживую», в виде реальных (точнее, виртуальных) 5D-треков.
Может быть, у вас есть идеи и предложения, в каком еще направлении можно развить проект?

Кроме концептуальных задач, есть ряд чисто технических доработок, в частности:

  • Остро нужна оптимизация, необходимо допиливать алгоритм (например, реализовать HashLife) – надеюсь, дойдут когда-нибудь до этого руки.
  • Может кто-нибудь собрать бинари под Linux?
  • Система автоматизированных экспериментов.
  • Переход на Qt5, С++11
  • И множество мелких улучшений по интерфейсу, возможность сохранять мир, выбирать объект из прошлого, телепортировать его при полете в прошлое и пр.

Главное – это понимание первооснов вопроса! Сейчас есть немало «мифов», увы, формирующих представления о времени у многих людей. Через раз я читаю про «если переместиться на секунду назад, то очутишься в космосе, ведь Земля движется». Или состояние «хроностазиса», когда мир вокруг «замирает», называют «замедлением времени», тогда как это наоборот, ускорение времени наблюдателя. А ведь подобные вопросы легко разрешимы даже без каких-либо экспериментов, на уровне элементарной логики! Я это к тому, что огромный пласт работы по исследованию времени можно (и нужно) проводить даже не имея работающих хронотехнологий, вооружившись здравым смыслом. Плюс, уже не первый раз на помощь приходит программирование.

Сегодня мы коснулись вершины айсберга, кратко рассмотрев один из парадоксов времени. Тема времени беспредельна, в многообразии вопросов и своей увлекательности. Если кому-то интересно участвовать в этой работе – пожалуйста, открыто несколько проектов. Без капли иронии скажу, что в вопросе изучения времени не последняя надежда человечества на хабралюдей, чье умение логически мыслить и творчески гореть поможет сделать новые открытия!

Да, в статье не раскрыта тема событийных законов (эвентология), не перечислены различные способы наблюдения прошлого (т.к. статья о путешествиях), ну и конечно у многих возникли вопросы: а возможны ли путешествия в прошлое вообще, существует ли время? Чтобы не уйти в одну лишь философию (и как следствие — холивар), приходится делать допущения. В первую очередь, мы допускаем возможность полетов в прошлое. Дальше у нас открывается возможность не только обсуждать эту тему и высказывать самые «сумасшедшие» идеи, но и приводить поток мыслей в систему, и даже пробовать подтвердить свои теории экспериментально. Так, шаг за шагом, мы приближаемся к разгадке величайшей тайны — времени!