四柱汉诺塔的 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.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
随机推荐
- Pycharm之使用git merge合并分支
当我们在某个分支上代码开发完成,代码测试没问题后需要把分支上的代码合并到 master 分支上.这样保证 master 分支的代码永远都是最新的,也是最干净的,这样才可以持续的开发自己的项目.本篇讲解 ...
- Git之常用文件
git项目中的特殊文件, 常见文件有.gitignore, .gitkeep 1) .gitkeep git默认是不允许提交一个空的目录到版本库上的, 可以在空的文件夹里面建立一个.gitkeep文件 ...
- HTML img标签
1.基本用法 <img src="kof5.jpg" alt="特瑞"> src属性为图片的链接地址,如果图片加载失败,代替图片的就是alt属性设置 ...
- Java框架 —— Spring
Spring 简介 一般来说,Spring指的是SpringFramework,它提供了很多功能,例如:控制反转(IOC).依赖注入 (DI).切面编程(AOP).事务管理(TX) 主要 jar ...
- 当年的毕设-cpf (一个简易的协议 fuzzer)
整理文件时发现了这个,看是否有人需要... https://github.com/hac425xxx/cpf/ cpf 一个简单的协议Fuzz工具. 毕设答辩胶片&演示视频 https://g ...
- 鸿蒙UI开发快速入门 —— part03: 组件的生命周期
1. 什么是组件的生命周期 组件的生命周期是我们开发一个组件必须要关注的内容,组件的生命周期,指的是组件的创建.渲染.销毁等过程.因为这个过程就类似于人从出生到离世的过程,从而称为:组件的生命周期. ...
- 拥抱云原生,数据湖加速器 GooseFS 助力 Fluid 数据缓存实现
01 前言 数据湖加速器 GooseFS 是由腾讯云推出的高性能.高可用.弹性的分布式缓存方案.依靠对象存储(Cloud Object Storage,COS)作为数据湖存储底座的成本优势,为数据湖 ...
- 【金TECH频道】企业架构转型组合拳来袭,助力金融机构一臂之力
当前,数字化转型已经成为时代共性课题在政策和技术的双重指引下金融机构逐渐走向差异化竞争的格局面对转型阵痛以契合.明晰的战略规划及企业架构调整来辅助业务变革成为助力企业数字化转型的有效路径金融机构也纷纷 ...
- 常用 NoSQL 比较
Q: 请根据 CAP 实现程度,分布式实现方式,数据结构,查询方式,存储引擎等比较 mongodb, redis, cassandra, scylladb, dragonflydb, TiKV, co ...
- Debian 12 (bookworm) 安装方法及其国内软件源
摘要: Debian 12 (bookworm) 已经于2023年6月份正式发布.以下为原来信息: Debian 12 (bookworm) 预计于2023年中期发布,但是目前(2023年4月)已经处 ...