我正在寻找类似于Tower of Hanoi task的任务的解决方案,但这与河内不同,因为磁盘不受大小限制。我创建的伦敦塔任务有8个磁盘,而不是传统的3或5(如维基百科链接所示)。我正在使用“{3}}软件”主要用C ++编程(虽然你不需要知道C ++使用PEBL),但也使用flex和bison(GNU版本的lex和yacc)来处理解析。“ / p>
以下是该操作中的任务内容的视频:PEBL
*每个磁盘都是一个数字。例如,蓝色磁盘= 1,红色磁盘= 2等
1 \
2 ----\
3 ----/ 3 1
4 5 / 2 4 5
========= =========
左侧包含您必须移动的磁盘,以匹配右侧。共有3列。
因此,如果我使用8个磁盘制作它,我会创建一个试验看起来像这样:
1 \
2 ----\ 7 8
6 3 8 ----/ 3 6 1
7 4 5 / 2 4 5
========= =========
如何确定左侧所需的最小移动量是多少?我不需要使用PEBL对此进行编码,但我需要知道,因为我正在计算一个人每次试用的最小值。
答案 0 :(得分:0)
原则很简单,它的广度优先搜索:
每个州都有一定数量的后继状态(由可能的移动定义)。
因此,在每个步骤中,计算当前可用状态的后继状态,并查看是否达到目标状态。
但是,请注意,这可能需要一段时间,并且会占用大量内存! 您可以在我们的情况下进行优化,因为您可以省略前一个状态。 不过,在大多数州,你将有5个可能的举动。这意味着在N步之后你将需要考虑5 ^ N个状态。
例如,如果我没有犯错的话,你的第二个例子将需要10个动作。这将为您提供大约1000万个州。大多数现代计算机无法超越深度15搜索。
我认为找到解决方案的算法既简单又快捷,但我们没有证据证明这个解决方案是最短的解决方案。