|
Разделы:
Lifehack12
Данетки95
Игры139
Игры на бумаге17
Книги14
Конкурсы8
Логические задачи346
Люди3
Новости6
Познавательно33
Почемучки14
Притчи4
Работа сайта10
Разное10
Сделай сам10
С праздником16
Страшно жить10
Творчество41
Тесты14
Фото4
Хобби2
Юмор105
Игры, Познавательно → Математическая игра “Жизнь”
8 марта 2009 | Добавил: Myst 5
«Жизнь». -одна из самых популярных математических игр столетия. Эта игра, представленная широкой общественности ведущим рубрику математических игр и развлечений в журнале Scientific American М.Гарднером, стала пользоваться большой известностью во всем мире. Игра "Жизнь", изобретенная Дж. Конвеем, описывает популяцию стилизованных организмов, развивающуюся во времени под действием противоборствующих тенденций размножения и вымирания.
Правила: Правила игры Конвея «Жизнь» Действие игры происходит на некой плоскости, разделенной на клетки. Каждая клетка окружена 8 такими же клетками (окрестность Мура). Каждая клетка может находиться в двух состояниях - живом или мертвом, т. е. пустом. На состояние любой клетки оказывают влияние состояние соседних клеток. Во времени эти состояния дискретно в соответствии с некоторыми правилами или ГЕНЕТИЧЕСКИМИ ЗАКОНАМИ КОНВЕЯ, состоящими из 2 пунктов: 1) ВЫЖИВАНИЕ ИЛИ ГИБЕЛЬ.Если живая клетка имеет меньше 2 или более 3 соседей в окрестности из 8 клеток то в следующем поколении она умирает (моделирование реальных условий - недостатка питания или перенаселенности), в противном случае она выживает; 2) РОЖДЕНИЕ. В пустой клетке появляется живая клетка, если у исходной клетки ровно 3 соседа. Гибель и рождение всех организмов происходит одновременно. Возникающие в игре ситуации очень похожи на реальные процессы, происходящие при зарождении, развитии и гибели живых организмов Игра "Жизнь" относится к категории так называемых моделирующих игр - игр, которые в той или иной степени имитируют процессы, происходящие в реальной жизни. Основная идея игры состоит в том, чтобы, начав с какого нибудь простого расположения живых клеток, проследить за эволюцией исходной позиции под действием упоминавшихся ГЕНЕТИЧЕСКИХ ЗАКОНОВ КОНВЕЯ, которые управляют рождением, гибелью и выживанием клеток. ГЕНЕТИЧЕСКИЕ ЗАКОНЫ КОНВЕЯ удовлетворяют трем основным условиям: 1) не должно быть ни одной исходной конфигурации, для которой существовало бы простое доказательство возможности неограниченного роста популяции; 2) должны существовать такие начальные конфигурации, которые заведомо обладают способностью беспредельно развиваться; 3) должны существовать простые начальные конфигурации, которые в течении значительного промежутка времени растут, претерпевают разнообразные изменения и заканчивают свою эволюцию одним из следующих трех способов: а) полностью исчезают; Популяция клеток непрестанно претерпевает необычные изменения.Примеры разных популяций приведены здесь(внешка). Иногда колония клеток постепенно вымирает, однако произойти это может не сразу, а лишь после того, как сменится очень много поколений. В большинстве своем исходные конфигурации либо переходят в устойчивые и перестают изменяться, либо навсегда переходят в колебательный режим. При этом, конфигурации, не обладавшие в начале игры симметрией, обнаруживают тенденцию к переходу в симметричные формы. Обретенные свойства симметрии в процессе эволюции не утрачиваются, а симметрия конфигурации может лишь обогащаться.
ПРОГРАММЫ ДЛЯ PC
Cамая популярная программа для "Жизни" в мире Текущая версия: 1.11 от апреля 1999 г. Самая быстродействующая из всех аналогичных программ. Бесконечное поле (1 млн.х1 млн.) Огромное количество опций, включая изменение правил. Использует DirectX. Поддерживает множество форматов .lif-файлов, в т.ч. и юниксовые (XLife). К сожалению авторы программы прекратили ее разработку 3 года назад. Самая навороченная программа Текущая версия: 4.2 от сентября 2001 г. Полное название - Mirek's Cellebration. Мириады функций. Даже краткое описание основных функций займет очень много места. Вследствие своей навороченности, программа не очень быстрая. В ней есть все, и огромное количество лишнего, но это, бесспорно, лучшая программа в мире. Программа FAM Life - одна из лучших российских программ для игры в "Жизнь". Текущая версия: 3.5 от августа 2001 г. К достоинствам программы относятся:
Программа Life 3D - трехмерная версия математической игры "Жизнь". Текущая версия: 1.0 от декабря 2001 г. Лучшая 3D версия "Жизни", которую я когда-либо видел. Использует OpenGL. Содержит множество настроек. Неплохая, но достаточно старая (95 г.) программа. Текущая версия: 1.0 от февраля 1995 г. По возможностям немного уступает Life32. Понимает только свой формат файлов. Игра "Жизнь" на OpenGL Текущая версия: 1.0 от марта 2000 г. Требует хорошую видеокарту, совместимую с OpenGL. Тестировалась разработчиком на NVidia TNT, GeForce, GeForce 2 и SGI 320. Хранитель экрана для Windows, представляющий собой реализацию "Жизни" Конвея.
Статьи НАУКА И "ЖИЗНЬ" Клеточные автоматы и игра «Жизнь» Игра Конвея "Жизнь" - типичный пример клеточного автомата, как математического объекта, представляющего собой дискретную динамическую систему. По существу клеточные автоматы являются синтетическими мирами, поведение которых большей частью определяется простыми локально действующими правилами. В этих мирах пространство представляет собой равномерную сетку, каждая ячейка которой (клетка) содержит информацию о своем состоянии. Время - дискретно. Законы такого мира представляют собой небольшое количество правил, основные из которых описываются таблицей переходов, по которой клетка вычисляет свое новое состояние на каждом такте (минимальный отрезок времени) на основе своего состояния и состояний ее соседей. Клеточный автомат можно рассматривать как упрощенный локальный вариант рекурентной нейронной сети. Обладая простотой и наглядностью, он позволяет понять основные особенности параллельного алгоритма. Рассматривая клеточные автоматы с этой точки зрения, необходимо отметить, что клеточные автоматы являются дискретными динамическими системами, поведение которых полностью определяется в терминах локальных взаимозависимостей состояний таких систем. Пространство представлено равномерной сеткой, каждая ячейка которой, или клетка, содержит несколько битов данных; законы развития выражаются единственным набором правил, по которой любая клетка на каждом шаге вычисляет свое новое состояние по состояниям ее близких соседей. Если задан подходящий набор правил, то такой простой операционный механизм достаточен для поддержания целой иерархии структур и явлений. Клеточные автоматы дают полезные модели для многих исследований в естественных науках. Они образуют общую парадигму параллельных вычислений, подобно тому, как это делают машины Тьюринга для последовательных вычислений.
Хорошим примером для ознакомления с принципами работы клеточного автомата является игра Джона Конвея "Жизнь". Индивидуум этой популяции представлен клеткой в состоянии 1, в то время как клетка в состоянии 0 представляет пустое пространство (для образности можно говорить о "живых" и "мертвых" клетках). Мерой течения времени служит смена поколений колонии, которая происходит по известным правилам. Популяция (или колония) клеток в "Жизни" может все время расти, непрерывно меняя свое расположение, форму и число клеток. Однако чаще колония становится в конце концов стационарной или циклически повторяет один и тот же конечный набор состояний. Длина цикла называется периодом колонии. Пример развития колонии показан на рис. "Примеры развития колоний в игре "Жизнь". Номер поколения увеличивается слева направо. Верхний ряд представляет осциллирующий триплет, так называемый блинкер. Конфигурация, становящаяся стабильной на третьем шаге, изображена в среднем ряду. В нижнем ряду представлена более сложная конфигурация, сначала растущая до седьмого шага, а затем распадающаяся на четыре блинкера. На основе этого примера можно сформулировать общие правила построения клеточных автоматов:
Клеточные автоматы широко применяются для моделирования систем, для которых существенно пространственное взаимодействие между элементами системы. Существует много примеров таких моделей в биологии, информатике (включая системы телекоммуникации) и др. областях. В физике клеточные автоматы примененяются для анализа явлений переноса (теплопроводности, диффузии и вязкости), моделирования твердого тела.
Игра "Жизнь" и "компьютерное" представление о мире и Боге Матюшкин И. В., 1. ВведениеВ статье излагается спекулятивная гипотеза о материи, пространстве, времени и Боге, навеянная бурным развитием компьютерной техники за последние 20 лет. Отправной точкой служит одна сравнительно новая математическая теория, а именно теория клеточных автоматов (cellular automata). Ярким примером последней является игра "Жизнь", компьютерные реализации которой, начиная с 70-х годов и поныне, получили широкое распространение в среде аспирантов и ученых. К настоящему времени, с другой стороны, отшумели бурные дискурсии 20-30-х годов в среде физиков, ряд предсказаний теории нашли подтверждение в опытах с элементарными частицами в 60-80-х годах, некоторые гипотезы спорны и сейчас. Наиболее важными для наших целей являются: 1) явление рождения элементарных частиц в их столкновениях; 2) явление существования короткоживущих частиц; 3) гипотеза о дискретной природе пространства и времени, в частности, понятие "планковской длины". Есть уже сейчас попытки связать клеточные автоматы с квантовой хромодинамикой, создана калибровочная теория решеток [1, Internet]. В свете предлагаемой гипотезы по-иному видятся основоположения квантовой механики и теории относительности. Хотелось бы привлечь внимание к этой тематике, однако в более общем виде [2], имевшем бы более непосредственное влияние на физику вообще и философию, в особенности на проблему отношений Бога и мира, какими они могут видиться в конце ХХ-го века. 2. Клеточные автоматы и правила игры "Жизнь"Теория клеточных автоматов берет свое начало с сер.50-х годов, когда Дж. фон Нейман поставил перед собой задачу доказать возможность существования самовоспроизводящихся автоматов [1]. К классу клеточных автоматов относится игра Дж. Конвэя (J. Conway), созданная им в 1970г. Простота ее правил и богатство возникающих вариантов не уступают по красоте фрактальным образам Мандельброта. В классическом варианте на разбитую на квадраты плоскость кладут фишки (аналог биологической клетки). Колония клеток на следующем ходу изменяется: 1) клетка гибнет, если ее окрестность (8 квадратов) перенаселена (более 4-х клеток) или пустынна (менее 3-х клеток); 2) клетка выживает, если число соседей равно 2,3,4; 3) клетка рождается, если число соседей равно 3. Соответственно можно предложить более сложные сценарии: сделать поле игры конечным (в коробке) или бесконечным, либо разбить плоскость на правильные шестиугольники, либо считать окрестность клетки только имеющие с ней общую сторону клетки (т.е не 8, а 4 соседние клетки), либо разделять клетки на молодые и старые, либо вообще сделать правила выживания асимметричными (сосед, например, справа имеет особое значение), либо, наконец, перенести арену борьбы в пространство (3-х мерная доска). Но даже классический случай дает пищу для размышлений: помимо устойчивых конфигураций типа блок (квадрат из четырех клеток), сигнальные огни (три клетки в линию) существуют движущиеся конфигурации, классическим примером которой является глайдер. Помимо этого энтиузиасты выявили такие интересные объекты, как "глайдерное ружье" (эта фигура испускает с периодичностью из себя глайдеры) ,"сад Эдема" (эта фигура не имеет для себя предшественника), r-пентамимо (завершает свою эволюцию через несколько десятков ходов в виде устойчивых фигур и шести глайдеров). Разумеется, с усложнением правил игры могут выявиться новые свойства (например, детерминированный хаос при переходе в трехмерье). Математически игру Конвэя можно представить булевым полем над двумерной решеткой
3. Формулировка гипотезыВесьма примечательно, что сам Конвэй формально назвал скорость глайдера скоростью света В данном случае под скоростью понимается отношение суммы числа квадратов по вертикали и горизонтали, на которое переместилась фигура, к числу совершенных ходов. Скорость глайдера тогда равна 1/2 от максимальной скорости перемещения (1 квадрат за один ход). Аналогия "глайдер-фотон" ведет нас к дальнейшим обобщениям. Итак, существуют абсолютное пространство и время, представленные соответственно индексами {i,j,k} (номер ячейки) и {t}(номер хода). Материальные характеристики физического объекта связаны с заполненностью (состоянием) ячеек. Во всяком случае дидактически можно отождествить массу тела с количеством заполненных ячеек, к нему относящихся. Многообразие устойчивых фигур игры "Жизнь" соответствует многообразию элементарных частиц в игре Природы, неустойчивые фигуры соответствуют короткоживущим или вообще еще не зарегистрированным частицам, а также тем, которые могли существовать только на заре становления Вселенной. Кстати, на автора в свое время произвел впечатление рассказ о парах виртуальных частиц в космическом вакууме, которые, не успев родиться, сразу умирают. Вселенная состоит из чудовищно гигантского числа заполненных и пустых попеременно ячеек. Большой Взрыв возник из фигуры, производящей из себя другие "летящие" фигуры (случай "глайдерного ружья", отчасти r-пентамимо). Вся эволюция мира есть образ доски игры "Жизнь", в которую играет или Природа, или Бог. Допустимо существование иных Вселенных с другими правилами игры, конгакт любого рода с которыми невозможен,- это другие "шахматные доски". 4. Физические следствияРазберем физические следжствия гипотезы в отношении физики элементарных частиц и квантовой механики. Чему соответствуют такие эпитеты как "странность", "очарованность", "барионный заряд", вводимые для избежания действия запрета Паули? Чему соответствуют привычные нам понятия как "масса покоя", "электрический заряд"? Для ответа на этот вопрос зададим себе другой: какими характеристиками обладает фигура в игре Конвэя? Целесообразно разделить эти характеристики на три группы:
К первой группе достоверно нельзя рискнуть отнести ни одну из известных физических величин. Наиболее проста для сопоставления, кажется, вторая группа. Здесь вполне уместна школьная аналогия спина электрона, поляризации фотона с направлением вращения фигуры. Поскольку в любом физическом опыте имеется взаимодействие частицы и прибора (пусть даже и квантового), то у нас нет эмпирически надежного критерия отбора параметров второй и третьей группы. Третьей группе принадлежат, по-видимому, такие величины как "электрический заряд", "гравитационная и инертная масса", которые отвечают за характер взаимодействия частицы с переносчиком поля (фотоном в случае электрического поля, условно гравитоном- в случае гравитационного поля). К третьей группе, наверное, нужно отнести большинство квантовых чисел. Вообще говоря, представление об обменном механизме (через частицу- посредник) любого взаимодействия весьма хорошо согласуется с нашей гипотезой. Легко даже вообразить ситуацию сосуществования частиц А и Б (благодаря обмену частицей В) на доске Природы, но невозможности отдельного существования частицы А (на протяжении достаточного числа ходов). Это может принципиально объяснить неудачи опытов по обнаружению кварков в свободном состоянии (А,Б- кварки, В- глюон). В этой связи уместно вспомнить мысли Лейбница о сосуществовании вещей. Однако, проявления дальнодействующих сил наша гипотеза не может объяснить с подобающей легкостью. Достоин удивления сам факт проникновения электрического поля сквозь преграду вещества. Разрешение возникших трудностей лежит, по-видимому, в применении некоторого аналога принципа Гюйгенса-Френеля из оптики. Еще более удивителен принцип суперпозиции полей. Он обязан нарушаться в глубинах вещества и недрах звезд. Более того, там возможно нетривиальное взаимодействие переносчиков полей разного типа. В обычных условиях, когда, например, атом представляет собой практически пустую систему, вероятность "соударения" трех частиц-фигур одновременно (т.е в пределах 1-10 ходов) мала, удары можно считать последовательными, а их результаты складывающимися. Есть проблема, которая автору кажется трудноразрешимой в рамках предложенной гипотезы,- это непрерывность спектра электромагнитных волн. Предварительное объяснение может состоять в том, что акт испускания атомом фотона ведет к рождению не одного глайдера, а двух последовательно, через некоторое число ходов. "Дистанция" между ними определяет длину волны. Это наглядно объясняет эффект Доплера, однако, тогда что соответствует интенсивности света? Также приобретает актуальность вопрос о тождественности частице самой себе: в отношении времени и пространства. Первый аспект более прост; так, 4 конфигурации глайдера-фотона могут трактоваться как состояния одной фигуры. Тем не менее, они еще не могут быть отождествлены с квантовыми состояниями; последние, скорее всего, соответствуют направленности движения или вращения фигуры. Второй аспект гораздо интереснее. Если элементарная частица состоит из тысячи ячеек в поперечнике, то небольшая асимметрия ее строения (или мини-спутник типа фигуры "блок" рядом) в виде, например, лишней заполненной ячейки где-то сбоку на данном ходу не окажет существенного влияния на способность частицы откликнуться на данного переносчика взаимодействия. На следующих ходах это уже может отразиться на отклик на другой переносчик. В строгом смысле мы будем иметь различные частицы. Предположение о нетождественности частицы самой себе ведет не только к логической погрешности (одним термином называют разные объекты), но и к оправданию принципа неопределенности. Действительно, то, в каких конфигурационных состояниях подойдут частицы-фигуры к моменту столкновения, определит путь протекания элементарной реакции. Идейно это объяснение принципа неопределнности близко к концепции скрытых параметров; здесь скрыты от нас конкретные положения фигур. Отметим, что важную роль в этих и последующих рассуждениях играет крупность элементарной частицы в сравнении с размером ячейки. Теперь рассмотрим последствия в отношении теории относительности. Логичным продолжением вышесказанного будет образмерить размер одной ячейки планковской длиной 10-33см. Если глайдер- это фотон, то наибольшая скорость физического объекта будет кратна или равна скорости света. Кроме того, существование такого предела с необходимостью вытекает из дискретности пространства и времени. Если такой предел есть в отношении безразмерных абсолютного пространства и времени, то он будет и в отношении размерных относительных. Отметим, что относительное пространство (измеряемое в м) по нашей гипотезе существует благодаря абсолютному (теоретически измеряемому в целых числах), а абсолютное время в корне отлично по смыслу от абсолютного пространства (ниже мы скажем нечто обратное). Во всяком случае , одно из следствий теории относительности не противоречит "компьютерной гипотезе". Гораздо хуже обстоит дело с выполнением принципа относительности в галилеевых системах. В рамках нашей гипотезы, прежде всего, должна получить объяснение сама возможность непрерывности поступательных движений. В этих случаях все атомы и частицы их составляющие, хотя и совершают собственные движения, движутся с небольшой по меркам игры "Жизнь", но согласованной скоростью. Единственный выход состоит в том, что атом совершает движение как целое, т.е. лишь через много ходов гигантская фигура (как бы махина) транслируется на одну клетку в самоподобном виде. Направление движения этой большой фигуры определяется двумя обстоятельствами; 1) собственной случайной асимметрией 2) неравномерностью прихода переносчиков взаимодействий. В равномерном прямолинейном движении гораздо важнее первая причина. Данное объяснение эстетически довольно плохое. Еще одним, не слишком приятным следствием, является необходимость признать взаимозависимости вектора скорости фигуры и ее конфигурации. Это также еще одна сторона признания нетождественности частиц. Таким образом, мы возвращаемся к объяснению Лоренца опыта Майкельсона, при этом принцип относительности выступает не независимым физическим и философским постулатом, а лишь интересным следствием строения вещества. Лоренцево сокращение тогда отнюдь не кажущееся, а физическое, реальное по отношению к абсолютному пространству. Оно в свете гипотезы уже менее фантастично, чем думалось в начале века, но по-прежнему поразительно. Конечно, при этом сокращаются не "длины" ячеек, а, скорее всего, безразмерные расстояния между фигурами. Насколько изменяется сама конфигурация фигуры при этом неясно. Что касается общей теории относительности, то гипотеза допускает взаимодействие гравитона и фотона (а оно более вероятно вблизи массивных тел!), но исключает всякое искривление пространства. Легко себе представить ограниченную Вселенную, где граничные в математическом смысле ячейки не изменяют своего состояния при любом номере хода. Тогда мир представляется как бы завернутым в капсулу. На начальном этапе развития Вселенной еще не могло существовать никаких известным нам физических законов и частиц. Обычные же частицы (фотон, протон, электрон) уникальны в том смысле, что соответствующие им фигуры обладают не только собственной устойчивостью, но и "выживаемостью" (лучше "самовоспроизводимостью") в столкновениях с другими же обычными частицами. Напрасно ждать в обычных условиях самопроизвольного распада протона, ибо число возможных комбинаций при столкновениях конечно. В этом смысле протон вечен, и некорректно описывать это в терминах "большого периода полураспада". В недрах звезд или при рождении Вселенной мы вправе ожидать противоположного. 5. Гносеологические следствия.К чему должна стремиться физика? Она должна раскрыть правила игры Природы, т.е. параметры первой группы плюс уравнения итерационной процедуры. Этих правил немного, и они просты, подобно правилам игры Конвэя. Из них, используя всю мощь дискретной математики, физика должна получить все многообразие частиц (с указанием их конфигураций). Для наиболее распространенных частиц следует дать однозначное соответствие, руководствуясь известными законами сохранения (лептонного заряда, например) в элементарных реакциях. Все известные ныне законы квантовой механики (соотношение неопределенностей, уравнения Шредингера и Дирака, правило Гунда и т.д.) представляются некоторыми "теоремами" особого математического языка, который еще нуждается в переводе на язык "аксиом" игры. А.Пуанкаре в этом смысле правильно писал о связи нашего математического знания о многоугольниках с первичными аксиомами, понятиями и теоремами евклидовой геометрии [3, c.20]. Сложившаяся ситуация напоминает отношение ньютоновой механики и старого учения о теплоте, пока их не связала статистическая физика. Отличие лишь в том, что мы знаем основы термодинамики (квантовой механики), но не знаем механику (правила игры). Поэтому следует подчеркнуть, что "компьютерная" гипотеза никоим образом не отменяет и не стесняет уже имеющиеся понятия, подобно тому как современный физик не упрекает химика в том, что он оперирует "термодинамическим потенциалом Гиббса" или считает ядро атома неизменным. Самым трудным будет получить вывод всем известных "законов природы": закона сложения скоростей Галилея, законов механики, закона сохранения энергии и импульса. Заметим, что из "компьютерного опыта" (по наблюдению за трансформациями, например, процессом гибели, различных начальных конфигураций) мы знаем много случаев несохранения числа клеток фигуры; любопытно, что для глайдера (рис.1) число клеток ("масса") сохраняется равным 5. Итак, какими же должны быть "аксиомы", чтобы получить известные нам на данном этапе развития физики "теоремы"? Весьма возможно, что при разрешении этой проблемы имеющиеся эмпирические данные не дадут однозначного ответа, т.е. будут существовать несколько альтернативных теорий. Расширить же опытную базу принципиально невозможно, поскольку фатально неутешительное качество приобретет разрыв масштабов миров объекта и субъекта, ставя предел познанию мира. Говорят, правда, что предполагаеый "конец науки" связан с недостижимостью огромных энергий в коллайдерах, но дело все же в гигантской разнице бытового размера в 1см и планковской длины (10-33см). Есть, тем не менее положительное следствие. Дело в том, что аксиомы игры Природы будут сформулированы на простом, ясном человеческом языке в отличие от "корпускулярно-волнового дуализма" квантовой механики и "странности" элементарных частиц. Неправильно, однако, спрашивать о "физическом смысле" тех или иных натуральных чисел (божественного происхождения согласно Л.Кронекеру), присущих игре. Понятия "силы", "поле", "масса" например, приобретут всего лишь метафорическое значение. Может показаться странным после сложности современных разделов физики, что "аксиоматику" игры Природы возможно передать через доступный даже игрокам в шашки понятийный аппарат. Однако, здесь уместно вспомнить учение Канта об априорных формах человеческого рассудка (таблица категорий) [4]. А если принять во внимание эволюционную теорию Дарвина, казавшиеся Канту априорными формы чувственного восприятия и в самом деле могут дать нечто, касающееся действительной формы устройства мира. Это происходит потому, что последние формируют в психофизиологическом плане первые. Кстати, если пользоваться терминологией Канта, мир "мигающих" математических фигур является нам миром масс и зарядов; неподвижное абсолютное пространство и время предстают самими "вещами в себе", и лишь наши относительные размерные пространство и время соответствуют кантовским априорным формам чувственного восприятия. То, что об этом мире "вещей в себе" можно все-таки сказать кое-что, правда, не более, чем в общем и туманном виде, покажут нам два соображения о количестве измерений (индексов) абсолютного пространства. Предварительно заметим, что самая простая причина того, что относительное пространство трехмерно, состоит в том, что и абсолютное пространство трехмерно. Первое соображение основывается на трех полусовпадениях: 26= число кубов в окрестности куба в 3-х мерной игре "Жизнь"= число букв латинского алфавита " 20-23= число аминокислот, кодирующих наши белки. Кириллица в этом отношении избыточная кодировка, ведь буквы й,ё,ъ мы редко используем. Число сортов "кирпичиков" ферментов, отвечающих за наше химическое взаимодействие с миром, чуть меньше- 23 (включая 3 "незаменимых "аминокислоты), но вспомним, что в нашем биосферном окружении нет некоторых химических элементов (He, Xe, U), следовательно отсутствует необходимость их опознать. Есть, правда, нейтрализующее возражение: 26-27 относится к числу независимых переменных в итерационной формуле, определяясь дефиницией окрестности ("связность") ячейки; так, вместо 8 соседей квадрата можно рассматривать 6 соседей правильного шестиугольника, и тогда пространство может иметь отличную от 3 размерность. Второе соображение проистекает из того, что всякая начальная конфигурация в классической игре "Жизнь" рано или поздно распадается на устойчивые фигуры. Лишь если размерность задачи больше или равна 3, то возможно явление детерминированного хаоса. Сходное положение имеет место для систем нелинейных дифференциальных уравнений без запаздывания. 6. Теологические следствияНельзя не удержаться от вопроса, уводящего нас в топкое место: что дальше? Здесь возможны две логически равнозначные альтернативы. Первая сводится к самодостаточному существованию ячеек Вселенной, делая ее еще более материальной. Условно говоря, Вселенная представляется в виде шестигранных пчелиных сот, где более плотный воск ограничивает мед. Соответственно возникают вопросы: какие физические взаимодействия или волны изменяют состояние ячейки из хода в ход? как суммируются воздействия от соседних ячеек?. На эти вопросы мы никогда не будем иметь ответа, и тем самым зайдем в тупик. Вторая альтернатива состоит в том, чтобы признать Вселенную сотворенной Богом, приписав последнему атрибут подлинной сущности. Обе возможности давно известны в философии и теологии, в особенности христианской. Интереснее, конечно, подробнее описать вторую. Если есть Игра, то должен быть Игрок. Это рассуждение повторяет космологическое доказательство в форме Лейбница, который рассуждал так, исходя не от первопричины, а от логической причины "если А, то Б". Единственное, что мы делаем чуть более выпуклым, так это логическую причину существования абсолютного времени (совершения ходов). В несколько грубоватой, антропоморфной, свойственной нашему компьютеризированному миру, и потому ему более понятной форме опишем отношение Бога к миру. Сидит скучающий, ценящий математический досуг Бог у своего божественного компьютера, возможности которого в миллионы раз больше самого мощного сервера, быстродействие и объем памяти его почти безграничны. Бог запускает свою авторскую программу, в диалоговом окне выбирает параметры-правила и начальную конфигурацию игры. Чтобы иметь возможность позже любоваться игрой, он сохраняет после каждого хода ее на жестком диске. Содержимое оперативной памяти представляет собой текущее состояние мира, адрес ячейки памяти- ее пространственный индекс, хранимый объект в ячейке памяти может быть битом, отображать вещественное или комплексное число. Процессор терпеливо выполняет операции в цикле for; по внешним признакам он весьма напоминает христианский Святой Дух. Иногда, при взгляде на монитор он видит какую-то интересную фигуру (первый атом золота, например), он прерывает исполнение программы, вырезает (Cut) или копирует (Copy) ее в буфер обмена для последующего сохранения в библиотеке или "галерее славы Игры". Попив кофе, взглянув на часы в нижнем правом углу экрана, он решает продолжить игру с того места, на котором остановился; излишне говорить о том, что никто из "существ" в оперативной памяти и не заметил заминки. Через некоторое свое, божественное время он решил улучшить сценарий, добавив (Paste) сконструированную им во время паузы фигуру, которая воспроизводит сама себя (первая ДНК). Такое происходит, правда, редко. Итак, каждый ход Бог-пользователь видит совершенствование всех фигур в целом, неудачные фигуры, "побарахтавшись" пару миллионов ходов, распадаются. Впрочем, Бог любит совершать чудеса, путем Copy-Paste превратив однажды воду в вино, или, отменив выполнение нескольких миллионов ходов в нескольких миллионах смежных клетках, остановил воды Красного моря перед избранным народом. И только Бог знает, когда он закончит игру, когда посчитает "галерею славы" завершенной (например, мозгом Эйнштейна). Тогда уже будет некому осознавать относительное время, ибо и абсолютного времени уже не будет. Счетчики программных циклов обнуляться, создастся новый лист (пункт меню File-New), и Бог сотворит "новое небо и новую землю", поместив туда копии экземпляров из "галереи славы". Таким образом, в программной реализации Игры, в которой Бог принимает активное участие, и не только в самом начале в качестве перводвижителя. Данный образ иронически утрирован. Например, упомянутое здесь "божественное" время относится к подлинным "вещам в себе", а любые уточнения о нем являются пустыми, метафизическими, измышленными. Мир становится все более виртуальным, а Бог все более математически реальным. Осторожнее, правда, было бы говорить о Боге философов, и не о гипотезе, а некотором измышленном представлении. Тем не менее, можно сделать понятнее некоторые положения практической христианской теологии. Например, "у Бога тысяча лет, что один день, и один день, что тысяча лет" (смешение божественного и относительного времени). Выявляется бессмысленность вопроса о том, что делают души умерших в чистилище. Лишается абсурдности воскрешение именно телесное, а не чисто духовное. Наконец, показывается, что бессмертие тела не влечет за собой с необходимостью субстанциональное существование души (ахиллесова пята картезианцев). В этом случае ослабляется противоречие материализма с теологией. Мы отказываемся от представления Канта о трансцендентном субъекте, который ограничивается эмпирическими условиями мира явлений, и который позволял сохранить "и природу, и свободу" [4]. Это более соответствует данным физиологии. При абсолютной детерминации поведения человека, однако, действительно ли рушится свобода воли и понятие "греха"? Наколько верен этот кажущийся бесспорным вывод? Требует ли действительно христианство от человека невозможного? Наша гипотеза ведет к полному разделению сфер влияния морали ("моральности", по Канту) и природы. Бог предстает единственным абсолютным мерилом добра и зла, которое преломляется в каждой исторической эпохе и обществе по-разному, он является необходимым условием разрешения метафизической проблемы "бессмертия души"[4]. Сделаем последнее замечание. При условии гигантских резервов оперативной памяти нет особой разницы между цифрами 10100 и 10200, поэтому можно одним индексом a задать четырехиндексный массив {i,j,k,t} (множество Z равномощно множеству Z4). В процессе игры он заполняется "послойно", в сторону увеличения t. Таким образом, Богу могут быть ведомы все времена, которые уже вневременны, включая и далекое будущее (если исключить в дальнейшем вмешательство Бога в ход игры). В такой интерпретации связанные итерационной формулой (а значит "пространственно") ячейки могут иметь далекие номера. Более того, итерационная формула может в принципе содержаить в качестве независимых аргументов t и далекие a1 , где a1 определено нетривиально: a1 =1*2*3*...*a. В этом случае стохастичность порождается уже в самой формуле, но она не доступна для анализа человеческому существу. Действительно, нелепым кажется предполагать такое "дальнодействие" между электроном атома моего тела и протоном в звезде a-Центавра. 7. Заключение Предлагаемая "компьютерная" гипотеза, как нам кажется, отражает потенциально возможное в конце ХХ-го - начале ХХ1-го веков представление людей о мире и Боге. Важно было с единой "компьютерной" точки зрения посмотреть на сложившийся массив наработок по физике, теории познания, теологии, не углубляясь в частности. Автор не претендует на подлинную оригинальность изложенных базовых идей, скорее всего, подобное можно найти уже у пифагорейцев, но не является ли одной из существенных задач философии передавать символизм древних в символах современности, преподнося всю глубину их мироощущения в понятной нынешним людям "полиэтиленовой обертке"? Список литературы: 1. Гарднер М. Крестики-нолики, М.: Мир, 1988г. Эффективная организация данных для повышения скорости поиска клеток и разрешения отношений соседства при реализации клеточного автомата Джона Хортона Конвея “Жизнь”Чтобы не обременять читателя, в дальнейшем условимся называть этот автомат просто игрой Жизнь. О правилах этой игры написано немало, поэтому мы не будем останавливаться на них, а сразу перейдём непосредственно к теме этой статьи. Тем же, кто либо не знает правил, либо просто хочет прочитать ещё раз о них, можем порекомендовать книгу (1), с которой, пожалуй, начинали все “жизнелюбы”, или книгу (4). Идея применения вычислительных машин для слежения за ходом игры – не нова. Сам Джон Хортон Конвей использовал компьютер для наблюдения за причудливыми конфигурациями своего детища. Без моделирующих программ увидеть большинство интереснейших превращений, происходящих по ходу игры, было бы просто невозможно. Некоторым вопросам написания таких программ и посвящена данная статья.
Итак, с точки зрения программирования, Жизнь – трудоёмкая, для компьютера, задача, так как требует довольно больших ресурсов машины на непрерывный пересчёт состояний моделируемого мира (под “миром”, здесь и далее, будет пониматься плоскость, разбитая на клетки, на которой рассматривается колония). В чём же этот пересчёт заключается? Фактически, на каждой итерации нужно разрешать отношение соседства между конкретными объектами, то есть, уметь узнавать, сколько у него соседних клеток. Эта статья и посвящена именно тому, как это сделать максимально эффективно (ясно, что вариант полного перебора мест гипотетической дислокации клеток мы рассматривать не будем, тем более, что его применение проблематично на “бесконечных” полях, которые и представляют основной интерес при моделировании процесса Жизни). Далее под “местами” будем понимать позиции, на которых могут стоять клетки, элементарную область в рассматриваемом мире (“A” на рисунке 1), а под “клетками” – места, в которых есть жизнь (“B” на том же рисунке). “Объектами” будем называть “клетки” и “места”. Эту терминологию лучше запомнить, так как она будет постоянно использоваться. Конечно, приведённые здесь методы не претендуют на то, чтобы быть истиной в высшей инстанции, и автор с удовольствием будет общаться с людьми, которые поделятся с ним своими мыслями по этому поводу. Любой мало-мальски серьёзный проект начинается с продумывания и организации структур данных, необходимых при решении задачи. Первая дилемма, встающая перед нами – хотим мы использовать динамические или статические структуры для хранения информации о клетках. Под статическими структурами имеется в виду, конечно, массив. Очевидно, недостатков у этого метода представления данных – более чем достаточно. Хватит даже одного: размеры популяции (число клеток в ней) неизбежно будут ограничены. Зачем же он нужен? Метод, основанный на использовании массива, программируется, пожалуй, проще, чем любой другой. Иногда Жизнь реализуют в декоративных целях: неплохая экранная заставка – развитие случайно сгенерированной популяции на поле, скажем, в 1024 на 768 мест, то есть, по пикселю на место. Зачем в такой программе трудиться над списками или другими динамическими структурами? Кроме того, здесь – тривиальный способ ускорения разрешения отношения соседства – сортировка. 1. Сортировка Итак, пусть нам дан массив на m элементов некоторой структуры, LifeCell, содержащей два информационных поля. Допустим, такой структуры: struct LifeCell {
Будем хранить в нём информацию о существующих клетках на данный момент времени. То есть, если место с координатами x0 и у0 является клеткой, то в массиве должен присутствовать элемент, имеющий поля со значениями x0 и y0. Пусть на данном шаге моделирования у нас будет заполнено n элементов. Так как размеры популяции, как правило, не постоянны во времени, то n будет меняться от итерации к итерации. Вот вам и очевидное ограничение: n не может превосходить m! Как происходит разрешение отношения соседства для объекта с координатами x0, y0? Для него нам нужно найти в массиве все соседние клетки (смотрите рисунок 2), тогда остальные его соседи являются местами. Обращаем Ваше внимание на то, что такой поиск нужно производить не только для n клеток, которые содержатся в массиве, но и для всех окружающих их объектов, то есть именно, для ближайших восьми соседей, так как это – места гипотетического возникновения жизни. Таким образом, на каждой итерации придётся разрешать отношение соседства для 9*n объектов (n клеток, у каждой – 8 соседей). Как сделать это максимально эффективно? Конечно, отсортировав массив по возрастанию (или по убыванию) одной из координат, скажем, по y. Тогда будет достаточно только пробежать в массиве интервал ячеек, для которых значения y-координат элементов будут заключены между y0-2 и y0+2. Остальные клетки рассматривать уже бессмысленно, так как они слишком далеки от нашего объекта. Затем нужно перейти к следующему объекту или следующей ячейке массива. Разрешать отношения соседства в строгом порядке, установленном расположением ячеек в массиве – очень рационально. Поступаем так: рассмотрели соседей клетки, содержащейся в ячейке массива с номером i, рассмотрели соседей её соседей – перешли к следующей (к (i+1)-ой). Тогда счётчик (индекс) обрабатываемой ячейки i поможет нам рассмотреть весь вышеописанный интервал и будет достаточно просто “пройтись” от i-ой ячейки вправо и влево по массиву до тех пор, пока y-координаты клеток не будет отличаться от y-координаты рассматриваемого объекта на два. Здесь, вообще говоря, нужно организовать просмотр так, чтобы не приходилось по несколько раз учитывать одни и те же клетки, ведь любая из них – соседка своего соседа, но в рамках этой статьи методы преодоления этой проблемы мы рассматривать не будем, так как она имеет лишь косвенное отношение к непосредственной тематике статьи. После того, как с соседями станет всё ясно, вносим в массив необходимые изменения, и, перед переходом на следующую итерацию, лишь сортируем его. Для этого можно использовать, например, алгоритм QuickSort, предложенный в 1962 году английским математиком Чарльзом Хоаром (его ещё можно встретить под названием “быстрая сортировка”). Для его изучения, можем порекомендовать книгу (2), где есть много интересной информации об алгоритмах сортировки вообще (на самом деле – и не только сортировки, а практически всех базовых алгоритмов, в том числе и упоминаемых далее в этой статье) и QuickSort, в частности. Опыт показывает, что сортировка внутри групп с одинаковыми y-координатами по x-координатам даст ощутимый эффект лишь при достаточно больших размерах популяции. Тем не менее, иногда, это всё же имеет смысл и тогда по x-координатам стоит проводить поиск дихотомией (“двоичным поиском”). Описание этого алгоритма, как, кстати, и алгоритма QuickSort, можно найти, например, в книге (3). От статических структур переходим к динамическим. Как Вы понимаете, сортировать список – не лучшая идея. Несмотря на то, что существует множество алгоритмов для этого, но сочетать динамические структуры, с тем же методом, который мы использовали для статических – не разумно, так как его реализация будет намного более сложной. Однако, справедливости ради, необходимо отметить, что трудоёмкость “ленточной сортировки” (метода упорядочивания списков) такая же, как и у QuickSort’а, то есть O(N*ln(N)), где N – число сортируемых элементов. Но к динамическим структурам применимо такое мощнейшее средство, как хеширование. 2. Стандартные принципы хеширования и их применение к Жизни Хеширование (от английского “hash” – “размешивать”) служит для оптимизации задач обработки информации, а конкретнее, преимущественно, для интересующего нас поиска (для нас важна именно эта операция, ведь как бы мы не организовали хранение информации, по всему её объёму, придётся искать соседей некоторого объекта). Метод хеширования позволяет производить это более эффективно. Его принцип заключается в разбиении всего набора данных на маленькие группы, с которыми быстрее оперировать. Для этого информационным полям конкретной структуры, сопоставляется значение некой функции. Так называемой, хеш-функции. Разбиение на группы, “размешивание” информации, происходит по признаку равенства этого значения (оно ещё называется ключом). Нужно стремиться к тому, чтобы группы были приблизительно одинаковыми по величине. Когда мы знаем содержимое полей структуры, которую хотим найти и можем произвести подсчёт ключа для неё, то после этого, искать точное совпадение требуемых полей нужно уже не по всему набору данных, а лишь в рамках группы, отвечающей конкретному полученному значению хеш-функции. В худшем случае, хеширование приведёт к обычному поиску полным перебором (справедливости ради надо отметить, что так будет лишь с точки зрения трудоёмкости, на практике получится ещё медленнее из-за “холостого прокручивания” механизма хеширования). Но для этого нужна поразительно неудачная хеш-функция, выдающая одинаковые значения ключа для всех объектов-структур, содержащихся в наборе данных, по которому производится поиск. Подробности об этом методе можно найти в, уже упоминавшейся в этой статье, книге (2). Достаточно эффективный способ применения такого метода – организация массива указателей на списки. Каждый из этих списков содержит структуры, значения хеш-функции для которых одинаково (это – вышеописанные группы), а индекс ячейки массива, содержащей указатель на данный список, равен её значению (этот способ будет широко использоваться в следующих параграфах). Также, вполне благоприятен вариант, когда индекс равен некоей функции от её значения. Ведь, например, в языках C/C++ массивы индексируются от нуля, и если наша хеш-функция принимает целые значения от 7, то функция преобразования индекса должна будет вычитать из получающегося ключа семёрку. Впрочем, эту функцию преобразования, в таком случае, имеет смысл включить в процедуры подсчёта хеш-функции. Хеширование особенно эффективно для больших колоний, когда выигрыш от его применения окупает накладные расходы на его реализацию, а число клеток на порядок больше числа возможных значений ключа. Очень часто в качестве хеш-функций применяются битовые операции. Пусть x, y и ключ занимают по одному байту, тогда последний можно по битам составить так, как показано на рисунке 3. Если целого байта под ключ жалко, то можно использовать четыре бита, как предложено на рисунке 4 (для обоих рисунков будем считать, что младший бит – слева). Конечно, эффективность этого метода зависит от набора данных, на котором он используется. Скажем, точки (255;0), (150;45), (166;37), (200;139) размешаются хеш-функцией, изображённой на рисунке 3 хорошо, все – в разные списки, а точки (85;239), (117;238), (87;171), (213;170) – все в один.
На самом деле, нет никаких принципиальных ограничений на используемые хеш-функции, кроме границ здравого смысла. Помимо побитовых преобразований, это могут быть просто математические функций или композиции тех и других. Но не надо слишком мудрствовать. Надеемся, например, синус суммы x и y вряд ли кто-нибудь будет использовать в качестве хеш-функции, по крайней мере, применительно к Жизни. Ключ должен быть достаточно короток, чтобы расходы на него были позволительны и в то же время, достаточно длинен, чтобы хорошо “размешивать” данные (чем больше мощность множества значений ключа, тем больше разных групп можно составить, тем меньше в них будет элементов (но хотелось бы, чтобы они всё же были в каждой группе и, чтобы их количество для всех групп было почти одинаковым или хотя бы одного порядка) и тем быстрее по ним будет производиться поиск). Изображённые на рисунках 3 и 4 модели получения ключа по полям LifeCell используют некие общие соображения теории хеш-функций, абстрагируясь от специфики задачи. Как было указано выше, есть наборы клеток, которые эти функции размешают крайне плохо. Давайте всё-таки вспомним, что мы моделируем именно Жизнь. 3. Более “Жизненное” хеширование Зададимся двумя целыми параметрами a и b и матрицей указателей на списки mat (далее, говоря “хеш-таблица”, будем иметь в виду именно её) размера a на b. В качестве ключей хеширования (здесь их будет даже два) предлагается использовать остатки от деления x на a в первом случае и y на b, во втором. Вот примеры реализации таких хеш-функций для x и для y, соответственно: int HashX(int x) { int HashY(int y) { Очевидно, что результатом выполнения первой функции будет целое число из отрезка от 0 до a-1, а второй – от 0 до b-1. Пусть, после одного такого вычисления мы получили f – как значения ключа для x, а g – для y некоторой точки (x0,y0). Тогда мы должны будем искать информацию о том, является ли место (x0,y0) клеткой в списке, на который указывает mat(f,g). На рисунке 5 приведён пример такого размещения, в котором положено a=8 и b=8, хотя, вообще говоря, a и b вполне могут быть (а скорее, даже, должны быть) не равны, что мы будем наблюдать в дальнейшем. Так в чём же обещанное преимущество хеш-метода, описанного в этом параграфе, над общим, описанном в предыдущем? Дело в том, что этот метод – адаптивный, то есть он может повышать свою эффективность, в зависимости от конкретных данных, “переразмешивать” структуры вследствие анализа своей собственной работы. 4. Адаптивное хеширование Как Вы уже, наверное, догадались, механизм “переразмешивания” основан на изменении a и b. Когда списки, “прицепленные” к разным ячейкам матрицы, слишком сильно отличаются по размеру, следует изменить параметры хеширования (a и b) и, как следствие, размеры нашей таблицы. Вернёмся снова к случаю, когда оба параметра равны восьми, рассмотренному нами в предыдущем параграфе. Клетки с координатами 1, 9, 17, … , и вообще, вида 1+8k (где k – некое целое число), в таком случае, попадут в один список (ещё раз взгляните на рисунок 5). Как нужно поменять a и b, чтобы исправить ситуацию? Посмотрите на таблицу №1.
Здесь приведены остатки от деления чисел указанного вида на целые числа от одного до двадцати четырех. Жёлтые строки не представляют для нас никакого интереса, так как изменение параметра хеширования на соответствующие им значения делителя не приведут к “переразмешиванию”, а сохранят текущую группировку информации, то есть, всё, что было в одном списке – в одном же и останется. Только количество списков уменьшится, вследствие их объединения прямо целыми группами (например, это произойдёт, если поменять значение a с 8 на 4). Остальные строки разделены на розовые и голубые зоны. Эти зоны представляют собой периоды значений хеш-функции (два соседних периода выделены разными цветами, для наглядности) если параметр размешивания принять равным соответствующему делителю. В рамках рассматриваемой нами задачи, ясно, что все значения хеш-функции внутри одного периода не повторяются, тогда длина периода и есть количество списков, на которые разобьётся группа, имеющая непомерно большое, в нашем понимании, число элементов. Если мы рассматриваем в данный момент хеширование по x-координате, а d – делитель, претендующий на то, чтобы стать параметром размешивания (для определённости – a), то это длина (обозначим её, как len), очевидно, равна max(a,d)/nod(a,d), где функция max возвращает максимум двух чисел, а nod – их наибольший общий делитель. Теперь мы можем просто сформулировать, что для жёлтых строк len=1. Какое же d принять за новое значение a? Конечно, лучше – то, которому соответствует наибольшая len. Тогда, одним из критериев оптимального решения является то, чтобы nod(a,d)=1 или, проще говоря, чтобы a и d были взаимно простыми. Ясно, что можно найти сколь угодно большое d, удовлетворяющее этому условию. Вообще предел len, при d стремящемся к бесконечности, равен бесконечности, но с практической точки зрения нам бы не очень хотелось непомерно расширять mat. Поэтому “лучше, чтобы nod(a,d) равнялся единице”, так как тогда меньшим d будет соответствовать большая len. Так всё-таки, в каких пределах лучше искать d? Наверное, самым правильным будет завести неких базовый уровень t, в окрестности которого найти d1 и d2, такие, что d1 < a , а d2 > a и оба “достаточно хорошо” переразмешают клетки. Потом выбрать из них то, которое ближе к t. Что значит “достаточно хорошо перемешивает”? Как уже не раз говорилось, это значит так, чтобы все группы были приблизительно равных размеров. Методы повышения эффективности установления этого мы можем обсудить. Нужно отметить, что t может меняться от итерации к итерации. Можно использовать в качестве t кубический корень из числа клеток на данном шаге (округлённый, естественно), тем более что число клеток, как правило, является важным параметром работы клеточного автомата и почти всегда вычисляется и отображается на экране. Однако, при использовании этого метода бывает эффективным пересчитывать t не каждый раз, а через один или два раза, в зависимости от периодичности колонии, развивающейся в конкретном мире (это – очень интересная тема, может кто-то хочет что-нибудь сказать или спросить по этому поводу). Что такое, эти пресловутые, группы “приблизительно равных размеров”? Как понять, что построенная хеш-таблица требует “перетряхивания”? Предлагается следующий метод: при каждом её изменении, обусловленном событиями, происходящими с колонией, считать среднее арифметическое числа элементов в списке. Здесь можно воспользоваться тривиальным свойством среднего арифметического: если нам известно его значение An для n чисел, то, если добавить к набору чисел, для которого производится вычисление, ещё одно число q, то для n+1 числа An+1=(nAn+q)/(n+1). Например, можно написать это как-то так: void AddValue(int q, float& A, int& n) // Функция, осуществляющая добавление к набору n чисел, по которому считалось среднее арифметическое A, числа q { void Iteration() Пусть результат подсчёта среднего помещён в A. Так, если изначально задать некое целое положительное число r, то перестраивать хеш-таблицу следует, если число клеток в некотором списке в r раз больше, чем A. Для быстрейшей проверки этого соотношения имеет смысл представить mat не как матрицу указателей, а, например, как матрицу записей с двумя полями: одно из которых – указателей, а второе – длина списка, на который он указывает. Подсчитав сумму этих длин, можно заодно выяснить и число клеток на данном шаге, что может быть полезно (смотрите несколько абзацев выше) или намного более простым способом подсчитать A. Зачем же тогда нужен описанный выше способ определения среднего? Дело в том, что есть ещё один вариант, экономящий память, но теряющий в эффективности. Можно сравнивать r, умноженное на A, со значениями длин списков, полученными на следующей итерации (их всё равно нужно считать для следующего значения среднего арифметического). Таким образом, A, “отстаёт” на один шаг. Почему это вообще имеет смысл? Ответ лежит только в узко специфических особенностях Жизни по правилам Конвея (2 соседа, чтобы не умереть, 3, чтобы родиться) или близких к ним, но никак не что-то вроде 1, 6 и 7, чтобы умереть и 2, 3 и 5, чтобы родиться, Жизнь по которым даже представить трудно. Во-первых, это обусловлено периодичностью стационарных состояний, а во-вторых, тем, что “сфера влияния” клетки – её ближайшие соседи и за один шаг она не может “переместиться” дальше, чем на одно место. Таким образом, стоящая в списке, на который указывал mat(u,v) клетка, не попадёт никуда, кроме, как в один из восьми списков: mat(u,v+1), mat(u,v-1), mat(u+1,v+1), mat(u+1,v), mat(u+1,v-1), mat(u-1,v+1), mat(u-1,v) или mat(u-1,v-1). Думаете, игра не стоит свеч? Напрасно! Попробуйте. Конечно, намного эффективнее (или, по крайней мере, логичнее) рассматривать A с текущими значениями длин списков, но как промежуточный вариант это очень не плохо. А если Вы программируете Жизнь под DOS’ом, то это – просто способ сэкономить память ещё на несколько сотен клеток. Кроме того, это можно рассматривать просто, как расширение описываемого метода хеширования, вносящее дополнительную неопределённость в результат. Константу r выбирайте также осторожно, чтобы слишком частые “перестройки” не затормаживали работу машины из-за большой трудоёмкости, а слишком редкие – из-за неэффективного поиска. Не стоит применять методы определения необходимости перестройки mat, основанные на разности минимальной и максимальной длин списков. Почти всегда минимум будет равен нулю. Вообще, лучше избегать абсолютных отклонений при хешировании, намного практичнее использовать относительные. Наверное, у Вас возникает абсолютно справедливый вопрос: а какие a и b использовать при первом шаге программы? Да хоть уже не раз упоминавшиеся значения 8! А лучше – a=8, а b=7, чтобы первая же итерация с диагонально-растянутыми колониями не потребовала переразмешивания. Однако, метод адаптивный и mat всё равно будет перестраиваться под конкретную ситуацию на поле. Лучше выбирайте их не очень большими, помните, раз в итерацию Вам придётся пробегать матрицу размером a на b, делая, прямо скажем, не тривиальные операции. Поэтому и было упомянуто, что можно использовать t, как плавающую границу. Пример такого метода: задаться некоторым параметром w и считать t, не, как было предложено выше, как кубический корень из числа клеток, а как корень степени w, чтобы, варьируя w от 3 до “бесконечности”, удерживать t в разумных для используемого компьютера пределах. То есть так, чтобы пересчёт занимал время, не обременяющее пользователя. Однако, нужно иметь в виду, что чем больше a и b, тем быстрее, для хорошо размешанных данных, осуществляется поиск клетки. Здесь приведён далеко не полных список возможных методов эффективной организации данных при программировании такой интереснейшей игры, как Жизнь. Кроме того, они немного адаптированы под статью. Ведь на практике, вместо массива структур с двумя полями, очевидно, лучше применять просто два массива. Однако, информация, представленная в этой статье, пожалуй, может послужить хорошей отправной точкой или, по крайней мере, поводом для размышлений. Автор с удовольствием будет общаться с теми, кто имеет, что сказать по данному вопросу или вообще, поводу алгоритмов реализации Жизни, форматов файлов, хеш-функций, логики построения, математики, или с теми, кто просто хочет пообщаться на тему клеточных автоматов в целом и Жизни, в частности. Может быть, кто-то реализовывал что-то подобное на практике или воспользовался вышеописанными советами при написании программ? Вообще, поделитесь, пожалуйста, впечатлениями о статье. Список литературы: Брайан Хэйес, Удивительно, что молекулы воды "знают", как создавать сложные симметричные снежинки. Никакой "архитектор" не руководит строительством, и молекулы не несут информации об этой кристаллической структуре. Весь узор возникает в результате ближних взаимодействий множества одинаковых частиц. Каждая молекула реагирует только на воздействие ближайших соседей, но расположение в определенном порядке сохраняется во всей структуре, состоящей примерно из 10^20 молекул. Идея автомата с клеточной структурой почти также стара, как и идея электронно-вычислительной машины. Первые исследования были проведены в начале 50-х годов Дж. фон Нейманом (следует учесть важный вклад в эти разработки С. Улама). Первоначальная цель фон Неймана состояла в создании простой системы, способной воспроизводить саму себя подобно живому организму. Наиболее известный клеточный автомат - игра "Жизнь", придуманная в 1970 г. Дж. Конвеем, как ясно из названия, также имеет биологический аспект: клетки рождаются, живут или умирают в зависимости от локальной плотности популяции. В игру "Жизнь" играют на прямоугольной решетке из клеток с двумя состояниями и с окрестностью Мура и дополнительным усложнением, согласно которому центральная клетка тоже считается членом своей окрестности. Другими словами, при каждом шаге эволюции системы каждая клетка проверяет состояния восьми своих соседей и свое собственное. Согласно правилам, установленным Конвеем, если центральная клетка жива, то она будет жить в следующем поколении, когда две или три клетки из ее окрестности живы. Если найдутся три живые клетки в рассматриваемой окрестности, то центральная клетка будет живой в следующем поколении независимо от ее теперешнего состояния. Во всех других случаях центральная клетка либо умирает, либо остается мертвой. Вишняк и другие ученые из группы Массачусетского технологического института подчеркивают, что клеточный автомат имеет статус, отличный от статуса других физических моделей. Наиболее распространенным средством построения математической модели мира издавно служило дифференциальное уравнение, которое описывает изменения некоторой величины как функцию координат и времени. Например, уравнения Максвелла дают изменения электромагнитного поля от точки к точке и от одного момента времени к другому. Все величины в таких уравнениях являются непрерывными (они гладко изменяются), с другой стороны, клеточный автомат - полностью дискретная система. Пространством является не континуум, а клеточная схема; время разбивается на последовательность дискретных шагов, а клетки автомата могут иметь лишь конечное число состояний, в то время как величина поля принимает значения из непрерывной области значений. При написании такой программы следует иметь в виду несколько тонких моментов. Очень важно не нарушить состояния клетки, пока оно не проверено всеми другими клетками, в окрестность которых она входит. Простейший путь выполнения этого требования - сохранение двух копий данной схемы; программа изучает одну копию для определения текущего состояния окрестности и вносит результаты вычислений в другую копию. Следует также определить условия на границе. Идеальным случаем была бы бесконечная схема, но ясно, что это невыполнимо. Распространенным приемом является соединение концов схемы, так что клетки на противоположных краях становятся соседними. В одномерном случае схема такого рода топологически является окружностью, а в двумерном - тором, хотя это и конечные схемы, но границ они не имеют. Существует особый класс клеточных автоматов, называемых обратимыми. Из любого начального состояния на любое число временных шагов допускается эволюция обратимого автомата, а затем автомат останавливается и запускается обратным ходом, после чего он возвращается в свое точное начальное состояние. Конфигурации образованные типичным обратимым автоматом, качественно отличны от конфигураций, свойственных необратимому автомату. В частности, если конфигурация вначале случайна, то она и стремится остаться случайной - самоорганизующейся структуры не возникает. С особой ясностью связь между физическими процессами и вычислениями была установлена Тоффоли в его заявлении, которое можно интерпретировать как описание самого большого из всех клеточных автоматов. "В некотором смысле, - пишет он, - в течении миллиардов лет природа постоянно вычисляла "следующее состояние" Вселенной; все, что нам надо сделать, - и действительно, что мы можем сделать, - это "войти в колею" этого гигантского непрекращающегося процесса вычисления и попытаться угадать, какая часть его движется в нужном нам направлении". Классические статьи о "Жизни" Серия переводных статей Мартина Гарднера, которая является чуть ли не единственным систематическим изложением основ Игры "Жизнь" на русском языке.
Хотите регулярно получать новые задачи и познавательные топики? Подпишитесь на рассылку
|
Случайное:
Обсуждения:
Ogra → Инспектор Варнике
Carcass → Тест советского восьмиклассника
Руслан → Слова, оканчивающиеся на “зо”.
ололошин → Незадачливый рыбак
lisicanasta → Инквизиция в наши дни
Ogra → И все же, они вертятся?
SM → Последовательность
Nastya → Бесконечная игра
SpAwN# → Самая трудная игра в мире
Карта сайта:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9 марта 2009 в 19:15
Хм, первое изображение видно, лежит тут на сервере, а остальные на народе=\
Сюда же можно залить) famlife скачал, потыкал стандартные фигуры. Статью пока особо не читал, но в самой проге при построении заметил такую фишку, что у симметричных фигур при долгом развитии в какой-то момент симметричность нарушается. За границами поля развитие не идёт?
9 марта 2009 в 19:41
Yakov
Всё развивается. Ты просто размер ячейки поменьше поставь. Всё.Исправил :)
18 марта 2009 в 18:52
а интересно, вот это всё кто-нибудь читал :)
19 марта 2009 в 10:37
Да, я прочитал :)
25 февраля 2011 в 16:57
пытался забавлятся данной игрой на долго не хватает, я понимаю что ето научная штучка нужна для показывания каких то там гипотез но если сделать ее более красочной и управляемой возможно можно было бы сделать игрушку для всех, эх жалко уменя нет знакомых программеров)
23 ноября 2011 в 18:31
Очень интересная статья! Обязательно в ближайшее время буду применять новые идеи в своей проге. http://gmlive.narod.ru/download/live/version_0_3/gamelive.html - на момент осени 2011 это последняя версия. Много нет. В скором времени планирую увеличить производительность и добавить новые фичи. А так же перевести на различные языки.
Ещё раз спасибо автору за статьи!