三阶魔方还原 two phase 算法 学习笔记
2014-07-04 16:48
330 查看
twophase算法,或者Kociemba's Algorithm。
wiki说,目前速度最快且解决魔方平均步骤最少的软件是Cube Explorer。【1】
以下是按照官网上作者公开的mathematica文档,对算法的分析。
文档和相关说明可以在下面的网站中找到。
http://kociemba.org/cube.htm
零.六个面表示 ,旋转相应的面对应数字
U 1,2,3
R 4,5,6
F 7,8,9
D 10,11,12
L 13,14,15
B 16,17,18
一. 数据结构
1.魔方状态表示
{{{角方块排列},{角方块旋转}},{{中间方块排列},{中间方块旋转}}}
还原状态下的魔方,其中方块的标号如下图所示
角方块有三面,其中必有一面属于U或D,该面朝向作为方块旋转标识,如果该面朝向为U或D则为0,否则按顺时针旋转数计算(好像这个地方也可以随意定义,因为感觉算法中用到的旋转是相对的)
中间方块同理,不过计算朝向的优先级为UD>FB>LR
2.用到的列表
对还原状态魔方分别进行18种(6个面*3)旋转对应的魔方状态
魔方状态,18中操作下的转换,魔方状态,用排列的字典序表示,或者旋转对应的3进制或2进制数
角方块旋转与9,10,11,12方块对应位置的深度检索表(第一阶段搜索用)(A)
中间块旋转与9,10,11,12方块对应位置的深度检索表(第一阶段搜索用)(B)
角方块排列与9,10,11,12方块排列的深度检索表(第二阶段搜索用)(C)
中间块排列与9,10,11,12方块排列的深度检索表(第二阶段搜索用)(D)
二.算法部分
算法第一阶段,试图找到使 角方块和 中间方块旋转 为0 ,并且中间块9,10,11,12 按照任意排列位于9,10,11,12的位置
算法第二阶段,用4,6,7,9,13,15,16,18这8种动作之外的动作使魔方还原。因为这8种动作会导致第一阶段中已经为0的选择变为非零,并且会使9,10,11,12四个方块换到其他位置
两个阶段均类似于宽度优先搜索。作者原话是,
iterative deepening A* with a lowerbound heuristic function (IDA*)
如果第二阶段动作书为0,也就是第一阶段就还原了魔方,那么这个结果是最优的。
【1】http://zh.wikipedia.org/zh-cn/%E9%AD%94%E6%96%B9
wiki说,目前速度最快且解决魔方平均步骤最少的软件是Cube Explorer。【1】
以下是按照官网上作者公开的mathematica文档,对算法的分析。
文档和相关说明可以在下面的网站中找到。
http://kociemba.org/cube.htm
零.六个面表示 ,旋转相应的面对应数字
U 1,2,3
R 4,5,6
F 7,8,9
D 10,11,12
L 13,14,15
B 16,17,18
一. 数据结构
1.魔方状态表示
{{{角方块排列},{角方块旋转}},{{中间方块排列},{中间方块旋转}}}
还原状态下的魔方,其中方块的标号如下图所示
{{{1, 2, 3, 4, 5, 6, 7, 8}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}}
角方块有三面,其中必有一面属于U或D,该面朝向作为方块旋转标识,如果该面朝向为U或D则为0,否则按顺时针旋转数计算(好像这个地方也可以随意定义,因为感觉算法中用到的旋转是相对的)
中间方块同理,不过计算朝向的优先级为UD>FB>LR
2.用到的列表
对还原状态魔方分别进行18种(6个面*3)旋转对应的魔方状态
魔方状态,18中操作下的转换,魔方状态,用排列的字典序表示,或者旋转对应的3进制或2进制数
角方块旋转与9,10,11,12方块对应位置的深度检索表(第一阶段搜索用)(A)
中间块旋转与9,10,11,12方块对应位置的深度检索表(第一阶段搜索用)(B)
角方块排列与9,10,11,12方块排列的深度检索表(第二阶段搜索用)(C)
中间块排列与9,10,11,12方块排列的深度检索表(第二阶段搜索用)(D)
二.算法部分
算法第一阶段,试图找到使 角方块和 中间方块旋转 为0 ,并且中间块9,10,11,12 按照任意排列位于9,10,11,12的位置
算法第二阶段,用4,6,7,9,13,15,16,18这8种动作之外的动作使魔方还原。因为这8种动作会导致第一阶段中已经为0的选择变为非零,并且会使9,10,11,12四个方块换到其他位置
两个阶段均类似于宽度优先搜索。作者原话是,
iterative deepening A* with a lowerbound heuristic function (IDA*)
如果第二阶段动作书为0,也就是第一阶段就还原了魔方,那么这个结果是最优的。
【1】http://zh.wikipedia.org/zh-cn/%E9%AD%94%E6%96%B9
相关文章推荐
- C++精华(STL)学习笔记之算法
- 关于C++标准库泛型算法merge的学习笔记
- 挖掘闭合模式的高性能算法学习笔记——CFIST
- 遗传算法与直接搜索工具箱学习笔记 四-----从直接搜索算法开始
- 汉诺塔算法学习笔记
- 智能算法学习笔记
- 算法导论学习笔记-找数组中第二小的数
- STL的内观排序(introsort)算法学习笔记
- 学习笔记:TimeSpan(时间片),以及各种时间差的算法
- 每天学习一点flash(35) 游戏设计笔记 (5) 跳跃算法笔记
- 链栈实现算法 - Java 学习笔记(26)
- SMO学习笔记(二)——还原(恢复)篇之完整恢复
- SMO学习笔记(二)——还原(恢复)篇之完整恢复
- 基础算法学习笔记(二)----动态规划
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(7)习题2.8 随机数组的三种生成算法
- 算法学习笔记--概况
- 算法导论学习笔记-1
- Matlab学习笔记(3)矩阵与魔方
- JAVA 数据结构与算法学习笔记一(转载)
- 数据结构和算法学习笔记(1)