- 最后登录
- 2023-8-16
- 在线时间
- 3007 小时
- 阅读权限
- 100
- 注册时间
- 2007-12-3
- 积分
- 3923
- 帖子
- 2556
- 精华
- 6
- UID
- 15558
- 性别
- 保密
- WCA ID
- 2008CHEN27
- 兴趣爱好
- 理论
- 积分
- 3923
- 帖子
- 2556
- 精华
- 6
- UID
- 15558
- 性别
- 保密
- WCA ID
- 2008CHEN27
- 兴趣爱好
- 理论
|
最近一直在研究计算机解魔方最少步,然后在吧里看了N多帖子,始终没能找到有哪个帖子说了CE最核心算法的,所以为了普及知识,还是单独把这块拿出来说下。
1、二阶段搜索法
一般情况下都是在这个模式下工作的,而且吧里也有很多这块的帖子,该方法有点是效率高,缺点是结果不一定是最少步。而且这一块吧里也有足够多的帖子讨论了这个算法,我就不再多解释了。
2、最短步数解法(就是optimal那个地方打上勾以后)(IDA*算法,听名字巨强,后来看看。。也确实挺强的,只是下面的表述方法可能能让大家更方便的了解这个算法,就略去了具体实现过程了。虽然其实那个才是程序的关键。。。)
根据源代码分析,解法的思路是这样的:
1、从打乱状态进行穷举,每转动到一个状态,都从表中查到该状态的一部分需要还原的最少步数,加上当前以进穷举到的深度,将这个和作为“期望距离”后放入待穷举队列。
2、每次要继续穷举的时候优先从“期望距离”比较短的状态开始穷举。
Q:什么叫一部分需要还原的最少步数
A:就是只关心这个魔方的某些部分的还原。比如,对于某个魔方,它的角块总可以看做二阶魔方,如果这个二阶魔方至少需要8步才能还原,那原来那个三阶魔方也一定至少需要8步才能还原。(当然CE不会很简单的用二阶这块来做)
在这样的定义下,很显然“期望距离”一定会大于等于真正还原所需的距离,所以很容易知道,如果所有节点的“期望距离”都大于某个值(比如14),那么该打乱的魔方是不可能在这个值以下还原的(即魔方的最大步数一定大于等于15)。同时以也可以发现,虽然我们知道了额14这个数字,但是事实上程序并没有搜完所有14步状态(这也是不可能的,因为现在全球最好的结果就是某人花了10天借了台超级计算机算到了13步,因为状态数实在太多了),甚至在平均情况下只搜索了6~7步,借助于这个部分还原表查到当前枚举到的状态的“期望距离”
太晚了,就先写那么多,写得稍微乱了点不知道大家能不能看懂,有什么因为跟帖提出吧,我再组织语句来重新写一遍。。。
//ps:我个人觉得,在最少步数这块,应该有希望做出比CE更快更高效的软件。。。只是需要尝试。。。至少通过我对二阶魔方的研究,现在基本已经“拿下”二阶魔方,三阶的话还在思考中= =b
========================================================
关于“搜索”。刚前面时空版主问了这个是什么问题,就在这单独解释下。搜索,其实就是穷举。魔友们要深刻认识到一点:计算机除了记忆量、计算速度比人快之外其他什么都不会。所以对于求魔方最短步数这个问题,计算机什么都不会,只会枚举。说白了就是,先尝试从F,F',F2...这些,一直转完18种转法,发现无法还原,然后尝试2步的转动,FR,FR2,FR'等等,几十或者几百种转法,发现又无解,那么再尝试3步,等等。无论是CE,还是别的什么算法,只要是稍微好点的,基本都是穷举(模拟人脑的基本都只能得到40步之外的解法,和最少步数无关,不在考虑范围)。
所以CE也不可避免的使用了搜索,只不过如前所说,它不是盲目的进行搜索,它是根据魔方的“打乱情况”进行分析,感觉哪些个状态可能离目标比较近的就先搜索,使得很快它就能知道多少步之内肯定无解。具体可以在回顾上文所所。
[ 本帖最后由 铯_猪哥恐鸣 于 2010-3-6 01:26 编辑 ] |
-
总评分: 经验 + 100
查看全部评分
|