魔方机器人大赛——魔方步骤转换算法

       在谈论步骤转换算法之前,我们不妨讨论一下现在一般的魔方面的表示方法:

                                          

在我们表示魔方面的时候,一般会先把魔方展开,这里我采用CubeExplore的展开方式,在这种展开方式当中,面的录入方式是按照下图来录入的;F表示白色,U表示蓝色,R表示红色,L表示橙色,D表示绿色,B表示白色;(应当注意这里的LR颜色与一般的魔方相反,自己改过来,避免输入之后无解)

                                          

录入的时候参考:

再参考完魔方的编码方之后,我们来讨论一下步骤的表示方式:

                                         

在一般的魔方表示算法中,大致先将魔方分为六个面,分别是UP,DOWN,RIGHT,LEFT,BACK,FRONT,六个面,分别用首字母UDRLBF决定旋转的是那个面,然后将魔方每个面的转动用U`,U1,U2分别表示顺时针转90度,逆时针转90度,顺(逆)时针转180度,有时候也会有中层旋转的表示方法,但是由于机器人转中层是非常划不来的,所以不考虑;

          于是我们就可以用一串字符串表示出魔方还原的解法。

          事实上,目前来说在魔方还原算法中,最快速的算法是由kociemba开发的二阶段算法,而且在魔方还原软件中如果纯手写未免耗时太长,效果又不见得好,所以多采用cube explore软件来还原魔方,关于Cube explore这个软件,在Google上可以搜到作者创建的主页,里面有许多SDK,如果愿意,可以下载开发者留的开源phyton库,将还原算法内置到项目当中;我们在制作魔方机器人的过程当中,采用的是cube explore的网络功能,通过网络 链接的方式来得到解法。这一点我不赘述,下载cube explore 5.00版本的说明文档里面有讲解如何通过网络端口的形式与软件通信来求解魔方算法。文章末尾会留下链接;

     但是,通过cube explore求解得到的魔方算法运用到魔方机器人中,因为比赛的规则是:双臂两指或五指,所以需要将六个面的魔方求解算法转化到两只手还原魔方的机械步骤当中。我们团队采用的是两只的方案,这里我主要一下所要讲的就是这种转换算法:

  下面定义手指的动作:

LO__left hand open

L1__left thand 顺时针90 

L2__left hand 逆时针90

L3__180度

RO R1 R2 R3为另外一只手

                                        

这样,我们的算法就是由魔方还原算法到机械步骤的一种映射

这套算法的来源是去年冠军队学长的,不是我写的,所以我不贴源码了,大家自己去实现;

首先这是一个寻找最少机械步骤数解的问题,我们的目标是找到机械步骤最少的翻译步骤

我们先考虑魔方旋转完的末态:每当我们执行完由CubeExplore而来的一个步骤的时候,我们的两只手一定是闭合的。因为只有两只手都闭合才能拧动魔方,由于我们装了到导气滑环,所以手指转180度以后,与原始状态是一致的。所以每当执行完一个步骤之后一共有三种情况:左手归位,右手不归位;左右手都归位;左手不归位,右手归为;三种情况;

于是我们再考虑末态魔方的状态,一个面被拧动过后魔方末态,被拧动要么是左手,要么是右手,可以归位或者不归位,魔方可以旋转四下;

于是总共魔方和手合起来的末态有:2*4*2=16种

再考虑魔方的初态:当我们不考虑魔方处于手指上的状态,单纯考虑我们想要旋转的面处于哪一个位置的时候,魔方的位置有6种情况,可以旋转90,-90,180三个角度,手指有三个状态(如果初始状态是闭合的,那么在进行完一步之后下一步一定是闭合的);

于是组合起来的初态有6*3*3=54种;

有了这样一种思考之后,我们就可以知道,对于每一个魔方解法步骤,每一种初态,有16种末态,每一个末态又对应16个下一部的末态,于是这个问题变成了一个数的深度优先遍历的问题;

整个算法大致是这样的:

检查魔方的状态,看要旋转的面处于那个面,旋转多少度,手指什么状态,确定是54种初态的哪一步;

可以分出16个末态;

在每一个末态下嵌套作为初态继续判断是54种状态的哪一种,递归,直到所有步骤都被翻译。

以上算法每个步骤16个分支,一般的魔方解法有20步,那就是16的二十次方,这个显然是计算机无法接受的,需要减枝,只要略微思考就可以发现,当我们16种解法分出去以后,这16种解法的下一步的16种解法其实魔方和手的状态是一致的,魔方和手完全一致,我们可以减去非时间最少的分支,像这样,每一步事实上都只有16个分支在跑,计算机可以接受,结果也可以秒出。

 

如果觉得本博客对你有帮助请点赞+评论,如果还有什么问题欢迎发邮件939117440@qq.com跟我交流,新手写博客,有什么问题还请不吝赐教。之后还会有一篇总结感悟。

 

 

 

  • 25
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值