四柱汉诺塔的 Frame-Stewart 算法及其最优性
注:本文基本上是对参考文献 \(1\) 的翻译。这份论文是法语的,并且我没找到英语版本或中文介绍(
大家应该很熟悉汉诺塔了把,,,这里就不解释三柱汉诺塔了。
Frame-Stewart 算法
对于有 \(N\) 个圆盘 \(p\) 和 \(p(p\ge 3)\) 个柱子的汉诺塔,该算法寻找 \(1\le l<N\),使得以下步骤得到操作次数最小:
把前 \(l\) 个通过 \(p\) 个柱子移到一个非目标柱子上。
把剩下的圆盘通过 \(p-1\) 个柱子移到目标柱子上去。
把前 \(l\) 个通过 \(p\) 个柱子移到目标柱子上。
设其答案为 \(\Phi(p,N)\),有:
\]
边界条件:\(\Phi(3,N)=2^N-1,\Phi(p,1)=1\)。
如何证明其正确性呢?这是一个困难的问题,见下文所述。
有关 \(\Psi\) 和 \(\Phi\) 的代数性质
有必要引入几个重要函数及其性质来辅助证明定理 \(9\) 和定理 \(10\)。
设
\]
\]
\]
此时有 \(\Delta u=u+\Delta(u-1)\)。
参考文献 2 指出,
\]
可以发现其的确和 \(\Phi(4,N)\) 的递推式吻合,所以说 \(\Phi(n)\) 即为所找 \(\Phi(4,N)\)。根据这一点不难得出其通项公式
\]
推论:
\]
其中 \(t=\lceil \sqrt{2n}\rceil\)。
引理 1:对于 \(n,p\in \mathbb{N},p\le n+1\),
\]
证明:显然其在 \(p=0\) 时成立,\(p\) 逐渐增加到 \(n+1\) 时都不会改变 \(\Delta n+p-1\) 的 \(\nabla\) 值,得证。
定义函数
\]
\]
不难发现其是良定义的。
引理 2:\(\forall n\in\mathbb{N}\),
\]
证明:
\(n=0\) 时命题成立。因此假设 \(n\ge 1\)。
类似于带余除法地,设 \(n=\Delta m+p\),其中 \(m=\nabla n\),此时 \(0\le p\le m\)。
根据引理 \(1\),有:
\]
\]
因此 \(\forall L\in \mathbb{N}\),有:
\]
\]
\]
此式 \(>0\) 当且仅当:
\]
即 \(\nabla n\ge L+2\),等价于 \(L<m-1\)。因此只需计算 \(\Psi_{m-1}[n]\)。
\]
\]
\]
\]
证毕。
推论:
\]
根据引理 \(2\) 化为 \(\Phi\) 即可。
引理 \(3\):\(\forall n\in \mathbb{N}\),
\]
设 \(s=\nabla n\)。根据 \(\Psi[\cdot]\) 递增,仅需考虑 \(\Psi[\Delta s+2]\ge 2^{s+1}\)。
容易验证 \(s<2\) 时成立,对于 \(s\ge 2\),根据引理 \(2\),
\]
证毕。
引理 \(4\):\(\forall E\subset N,\#E=n\),
\]
\(n\le \Psi[n]\) 是显然的。
\(\Psi[n]\le \Psi (E)\):设 \(E\) 排序后为 \(e_0<e_1<\dots<e_{n-1}\)。此时有 \(e_i\ge i\)。所以
\]
\(\Psi(E)\le 2^n-1\):放缩,
\]
\]
证毕。
引理 \(5\):设 \(A,B\subset \mathbb{N}\),
\]
设 \(\Psi(A)=\Psi_L(A)\)。放缩:
\]
\]
引理 \(6\):设 \(A\subset \mathbb{N}\),\(s\in \mathbb{N}\),使得 \(\#(A-[\Delta s])\le s\),那么:
\]
可以假设 \(A\neq \varnothing\),那么 \(s\ge 1\)。\(\forall L\ge s-1\),根据前面的结果,
\]
那么 \(\exists L\le s-1,\Psi(A)=\Psi_L(A)\),所以:
\]
证毕。
引理 \(7\):
设 \(n,s\in \mathbb{N},s\ge 1,n\ge \Delta(s-1),A\in [n],b_{1:s}\in \mathbb{N}^s\)。有:
\]
设 \(A_t=A\cup \{b_{1:t}\},0\le t\le s\)。原命题等价于
\]
只需考虑 \(t>0,b\) 互不相同。
根据引理 \(2\),右式可以写作 \(2^{\sigma -1}\),其中 \(\sigma=\nabla (n+t)\)。根据引理 \(6\),只需证明 \(\#(A_t-[\Delta\sigma])\le \sigma\)。
注意到 \(\Delta(\sigma+1)>n+t\),即 \(\sigma+\Delta\sigma\ge n+t\),所以
\]
下面证明 \(\sigma\ge t\):
\]
所以
\]
而 \(\sigma=\nabla(n+t)\ge t\)。证毕。
引理 \(8\):
设 \(A,B\subset \mathbb{N},n=\#(A\cup B)\),则
\]
等号可直接通过定义得到,关注不等号:
设 \(E=A\cup B,L\in \mathbb{N}\)。根据引理 \(4\),总有 \(\Psi_L(E)\ge \Psi_L[n]\)。所以:
\]
\]
和上面类似地,设 \(n+3=\Delta m+p\),其中 \(m=\nabla (n+3)\)。
根据引理 \(1\),有:
\Phi(\Delta(m-2))=1+(m-3)2^{m-2}
\]
取 \(L=m-2\)。这样
\]
\]
\]
\]
这些引理会在后面的证明被反复应用。
定理 \(9\) 及其证明
汉诺塔游戏和定理 \(9\)
接下来回到原问题汉诺塔问题。
从小到大对圆盘用 \([N]\) 标号。记 \(C\) 是柱子集合,比方说 \(\{0,1,2,3\}\)。
一个汉诺塔游戏的状态可以使用一个函数 \(u:[N]\to C\) 表示。\(u(a)\) 表示 \(a\) 盘子所在柱子。所有状态的集合显然就是 \(C^{[N]}\)。
定义距离函数 \(d(u,v):(C^{[N]})^2\to \mathbb{N}\cup \{\infty\}\),是两个状态通过合法操作互化的最小操作次数。
定理 \(9\):
设 \(C=\{0,1,2,3\},N\in \mathbb{N}\),\(u,v\) 是两个 \(N\) 圆盘 \(4\) 柱汉诺塔的状态。如果 \(\forall i,v(i)\in \{2,3\}\),那么:
\]
这个定理意味着,\(N\) 圆盘 \(4\) 柱汉诺塔的答案 \(\ge \Psi[N]\)。
下面大部分的篇幅将会证明这个定理。
定理 \(9\) 的证明
定义和基础性质
我们采取对 \(N\) 归纳的方法。边界条件是显然的。
设 \(E=\{k\in [N]\mid u(k)=0\}\)。可以假设 \(E\neq \varnothing\),否则命题显然。
设 \(u',v':[N-1]\to C\),是 \(u,v\) 移除掉最大的圆盘的状态。
有:
\]
若 \(N-1\not\in E\),显然;因此,假设 \(N-1\in E\)。不妨设 \(v(N-1)=2\)。
接下来定义路径。设 \(d(u,v)=D\)。路径是函数 \(\gamma:[D+1]\to C^{[N]}\),且满足 \(\gamma(0)=u,\gamma(D)=v\),\(d(\gamma(i),\gamma(j))=|i-j|,\forall i,j\in [D+1]\)。下面,也用 \(\gamma _i\) 指代 \(\gamma(i)\)(应用柯里化技巧)。
事实上,把所有的状态可以一步互化的连上无向边,得到的图上 \(u\) 到 \(v\) 的任意一条最短路径就是上面的 $\gamma $。
设 \(E'=\{k\in E\mid \exists t\in [D+1],\gamma_t(k)=3\}\),即初始在第 \(0\) 柱,但经过第 \(3\) 柱的圆盘集合。
考虑 \(E'=\varnothing\) 的情况。这就是三柱问题,而根据引理 \(4\) 知道 \(\Psi (E)\le 2^{\# E}-1\),而 \(D\ge 2^{\# E}-1\ge \Psi(E)\)。
设 \(T=\max E'\),\(E''=E-[T+1]\),\(K=|E''|\)(可能是 \(0\))。设 \(E''=\{b_{1:K}\},b_i<b_{i+1}\)。
显然有 \(T+K+1\le N\)。
设 \(t_0\) 是最小的整数使得 \(\gamma_{t_0}(T)\neq 0\),即 \(T\) 已经离开 \(0\) 柱子的时间。设状态 \(x_0=\gamma(t_0-1)\)。在这一状态中,第 \(0\) 柱的顶部是 \(T\),移动到的那一柱的顶部 \(>T\)。设 \(t_1\) 是最小的整数使得 \(\gamma_{t_1}(T)=3\)。类似地,设 \(x_3=\gamma(t_1)\)。在这一状态中,第 \(3\) 柱的顶部是 \(T\),来的那一柱顶部 \(>T\)。显然 \(1\le t_0\le t_1\le D\)。
设 \(t_2\) 是最小的整数使得 \(\gamma_{t_2}(N-1)\neq 0\),并设 \(z_0=\gamma(t_2-1)\)。在这一状态中,第 \(0\) 柱的顶部是 \(N-1\),移动到的那一柱是空的。设 \(t_3\) 是最大的整数使得 \(\gamma_{t_3}(N-1)\neq 2\),并设 \(z_2=\gamma (t_3+1)\)。在这一状态中,第 \(2\) 柱的顶部是 \(N-1\),来的那一柱是空的。此时有 \(t_2\le t_3+1\)。
类似地定义 \(x'_a,z'_b\) 是忽略 \(N-1\) 圆盘的 \(x_a,z_b\),\(x_a'',z_b''\) 是忽略 \(\ge T\) 的圆盘的 \(x_a,z_b\)。
观察到 \(z_0'\) 的两列都是空的。所以可以类似地应用归纳假设:
\]
类似地:
\]
\(\Delta K>T\)
首先考虑 \(\Delta K>T\) 的情形。
此时有 \(K\ge 1,T<b_k=N-1\),也就是说 \(N-1\) 没有经过第 \(3\) 柱。
此外,注意到 \((E-[\Delta K])\subset E''\),\(\#(E-[\Delta K])\le \Delta K\),那么可以应用引理 \(6\):
\]
与上面的式子结合,得到
\]
由于 \(t_2\le t_3+1\),\(u\) 到 \(v\) 的路径 \(\gamma\) 一定形如:
\]
考虑 \(z_2\) 的 \(2\) 柱和 \(c=\gamma_{t_3}(N-1)\)(\(c\in\{0,1\}\))柱上不能有 \(<N-1\) 的圆盘,所以 \(b_{1:K-1}\) 一定都在 \(1-c\) 柱上。这些盘最后(\(v\))一定都在 \(2\) 柱上,而这些圆盘不被允许通过第 \(3\) 柱。根据三柱汉诺塔,有:
\]
而 \(d(z_0,z_2)\ge 1\),所以:
\]
\]
证毕。
\(\Delta K\le T\)
其次考虑 \(\Delta K\le T\) 的情况。
取 \(s=\nabla(T+K+1)\)。由于 \(E=[T+1]\cup E''\),\(\#(E-[\Delta s])\le \max(T+1-\Delta s,0)+K\)。
显然 \(s\ge \nabla T\ge K\)。并且 \(T+K+1<\Delta(s+1)=\Delta s+s+1\),那么 \(T+K+1-\Delta s\le s\)。根据以上两条,有:
\]
所以应用引理 \(6\) 有:
\]
这次作用于上面的式子得到的结果是
\]
\(K=0\)
先考虑 \(K=0\)。
这意味着 \(T=N-1\) 经过了 \(3\) 柱,最后留在 \(2\) 柱。
因为 \(t_1\le t_3\),所以 \(u\) 到 \(v\) 的路径 \(\gamma\) 一定形如:
\]
设 \(c=\gamma_{t_3}(N-1)\neq 2\)。所以在状态 \(z_2'\) 中,所有圆盘都在除了 \(2,c\) 的那两个柱子上。设:
\]
不妨设 \(a,b\) 是依下表的值:
\(c\) | \(0\) | \(1\) | \(3\) |
---|---|---|---|
\(a\) | \(3\) | \(3\) | \(0\) |
\(b\) | \(1\) | \(0\) | \(1\) |
设
\]
\]
因为 \(A\cup B=[N-1]\),根据引理 \(8\),有:
\]
\]
\]
在 \(x'_a\) 中, \(a\) 柱和另一柱为空,因此可以应用归纳假设:
\]
而在 \(v'\) 中,\(0\) 和 \(1\) 柱为空,有:
\]
而在 \(z_0\) 到 \(z_2\) 的路径上,\([N-1]\) 的圆盘至少做了 \(d(x_a',z_2')\) 次操作(因为路径结构),而 \(N-1\) 至少需要 \(0\to 3\to 2\),所以
\]
那么
\]
\]
\]
\(K\ge 1\)
接下来解决最后一种情况:\(K\ge 1\),所以 \(T<b_k=N-1\)。
此时我们无从比较 \(t_1\) 和 \(t_3+1\),难以像之前一样直接每段放缩,只能分类讨论。
\(t_1>t_3+1\)
假设 \(t_1>t_3+1\)。
那么 \(u\to v\) 的路径一定形如:
\]
在状态 \(x_3\) 中,\(3\) 和 \(d=\gamma_{t_1-1}(T)\) 不包含小于 \(T\) 的圆盘。他们在剩下的两列里。所以,设 \(c=\gamma_{t_3}(N-1)\in \{0,1\}\)。
那么设:
\]
其中 \(a,b\) 值依下表。
\(d\) | \(0\) 或 \(1\) | \(2\) |
---|---|---|
\(a\) | \(2\) | \(c\) |
\(b\) | \(1-d\) | \(1-c\) |
设
\]
\]
在状态 \(z_2''\) 中, \(a\) 和另一列是空的。因此应用归纳假设:
\]
而在 \(v''\) 中, \(0,1\) 列为空。所以应用归纳假设:
\]
而 \(d(z_0,z_2)\ge 1\),所以:
\]
\]
\]
设 \(s=\nabla(T+K+1)\)。因为 \(T\ge \Delta K\),\(T+K+1\ge \Delta(K+1)\),即 \(s\ge K+1\)。但是
\]
即 \(\nabla T\ge s-1\)。根据引理 \(3\),\(\Psi[T+2]\ge 2^s\)。所以,\(D\ge \Psi (E)\)。
\(t_1<t_3+1\)
设 \(t_1<t_3+1\)。
\(u\to v\) 的路径一定形如:
\]
中间不能确定 \(x_3\) 和 \(z_0\) 的顺序。
在状态 \(z_2'\) 中,\(2\) 柱和 \(c=\gamma_{t_3}(N-1)\in \{0,1\}\) 柱为空。因此所有圆盘都在 \(3\) 柱和 \(b=1-c\) 柱上。\(b_{1:K-1}\) 一定在 \(b\) 柱上。
设
\]
\]
在状态 \(x_3''\) 中,\(3\) 柱和另一柱为空。因此可以应用归纳假设,\(d(z_2'',x_3'')\ge \Psi(A)\)。
而在状态 \(v'\) 中,\(0,1\) 柱为空,所以 \(d(z_2,v)\ge d(z_2',v')\ge \Psi(B)\)。
\]
所以
\]
由于 \(d(z_2'',x_3'')\ge \Psi(A)\),在 \(x_3\) 到 \(z_2\),\(<T\) 的圆盘至少操作 \(\Psi(A)\) 次。从 \(u\) 到 \(x_0\),\(<T\) 的圆盘至少操作 \(\Psi(E\cap [T])\) 次(依靠归纳假设)。此外,在 \(u\) 状态下,\(b_{1:K-1}\) 圆盘都在 \(0\) 柱,在 \(z_0\) 却都不在 \(0\) 柱上,且不能经过 \(3\) 柱。因此,根据三柱汉诺塔,他们至少需要 \(2^{K-1}-1\) 次操作完成这个。最后,盘 \(T\) 在 \(x_0\) 到 \(x_3\) 至少被操作一次,盘 \(N-1\) 在 \(z_0\) 到 \(z_2\) 至少被操作一次。综上,
\]
得到结果:
\]
\]
\]
另外,由于 \(T\ge \Delta K\),\(E=(E\cap[T])\cup\{T,b_{1:K}\}\),根据引理 \(7\),有:
\]
根据上式,有:
\]
根据引理 \(2\) 的推论,右式非负,所以 \(D\ge \Psi(E)\)。
至此,定理 \(9\) 的所有情况证毕。
证明原命题-定理 \(10\)
定理 \(9\) 并没有显然地给出 Frame-Stewart Algorithm 的正确性。
定理 \(10\):\(N\) 个圆盘的汉诺塔问题可以在 \(\Phi(N)\) 步内解决。
不妨设 \(N\ge 1\)。
设 \(u\) 是所有 \(N\) 个圆盘都在 \(0\) 柱的状态,\(v\) 是所有圆盘都在 \(2\) 柱的状态。
\(u\) 到 \(v\) 的路径一定形如:
\]
由于 \(z_0\) 有两列为空,应用定理 \(9\):
\]
同样,
\]
而 \(d(z_0,z_2)\ge 1\),所以:
\]
最后一个等号来源于引理 \(2\)。
证毕。
参考文献
参考文献 1 :T. Bousch. La quatri`eme tour de Hano¨ı. Bull. Belg. Math. Soc. Simon Stevin, 21:895–912,2014.
参考文献 2: S.Klav˘zar, U. Milutinovi´c, and C. Petr. On the Frame-Stewart algorithm for the multi-peg Tower of Hanoi problem.Discrete Appl. Math., 120(1–3):141–157, 2002.
四柱汉诺塔的 Frame-Stewart 算法及其最优性的更多相关文章
- hdu 1207 四柱汉诺塔
递推,汉诺塔I的变形. 这题真心没想到正确解法,越想越迷糊.这题看了别人题解过得,以后还是自己多想想,脚步太快并非好事. 贴上分析: 分析:设F[n]为所求的最小步数,显然,当n=1时,F[n]= ...
- 4柱汉诺塔(zz)
多柱汉诺塔可以用Frame–Stewart算法来解决. The Frame–Stewart algorithm, giving a presumably optimal solution for fo ...
- 多柱汉诺塔问题“通解”——c++
多柱汉诺塔问题 绪言 有位同学看到了我的初赛模拟卷上有一道关于汉诺塔的数学题.大概就是要求4柱20盘的最小移动次数. 他的数学很不错,找到了应该怎样推. 如果要把n个盘子移到另一个柱子上,步骤如下: ...
- The Towers of Hanoi Revisited---(多柱汉诺塔)
Description You all must know the puzzle named "The Towers of Hanoi". The puzzle has three ...
- HDU汉诺塔系列
这几天刷了杭电的汉诺塔一套,来写写题解. HDU1207 汉诺塔II HDU1995 汉诺塔V HDU1996 汉诺塔VI HDU1997 汉诺塔VII HDU2064 汉诺塔III HDU2077 ...
- 四柱加强版汉诺塔HanoiTower----是甜蜜还是烦恼
我想很多人第一次学习递归的时候,老师或者书本上可能会举汉诺塔的例子. 但是今天,我们讨论的重点不是简单的汉诺塔算法,而是三柱汉诺塔的延伸.先来看看经典的三柱汉诺塔. 一.三柱汉诺塔(Hanoi_Thr ...
- 汉诺塔的问题:4个柱子,如果塔的个数变位a,b,c,d四个,现要将n个圆盘从a全部移到d,移动规则不变
四柱汉诺塔问题的求解程序.解题思路:如a,b,c,d四柱. 要把a柱第n个盘移到目标柱子(d柱),先把上层 分两为两部份,上半部份移到b柱,下半部分移到c柱,再把第n盘移到 目标柱子,然后,c柱盘子再 ...
- [递推]B. 【例题2】奇怪汉诺塔
B . [ 例 题 2 ] 奇 怪 汉 诺 塔 B. [例题2]奇怪汉诺塔 B.[例题2]奇怪汉诺塔 题目描述 汉诺塔问题,条件如下: 这里有 A A A. B B B. C C C 和 D D D ...
- python汉诺塔问题的递归理解
一.问题背景 汉诺塔问题是源于印度一个古老传说. 源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下 ...
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
随机推荐
- vue2-路由Router
Vue 中的路由用于实现单页应用(SPA)中的页面导航.它允许你在不刷新整个页面的情况下,根据不同的 URL 路径显示不同的组件,提供了类似于多页面应用的用户体验.例如,在一个电商应用中,可以通过 ...
- python多版本管理软件pyenv
我们在平时的项目开发或者学习中,有可能使用不同的Python版本,大家都知道Python的版本非常多,如果我们把需要的不同版本的Python都下载到服务器上,管理起来会非常困难,多版本并存又容易互相干 ...
- laravel之验证器
开发中使用框架自带验证器进行参数验证 1.定义验证器基类,定义失败返回值 新建基础类文件 app > Http > Requests > BaseRequest.php <?p ...
- 六步取消win11开机PIN密码登录
0.前言 新买的电脑打开后首先要进行一系列的操作激活操作系统.在这些操作中最令人讨厌的是设置开机密码(pin). 也许有很多人的电脑需要保密,限制别人登录,这时使用登录pin是很有必要的.而还有很多人 ...
- 第一个 milestone:内推 50 人拿到微软 offer!
就在昨天,我的一位候选人和我说,他已经通过面试,正在 offer 沟通阶段.由此,我达成第一个小里程碑:成功内推 50 人拿到了微软 offer! 内推了多少人? 从 2019 年年初开始内推,到现在 ...
- Markdown转Beamer
技术背景 在早期我写过一些文章介绍用RMarkdown写Beamer,还有相应的TinyTex配置.后来Xie Yihui大神发文离开了RMarkdown核心团队,想来中文社区的支持力度和活跃度可能会 ...
- Qt/C++编写跨平台的推流工具(支持win/linux/mac/嵌入式linux/安卓等)
一.前言 跨平台的推流工具当属OBS最牛逼,功能也是最强大的,唯一的遗憾就是多路推流需要用到插件,而且CPU占用比较高,默认OBS的规则是将对应画布中的视频画面和设定的音频一起重新编码再推流,意味着肯 ...
- Qt编写地图综合应用4-仪表盘
一.前言 仪表盘在很多汽车和物联网相关的系统中很常用,最直观的其实就是汽车仪表盘,这个以前主要是机械的仪表,现在逐步改成了智能的带屏带操作系统的仪表,这样美观性和拓展性功能性大大增强了,上了操作系统的 ...
- Windows10 64环境下用Qt5.12.12自带的mingw730_64构建编译OpenCV4.1.0时cmake-3.20.6中的参数配置
一.环境条件说明: 操作系统:Windows10 64环境 编译工具:用Qt5.12.12自带的mingw730_64构建 构建对象:编译OpenCV4.1.0的Release 64位和Debug 6 ...
- IM跨平台技术学习(十三):从理论到实践,详细对比Electron和Tauri的优劣
本文由京东技术王泽知分享,原题"基于Web的跨平台桌面应用开发",下文进行了排版和内容优化. 1.引言 近些年来,跨平台跨端一直是比较热门的话题,Write once, run a ...