Ханойская башня ( также называемая «Проблема храма Бенареса» [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. Минимальное количество ходов, необходимое для решения головоломки Ханойской башни, составляет 2 n − 1 , где n — количество дисков. [12] Это именно n -е число Мерсенна без требований простоты. [1]
Простое решение игрушечной головоломки — чередовать ходы между самой маленькой и не самой маленькой частью. Передвигая самую маленькую фигурку, всегда перемещайте ее на следующую позицию в том же направлении (вправо, если начальное количество фигур четное, влево, если исходное количество фигур нечетное). Если в выбранном направлении позиции башни нет, переместите фигуру в противоположный конец, но затем продолжайте движение в правильном направлении. Например, если вы начали с трех частей, вы должны переместить самую маленькую часть на противоположный конец, а затем продолжить движение влево. Когда на очереди ход не самой маленькой фигуры, возможен только один ход. Это позволит решить головоломку за наименьшее количество ходов. [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 is от привязки (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]
В циклическом Ханое нам даны три колышка (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 к нулю не сходятся только первое и второе слагаемые, поэтому получаем асимптотическое выражение : , as . Таким образом, интуитивно мы могли бы интерпретировать долю как отношение труда, которое необходимо выполнить при переходе от случайно выбранной конфигурации к другой случайно выбранной конфигурации, относительно трудности пересечения «самого трудного» пути длины, который включает в себя перемещение всех дисков с одной привязки на другую. Альтернативное объяснение появлению константы 466/885, а также новый и несколько улучшенный алгоритм вычисления кратчайшего пути дал Ромик. [30]
В Магнитной башне Ханоя каждый диск имеет две отдельные стороны, северную и южную (обычно окрашенные в «красный» и «синий»). Диски нельзя располагать одинаковыми полюсами вместе — магниты в каждом диске предотвращают это незаконное перемещение. Кроме того, каждый диск необходимо переворачивать по мере его перемещения.
Этот вариант знаменитой головоломки о Ханойской башне был предложен ученикам 3–6 классов на 2-м чемпионате Франции по математическим и логическим играм, проходившем в июле 1988 года.
Правила головоломки по сути те же: диски перемещаются между колышками по одному. Ни в коем случае нельзя ставить диск большего размера поверх меньшего. Разница в том, что теперь для каждого размера есть два диска: черный и белый. Также теперь есть две башни из дисков чередующихся цветов. Цель головоломки — сделать башни монохромными (одного цвета). Предполагается, что самые большие диски в нижней части башен поменяются местами.
Вариант головоломки был адаптирован как пасьянс с девятью игральными картами под названием « Ханойская башня» . [32] [33] Неизвестно, является ли измененное написание оригинального имени преднамеренным или случайным. [34]
Ханойскую башню часто используют в психологических исследованиях по решению проблем . Существует также вариант этой задачи под названием « Лондонский Тауэр» для нейропсихологической диагностики и лечения нарушений управляющих функций. [ нужна цитата ]
Чжан и Норман [36] использовали несколько изоморфных (эквивалентных) представлений игры для изучения влияния репрезентативного эффекта на разработку задач. Они продемонстрировали влияние на производительность пользователей, изменив способ представления правил игры, используя изменения в физическом дизайне игровых компонентов. Эти знания повлияли на разработку структуры TURF [37] для представления взаимодействия человека и компьютера .
Ханойская башня также используется в качестве схемы ротации резервных копий при резервном копировании компьютерных данных , когда используются несколько лент/носителей. [ нужна цитата ]
Как упоминалось выше, Ханойская башня популярна для обучения рекурсивным алгоритмам начинающих студентов-программистов. Графическая версия этой головоломки запрограммирована в редакторе emacs , доступ к которому можно получить, набрав Mx hanoi. Существует также пример алгоритма, написанный на Прологе . [ нужна цитата ]
Ханойская башня также используется нейропсихологами в качестве теста, пытающимися оценить дефицит лобных долей . [38]
В 2010 году исследователи опубликовали результаты эксперимента, который показал, что муравьи вида Linepithemahumile успешно смогли решить трехдисковую версию проблемы Ханойской башни с помощью нелинейной динамики и сигналов феромонов. [39]
В 2014 году ученые синтезировали многослойные нанолисты палладия со структурой, напоминающей Ханойскую башню. [35]
В научно-фантастическом рассказе Эрика Фрэнка Рассела «Теперь вдохни» человек содержится в плену на планете, где по местному обычаю заставлять заключенного играть в игру до тех пор, пока она не будет выиграна или проиграна, прежде чем его казнят. Главный герой знает, что прибытие спасательного корабля может занять год или больше, поэтому он решает играть в «Ханойские башни» с 64 дисками. Эта история отсылает к легенде о буддийских монахах, игравших в эту игру до конца света. [40] [41] [42]
В рассказе Доктора Кто 1966 года «Небесный производитель игрушек » одноименный злодей заставляет Доктора сыграть в игру « Ханойская башня» с десятью частями и 1023 ходами под названием «Трилогическая игра», в которой кусочки, сложенные стопкой, образуют форму пирамиды. [41] [43]
В 2007 году концепция задачи «Ханойские башни» использовалась в «Профессоре Лейтоне и дьявольском ящике» в головоломках 6, 83 и 84, но диски были заменены на блины. Загадка была основана на дилемме, когда шеф-повар ресторана должен был переместить стопку блинов с одной тарелки на другую, используя основные принципы оригинальной головоломки (т.е. три тарелки, на которые можно было переместить блины, не имея возможности положить больший блин на меньший и т. д.)
В фильме 2011 года « Восстание планеты обезьян» эта головоломка, названная в фильме «Башня Лукаса», используется в качестве теста для изучения интеллекта обезьян. [41]
Эта головоломка регулярно используется в приключенческих играх и играх -головоломках . Поскольку его легко реализовать и легко распознать, он хорошо подходит для использования в качестве головоломки в более крупных графических играх (например, Star Wars: Knights of the Old Republic и Mass Effect ). [44] Некоторые реализации используют прямые диски, но другие маскируют головоломку в какой-то другой форме. Существует аркадная версия от Sega . [45]
Версия головоломки на 15 дисках появляется в игре Sunless Sea как замок на гробнице. У игрока есть возможность просмотреть каждый ход головоломки, чтобы решить ее, но игра отмечает, что для завершения потребуется 32 767 ходов. Если особо преданный игрок дойдет до конца головоломки, обнаружится, что завершение головоломки не открывает дверь.
Впервые это было использовано в качестве испытания в Survivor Thai в 2002 году, но вместо колец детали были сделаны так, чтобы напоминать храм. Сук Джай бросил вызов, чтобы избавиться от Джеда, хотя Шии-Энн прекрасно знала, как решить головоломку. Проблема показана как часть испытания с наградой в эпизоде американской версии сериала Survivor 2011 года . Оба игрока ( Оззи Ласт и Бенджамин «Тренер» Уэйд ) изо всех сил пытались понять, как решить головоломку, и им помогали их соплеменники.
В Genshin Impact эта головоломка показана в квесте Фарузан «Механизм раннего обучения», где она упоминает, что видит в ней механизм и использует его для создания прототипа игрушки для детей. Она называет это стопками пагод .