Башня Ханоя (также называемая Проблема храма Бенареса [1] или Башня Брахмы или Башня Лукаса [2] и иногда употребляемая во множественном числе как Башни , или просто пирамидальная головоломка [3] ) - это математическая игра или головоломка , состоящая из трех стержней и ряда дисков разного диаметра , которые могут скользить по любому стержню. Головоломка начинается с дисков, сложенных на одном стержне в порядке убывания размера, наименьший наверху, таким образом приближаясь к конической форме. Цель головоломки - переместить всю стопку на один из других стержней, соблюдая следующие правила: [4]
С тремя дисками головоломку можно решить за семь ходов. Минимальное количество ходов, необходимое для решения головоломки «Ханойская башня», составляет 2 n − 1 , где n — количество дисков.
Головоломка была изобретена французским математиком Эдуардом Люка , впервые представлена в 1883 году как игра, открытая «Н. Клаусом (де Сиамом)» (анаграмма «Лукас д'Амьен»), [5] [6] [7] и позже опубликована в виде брошюры в 1889 году [8] и в посмертно изданном томе Лукаса « Récréations mathématiques» . [9] К игре прилагалась инструкция, описывающая предполагаемое происхождение игры в Тонкине и утверждающая, что, согласно легенде, брахманы в храме в Бенаресе осуществляли движение «Священной башни Брахмы », состоящей из шестидесяти четырех золотых дисков, по тем же правилам, что и в игре, и что завершение строительства башни приведет к концу света. [10] Почти сразу же появились многочисленные вариации этой легенды относительно древней и мистической природы головоломки. [5]
Если бы легенда была правдой, и если бы жрецы могли перемещать диски со скоростью один в секунду, используя наименьшее количество ходов, им потребовалось бы 2 64 − 1 секунды или примерно 585 миллиардов лет, чтобы закончить [11], что примерно в 42 раза превышает предполагаемый текущий возраст Вселенной .
Существует множество вариаций этой легенды. Например, в некоторых рассказах храм — это монастырь , а священники — монахи . Храм или монастырь могут находиться в разных местах, включая Ханой , и могут быть связаны с любой религией . В некоторых версиях вводятся другие элементы, например, тот факт, что башня была создана в начале мира, или что священники или монахи могут делать только один ход в день.
В головоломку можно играть с любым количеством дисков, хотя во многих игрушечных версиях их около 7–9. Минимальное количество ходов, необходимое для решения головоломки «Ханойская башня» с n дисками, составляет 2 n − 1 . [12]
Простое решение для игрушечной головоломки — чередовать ходы между наименьшей частью и не наименьшей частью. При перемещении наименьшей части всегда перемещайте ее на следующую позицию в том же направлении (вправо, если начальное число частей четное, влево, если начальное число частей нечетное). Если в выбранном направлении нет позиции башни, переместите часть на противоположный конец, но затем продолжайте движение в правильном направлении. Например, если вы начали с трех частей, вы переместите наименьшую часть на противоположный конец, а затем продолжите движение в левом направлении. Когда очередь переместить не наименьшую часть, есть только один допустимый ход. Сделав это, вы завершите головоломку за наименьшее количество ходов. [13]
Итеративное решение эквивалентно повторному выполнению следующей последовательности шагов до тех пор, пока цель не будет достигнута:
При таком подходе стек окажется на колышке B, если количество дисков нечетное, и на колышке C, если количество дисков четное.
Ключ к рекурсивному решению проблемы — признать, что ее можно разбить на набор более мелких подзадач, к каждой из которых применяется та же общая процедура решения, которую мы ищем [ требуется ссылка ] , а затем общее решение находится каким-то простым способом из решений этих подзадач. Каждая из этих созданных подзадач, будучи «меньше», гарантирует, что базовый случай(ы) в конечном итоге будет достигнут. Для башен Ханоя:
Предположим, что все n дисков распределены по колышкам в допустимых расположениях; предположим, что на исходном колышке находится m верхних дисков , а все остальные диски больше m , поэтому их можно смело игнорировать; чтобы переместить m дисков с исходного колышка на целевой колышек, используя запасной колышек, не нарушая правил:
Затем полное решение «Ханойской башни» перемещает n дисков с исходного колышка A на целевой колышек C, используя B в качестве запасного колышка.
Этот подход можно строго доказать с помощью математической индукции , и он часто используется в качестве примера рекурсии при обучении программированию.
Как и во многих математических головоломках, найти решение проще, решив немного более общую задачу: как переместить башню из h (высота) дисков с начального колышка f = A (от) на конечный колышек t = C (до), где B — оставшийся третий колышек, и предположим, что t ≠ f . Во-первых, заметим, что задача симметрична относительно перестановок имен колышков ( симметричная группа S 3 ). Если известно решение для перемещения со колышка A на колышек C , то, переименовав колышки, можно использовать то же самое решение для любого другого выбора начального и конечного колышка. Если есть только один диск (или даже ни одного), задача тривиальна. Если h = 1, то переместите диск со колышка A на колышек C . Если h > 1, то где-то в последовательности перемещений самый большой диск должен быть перемещен со колышка A на другой колышек, предпочтительно на колышек C . Единственная ситуация, которая допускает этот ход, — это когда все меньшие h − 1 дисков находятся на колышке B. Следовательно, сначала все h − 1 меньших дисков должны перейти из A в B. Затем переместить самый большой диск и, наконец, переместить h − 1 меньших дисков со колышка B на колышек C. Наличие самого большого диска не препятствует перемещению h − 1 меньших дисков и может быть временно проигнорировано. Теперь задача сводится к перемещению h − 1 дисков с одного колышка на другой, сначала с A на B , а затем с B на C , но тот же метод можно использовать оба раза, переименовав колышки. Та же стратегия может быть использована для сведения задачи h − 1 к h − 2, h − 3 и так далее, пока не останется только один диск. Это называется рекурсией. Этот алгоритм можно схематизировать следующим образом.
Определите диски в порядке возрастания размера по натуральным числам от 0 до, но не включая h . Таким образом, диск 0 — наименьший, а диск h − 1 — наибольший.
Ниже приведена процедура перемещения башни из h дисков со штифта A на штифт C , где B — оставшийся третий штифт:
С помощью математической индукции легко доказать, что вышеприведенная процедура требует минимально возможного количества ходов и что полученное решение является единственным с этим минимальным количеством ходов. Используя рекуррентные соотношения , точное количество ходов, которое требуется этому решению, можно вычислить следующим образом: . Этот результат получается, если отметить, что шаги 1 и 3 требуют ходов, а шаг 2 требует одного хода, что дает .
Список ходов для башни, переносимой с одного колышка на другой, созданный рекурсивным алгоритмом, имеет много закономерностей. При подсчете ходов, начиная с 1, порядковый номер диска, который должен быть перемещен во время хода m , равен числу раз, которое m может быть разделено на 2. Следовательно, каждый нечетный ход включает в себя наименьший диск. Можно также заметить, что наименьший диск проходит через колышки f , t , r , f , t , r и т. д. для нечетной высоты башни и проходит через колышки f , r , t , f , r , t и т. д. для четной высоты башни. Это дает следующий алгоритм, который проще выполнить вручную, чем рекурсивный алгоритм.
В альтернативных ходах:
Для самого первого хода самый маленький диск кладется на колышек t, если h нечетное, и на колышек r, если h четное.
Также обратите внимание, что:
Обладая этими знаниями, можно восстановить набор дисков в середине оптимального решения, имея не больше информации о состоянии, чем позиции каждого диска:
Позиции диска можно определить более непосредственно из двоичного (с основанием 2) представления номера хода (начальное состояние — ход № 0, все цифры 0, а конечное состояние — все цифры 1), используя следующие правила:
Например, в 8-дисковом Ханое:
Исходный и конечный колышки для m -го хода также можно элегантно найти из двоичного представления m с помощью побитовых операций . Если использовать синтаксис языка программирования C , ход m выполняется от колышка (m & m - 1) % 3
к колышку ((m | m - 1) + 1) % 3
, где диски начинаются на колышке 0 и заканчиваются на колышке 1 или 2 в зависимости от того, четное или нечетное число дисков. Другая формулировка — от колышка (m - (m & -m)) % 3
к колышку (m + (m & -m)) % 3
.
Кроме того, диск, который нужно переместить, определяется числом раз, которое счетчик перемещений ( m ) может быть разделен на 2 (т. е. числом нулевых битов справа), считая первый ход за 1 и идентифицируя диски числами 0, 1, 2 и т. д. в порядке увеличения размера. Это позволяет очень быстрой нерекурсивной компьютерной реализации находить позиции дисков после m перемещений без ссылки на какой-либо предыдущий ход или распределение дисков.
Операция, которая подсчитывает количество последовательных нулей в конце двоичного числа, дает простое решение проблемы: диски нумеруются с нуля, и при перемещении m количество конечных нулей номера диска перемещается на минимально возможное расстояние вправо (при необходимости возвращаясь влево). [14]
Двоичная система счисления кодов Грея дает альтернативный способ решения головоломки. В системе Грея числа выражаются двоичной комбинацией нулей и единиц, но вместо того, чтобы быть стандартной позиционной системой счисления , код Грея работает на основе предпосылки, что каждое значение отличается от своего предшественника только одним измененным битом.
Если подсчитать в коде Грея размер бит, равный количеству дисков в конкретной Ханойской башне, начать с нуля и вести отсчет по возрастанию, то бит, изменяемый при каждом ходе, будет соответствовать перемещаемому диску, где наименее значимый бит — это наименьший диск, а наиболее значимый бит — наибольший.
Этот метод определяет, какой диск переместить, но не куда его переместить. Для наименьшего диска всегда есть две возможности. Для других дисков всегда есть одна возможность, за исключением случая, когда все диски находятся на одном колышке, но в этом случае либо нужно переместить наименьший диск, либо цель уже достигнута. К счастью, есть правило, которое говорит, куда переместить наименьший диск. Пусть f будет начальным колышком, t — конечным колышком, а r — оставшимся третьим колышком. Если количество дисков нечетное, наименьший диск циклически перемещается по колышкам в порядке f → t → r → f → t → r и т. д. Если количество дисков четное, это должно быть наоборот: f → r → t → f → r → t и т. д. [15]
Положение изменения бита в решении кода Грея дает размер диска, перемещаемого на каждом шаге: 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, ... (последовательность A001511 в OEIS ), [16] последовательность, также известная как функция линейки , или на единицу больше степени 2 в числе ходов. В языке Wolfram Language дает IntegerExponent[Range[2^8 - 1], 2] + 1
ходы для головоломки с 8 дисками.
Игра может быть представлена неориентированным графом , узлы которого представляют распределение дисков, а ребра — ходы. Для одного диска граф представляет собой треугольник:
Граф для двух дисков представляет собой три треугольника, соединенных так, чтобы образовать углы большего треугольника.
Вторая буква добавляется для обозначения большего диска. Очевидно, что изначально его нельзя переместить.
Самый верхний маленький треугольник теперь представляет возможности одного хода с двумя дисками:
Узлы в вершинах внешнего треугольника представляют собой распределения, в которых все диски находятся на одном и том же штифте.
Для h + 1 дисков возьмите график h дисков и замените каждый маленький треугольник графиком для двух дисков.
Для трех дисков график имеет вид:
Стороны самого внешнего треугольника представляют собой кратчайшие пути перемещения башни с одного колышка на другой. Ребро в середине сторон самого большого треугольника представляет собой ход самого большого диска. Ребро в середине сторон каждого следующего меньшего треугольника представляет собой ход каждого следующего меньшего диска. Стороны самых маленьких треугольников представляют собой ходы самого маленького диска.
В общем случае для головоломки с n дисками в графе есть 3 n узлов; каждый узел имеет три ребра к другим узлам, за исключением трех угловых узлов, у которых их два: всегда можно переместить наименьший диск на один из двух других колышков, и можно переместить один диск между этими двумя колышками, за исключением ситуации, когда все диски уложены на один колышек. Угловые узлы представляют три случая, когда все диски уложены на один колышек. Диаграмма для n + 1 дисков получается путем взятия трех копий диаграммы n -дисков — каждая из которых представляет все состояния и перемещения меньших дисков для одной конкретной позиции нового наибольшего диска — и соединения их в углах тремя новыми ребрами, представляющими единственные три возможности переместить наибольший диск. Таким образом, полученная фигура имеет 3 n + 1 узлов и все еще имеет три угла, оставшихся только с двумя ребрами.
По мере добавления большего количества дисков графическое представление игры будет напоминать фрактальную фигуру, треугольник Серпинского . Очевидно, что подавляющее большинство позиций в головоломке никогда не будут достигнуты при использовании кратчайшего возможного решения; действительно, если жрецы легенды используют самое длинное возможное решение (не посещая повторно ни одну позицию), им потребуется 3 64 − 1 ходов, или более 10 23 лет.
Самый длинный неповторяющийся путь для трех дисков можно визуализировать, удалив неиспользуемые ребра:
Кстати, этот самый длинный неповторяющийся путь можно получить, запретив все ходы из a в c .
Гамильтонов цикл для трех дисков имеет вид:
Графики наглядно показывают, что:
Это дает N h 2, 12, 1872, 6563711232, ... (последовательность A125295 в OEIS )
Если все перемещения должны быть между соседними колышками (т. е. если колышки A, B, C, нельзя перемещаться напрямую между колышками A и C), то перемещение стопки из n дисков со колышка A на колышек C занимает 3 n − 1 перемещений. Решение использует все 3 n допустимых позиций, всегда выбирая единственный ход, который не отменяет предыдущий ход. Положение со всеми дисками на колышке B достигается на полпути, т. е. после (3 n − 1) / 2 перемещений. [17] [18]
В Cyclic Hanoi нам даны три колышка (A, B, C), которые расположены в виде круга с направлениями по часовой стрелке и против часовой стрелки, определяемыми как A – B – C – A и A – C – B – A соответственно. Направление движения диска должно быть по часовой стрелке. [19] Достаточно представить последовательность дисков, которые нужно переместить. Решение можно найти с помощью двух взаимно рекурсивных процедур:
Чтобы переместить n дисков против часовой стрелки к соседнему целевому штифту:
Чтобы переместить n дисков по часовой стрелке к соседнему целевому штифту:
Пусть C(n) и A(n) представляют собой движущиеся n дисков по часовой стрелке и против часовой стрелки, тогда мы можем записать обе формулы:
Решение для циклического Ханоя имеет некоторые интересные свойства:
Хотя версия с тремя колышками имеет простое рекурсивное решение, известное давно, оптимальное решение задачи о Ханойской башне с четырьмя колышками (называемой головоломкой Рива) не было проверено до 2014 года Бушем. [20]
Однако в случае четырех и более колышков алгоритм Фрейма–Стюарта известен без доказательства оптимальности с 1941 года. [21]
Для формального вывода точного числа минимальных ходов, необходимых для решения задачи с применением алгоритма Фрейма–Стюарта (и других эквивалентных методов), см. следующую статью. [22]
Другие варианты задачи о четырехколышечной Ханойской башне см. в обзорной статье Пола Стокмейера. [23]
Так называемые игровые конфигурации «Башни Бухареста» и «Башни Клагенфурта» дают троичные и пятеричные коды Грея. [24]
Алгоритм Фрейма–Стюарта описан ниже:
Алгоритм можно описать рекурсивно:
Весь процесс занимает ходов. Поэтому следует выбрать количество , для которого это количество минимально. В случае 4-х колышков оптимальное значение равно , где — ближайшая целочисленная функция . [25] Например, в курсе UPenn CIS 194 по Haskell на первой странице заданий [26] указано оптимальное решение для случая 15 дисков и 4-х колышков в размере 129 шагов, что получается для указанного выше значения k .
Предполагается, что этот алгоритм оптимален для любого количества колышков; его количество ходов равно 2 Θ ( n 1/( r −2) ) (для фиксированного r ).
Любопытное обобщение изначальной цели головоломки — начать с заданной конфигурации дисков, где все диски не обязательно находятся на одном колышке, и прийти за минимальное количество ходов к другой заданной конфигурации. В общем, может быть довольно сложно вычислить кратчайшую последовательность ходов для решения этой задачи. Решение было предложено Андреасом Хинцем и основано на наблюдении, что в кратчайшей последовательности ходов наибольший диск, который необходимо переместить (очевидно, можно игнорировать все наибольшие диски, которые будут занимать один и тот же колышек как в начальной, так и в конечной конфигурации), переместится либо ровно один раз, либо ровно два раза.
Математика, связанная с этой обобщенной задачей, становится еще интереснее, если рассмотреть среднее число ходов в кратчайшей последовательности ходов между двумя начальными и конечными конфигурациями дисков, которые выбираются случайным образом. Хинц и Чан Тат-Хунг независимо друг от друга обнаружили [27] [28] (см. также [29] : Глава 1, стр. 14 ), что среднее число ходов в n-дисковой башне определяется следующей точной формулой:
Для достаточно большого n только первый и второй члены не сходятся к нулю, поэтому мы получаем асимптотическое выражение : , как . Таким образом, интуитивно мы могли бы интерпретировать дробь как представляющую отношение труда, который нужно выполнить при переходе от случайно выбранной конфигурации к другой случайно выбранной конфигурации, относительно трудности пересечения «самого трудного» пути длины, который включает перемещение всех дисков с одного колышка на другой. Альтернативное объяснение появления константы 466/885, а также новый и несколько улучшенный алгоритм вычисления кратчайшего пути были даны Ромиком. [30]
В Магнитной башне Ханоя каждый диск имеет две отдельные стороны: Север и Юг (обычно окрашенные в «красный» и «синий»). Диски нельзя размещать с одинаковыми полюсами вместе — магниты в каждом диске предотвращают этот незаконный ход. Кроме того, каждый диск должен быть перевернут при перемещении.
Этот вариант знаменитой головоломки «Ханойская башня» был предложен ученикам 3–6 классов на 2 -м чемпионате Франции по математическим и логическим играм, проходившем в июле 1988 года.
Правила головоломки по сути те же: диски переносятся между колышками по одному. Ни в коем случае нельзя класть больший диск на меньший. Разница в том, что теперь для каждого размера есть два диска: один черный и один белый. Также теперь есть две башни из дисков чередующихся цветов. Цель головоломки — сделать башни монохромными (одного цвета). Предполагается, что самые большие диски внизу башен меняются местами.
Вариант головоломки был адаптирован в виде игры-солитера с девятью игральными картами под названием « Башня Ханоя» . [32] [33] Неизвестно, является ли измененное написание оригинального названия преднамеренным или случайным. [34]
Ханойская башня часто используется в психологических исследованиях по решению проблем . Существует также вариант этой задачи под названием «Лондонская башня» для нейропсихологической диагностики и лечения расстройств исполнительной функции . [36]
Чжан и Норман [37] использовали несколько изоморфных (эквивалентных) представлений игры для изучения влияния эффекта представления в дизайне задач. Они продемонстрировали влияние на производительность пользователя, изменив способ представления правил игры, используя вариации в физическом дизайне компонентов игры. Эти знания повлияли на разработку фреймворка TURF [38] для представления взаимодействия человека и компьютера .
Ханойская башня также используется в качестве схемы ротации резервных копий при выполнении резервного копирования компьютерных данных, когда задействовано несколько лент/носителей. [ необходима ссылка ]
Как упоминалось выше, Ханойская башня популярна для обучения рекурсивным алгоритмам начинающих программистов. Иллюстрированная версия этой головоломки запрограммирована в редакторе emacs , доступ к которому осуществляется путем ввода Mx hanoi. Также имеется пример алгоритма, написанного на Prolog . [ требуется цитата ]
Ханойская башня также используется нейропсихологами в качестве теста, пытающимися оценить дефицит лобных долей . [39]
В 2010 году исследователи опубликовали результаты эксперимента, который показал, что вид муравьев Linepithema humile успешно смог решить трехдисковую версию задачи о Ханойской башне с помощью нелинейной динамики и феромонных сигналов. [40]
В 2014 году ученые синтезировали многослойные палладиевые нанолисты со структурой, похожей на Ханойскую башню. [35]
В научно-фантастическом рассказе «Now Inhale» Эрика Фрэнка Рассела человек содержится в плену на планете, где местный обычай заключается в том, чтобы заставлять пленника играть в игру, пока она не будет выиграна или проиграна, прежде чем его казнят. Главный герой знает, что спасательный корабль может прибыть через год или больше, поэтому он решает сыграть в Towers of Hanoi с 64 дисками. Эта история отсылает к легенде о буддийских монахах, игравших в эту игру до конца света. [41] [42] [43]
В рассказе «Небесный игрушечник» 1966 года о Докторе Кто злодей заставляет Доктора играть в игру «Ханойская башня» из десяти фигур, состоящую из 1023 ходов, под названием «Трилогическая игра», в которой фигуры, сложенные друг на друга, образуют пирамиду. [42] [44]
В 2007 году концепция задачи о ханойских башнях была использована в головоломках 6, 83 и 84 в игре Professor Layton and the Diabolical Box , но диски были заменены на блины. Головоломка была основана на дилемме, в которой шеф-повар ресторана должен был переместить стопку блинов с одной тарелки на другую, используя основные принципы оригинальной головоломки (т. е. три тарелки, на которые можно было переложить блины, невозможность положить больший блин на меньший и т. д.)
В фильме 2011 года « Восстание планеты обезьян » эта головоломка, названная в фильме «Башня Лукаса», используется в качестве теста для изучения интеллекта обезьян. [42]
Головоломка регулярно появляется в приключенческих играх и головоломках . Поскольку ее легко реализовать и легко распознать, она хорошо подходит для использования в качестве головоломки в более крупной графической игре (например, Star Wars: Knights of the Old Republic и Mass Effect ). [45] Некоторые реализации используют прямые диски, но другие маскируют головоломку в какой-то другой форме. Существует аркадная версия от Sega . [46]
15-дисковая версия головоломки появляется в игре Sunless Sea как замок в гробнице. Игрок имеет возможность кликать по каждому ходу головоломки, чтобы решить ее, но игра отмечает, что для ее завершения потребуется 32 767 ходов. Если особенно преданный игрок кликает до конца головоломки, выясняется, что завершение головоломки не открывает дверь.
Впервые это было использовано в качестве испытания в Survivor Thailand в 2002 году, но вместо колец детали были сделаны в виде храма. Сук Джай бросила вызов, чтобы избавиться от Джеда, хотя Ши-Энн прекрасно знала, как завершить головоломку. Задача представлена как часть наградного испытания в эпизоде 2011 года американской версии сериала Survivor TV . Оба игрока ( Оззи Ласт и Бенджамин «Тренер» Уэйд ) изо всех сил пытались понять, как решить головоломку, и им помогали их соплеменники.
В Genshin Impact эта головоломка показана в квесте-тусовке Фарузан "Early Learning Mechanism", где она упоминает, что видит ее как механизм и использует ее для создания прототипа игрушки для детей. Она называет это стеками пагоды .