python三阶魔⽅_三阶魔⽅⾃动求解及动态可视化matlab代码三阶魔⽅⾃动求解及动态可视化matlab代码
思路与步骤
三阶魔⽅有6个⾯,每个⾯有
3
×
3
3\times3
linspace函数python3×3⼩块,⽤⼀个
6
×
3
×
3
6\times3\times3
6×3×3的矩阵来保存魔⽅的状态;
定义4+12种魔⽅旋转⾏为:整体旋转(左右上下共4种⽅式AaCc),侧⾯(6个侧⾯顺逆时针旋转共12种⽅式LlRrUuDdFfBb),旋转可视化界⾯⽅便调试(三维⼩⾯作图fill3创建
6
×
3
×
3
=
54
6\times3\times3=54
6×3×3=54个⼩⾯对象,对象成员属性包括颜⾊和4个三维坐标点,定义了全局函数对⼩⾯进⾏绕轴旋转操作,如此可以可视化调试,确保程序是按⼈想法运⾏),旋转⾏为改变矩阵的状态矩阵;
定义随机打乱和逆序恢复的函数,测试确保⼈为给出旋转公式,魔⽅能正确旋转;
编写按公式恢复魔⽅的函数,记录恢复过程的旋转过程公式(取⼀个魔⽅⼀边拧⼀边编程,考虑所有情况)
1):顶层拼⼗字:简化为4次恢复顶⾯棱中⼩块(不破坏已恢复的结果)
2):顶层拼四⾓:简化为4次恢复顶⾯的⾓⼩块(不破坏已恢复的结果)
第⼀层恢复完成,剩下可按公式恢复魔⽅,把第⼀层置底
3):⼆层拼棱⾓:简化为4次恢复⼆层棱⾓⼩块(不破坏已恢复的结果)
第⼆层恢复完成
4):按公式顶层拼⼗字
5):按公式顶层四⾓对应恢复
6):按公式顶⾯同⾊恢复
7):按公式顶⾯棱边恢复
第三层恢复完成
编写⼀个公式简化的函数,如消除相邻正反操作、消除4次相同操作、3次同向旋转替换为⼀次反向旋转操作、不相关跳跃旋转整合等,未能考虑所有可化简的情况,还未能化简为最少旋转步数公式。时间精⼒有限,待以后有新思路的时候再玩。
总结
很多指令都是现查现⽤的,编程模块化,过程分解,编程周期较长,编完以后,整体思路清晰,但单独模块缺少注释,不好看懂,特别是⼿动旋转对应编程部分,时间久了容易忘记。这是2019年1⽉编的代码(忘记了具体参考过哪些代码了),现在整理下思路,这⾥三阶魔⽅恢复算法是普通的按公式还原算法,主要难点在于判断魔⽅的状态,我编程的过程中是实际拿着个魔⽅⼀边转⼀边进⾏状态观察遍
历,⽅法⽐较笨,可以实现⾃动魔⽅还原,但是还原步骤较多,程序中通过增加⼀些函数进⾏了步骤的简化
function TurnManu=simplifyTurnManu(TurnManu)
但是简化结果并不彻底,需要更⾼级的简化函数,或⾼级的魔⽅恢复算法。
思考
如果能够⽤快速相机记录并识别魔⽅⾼⼿旋转魔⽅的⽅法,通过机器学习、聚类、迁移等思想,改善算法,数据即算法?如果没有如果,给定初始的算法,能不能让算法⾃⼰通过运⾏⾃学习,更新算法,或者产⽣模拟⾼级的数据⽤于机器学习?感觉这会不会是⼀个很好的案例?数据为王?算法为王?Alpha Zero从0开始?有⼈实现了吗?
参考链接
没作记录,忘了,对参考过代码的博主表⽰歉意,如有发现雷同的地⽅,欢迎提醒,以作补充。
源代码
%% 主调函数
% ---定义魔⽅的初始状态
face0=ones(3,3);
MFstate={face0;face0+1;face0+2;face0+3;face0+4;face0+5};
% % MFstate=faceTurn(MFstate,'r');
% % MFstate=sideTurn(MFstate,'r');
[MFstate,TurnManu]=disorganize(MFstate,10);
% DispTurnManu(TurnManu,1);
figure;pltMoFang(MFstate);
set(gcf,'color','k');axis square;axis off;view(160,30)
TurnManu=simplifyTurnManu(TurnManu,0);
TurnManu0=DispTurnManu(TurnManu);
disp({'魔⽅打乱操作:';TurnManu0.'})
% MFstate=disorganize(MFstate,TurnManu);
[MFstate1,TurnManu1]=InvRecover(MFstate,TurnManu);
TurnManu0=DispTurnManu(TurnManu1);
disp({'魔⽅逆序恢复操作:';TurnManu0.'})
figure;pltMoFang(MFstate1);
set(gcf,'color','k');axis square;axis off;view(160,30)
[MFstate,TurnManu2]=formulaRecover(MFstate);
TurnManu2=simplifyTurnManu(TurnManu2,0);
TurnManu0=DispTurnManu(TurnManu2);
disp({'魔⽅公式恢复操作:';TurnManu0.'})
figure;pltMoFang(MFstate);
set(gcf,'color','k');axis square;axis off;view(160,30)
-----------------------------------------------------------------------------------------------------------------------------------%% 动画显⽰
face0=ones(3,3);
MFstate={face0;face0+1;face0+2;face0+3;face0+4;face0+5};
limL=-4;limU=1;
close all;fig=figure; fig.Color=[1,1,1]; fig.Position=[400 200 550 600];
fig.ToolBar='none'; fig.MenuBar='none'; fig.NumberTitle='off'; fig.Name='魔⽅';
hds=pltMoFang(MFstate);
set(gcf,'color','k');axis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);
pause(4);
TurnManu_all=[TurnManu;TurnManu2];
for n=1:length(TurnManu_all)
pause(0.00001);
turnAroundP(hds,TurnManu_all(n),10,0.01,limL,limU);
MFstate=disorganize(MFstate,TurnManu_all(n));
hold off;hds=pltMoFang(MFstate);axis([limL,limU,limL,limU,limL,limU]);axis off;view(160,30);
end
%% 部分⼦函数编写
%% 公式恢复魔⽅
function [MFstate,TurnManu]=formulaRecover(MFstate)
TurnManu=[];
%---第⼀层恢复
%将顶层拼⼗字
num=zeros(1,4);
for n=1:4
[MFstate,TnMn,num]=recoverF10(MFstate,num);TurnManu=[TurnManu;TnMn]; if sum(num)==4;break;end
MFstate=faceTurn(MFstate,'r');num=circshift(num,-1);TurnManu=[TurnManu;'a']; end
TurnManu=[TurnManu;('- ').'];
%将顶层4个⾓恢复,完成第⼀层恢复
num=zeros(1,4);
for n=1:4
[MFstate,TnMn,num]=recoverF4(MFstate,num);TurnManu=[TurnManu;TnMn];
if sum(num)==4;break;end
MFstate=faceTurn(MFstate,'r');num=circshift(num,-1);TurnManu=[TurnManu;'a']; end
TurnManu=[TurnManu;('- ').'];
%第⼆层恢复 4个⾓恢复,完成第⼆层恢复
[MFstate,TnMn]=disorganize(MFstate,'CC');TurnManu=[TurnManu;TnMn];
num=zeros(1,4);
for n=1:4
[MFstate,TnMn,num]=recover2F4(MFstate,num);TurnManu=[TurnManu;TnMn]; if sum(num)==4;break;end
MFstate=faceTurn(MFstate,'l');num=circshift(num,-1);TurnManu=[TurnManu;'A']; end
TurnManu=[TurnManu;('- ').'];
%第三层公式恢复
%---步骤1:顶上拼⼗字
[MFstate,TnMn]=recover3F10(MFstate);TurnManu=[TurnManu;TnMn]; TurnManu=[TurnManu;('- ').'];
%---步骤2:四个⾓对应上
[MFstate,TnMn]=recover3F4(MFstate);TurnManu=[TurnManu;TnMn];
TurnManu=[TurnManu;('- ').'];
%---步骤3:顶⾯恢复
[MFstate,TnMn]=recover3Face(MFstate);TurnManu=[TurnManu;TnMn];
while isempty(TnMn)==0
[MFstate,TnMn]=recover3Face(MFstate);TurnManu=[TurnManu;TnMn];
end
TurnManu=[TurnManu;('- ').'];
%---步骤4:顶棱中恢复
[MFstate,TnMn]=recover3FArris(MFstate);TurnManu=[TurnManu;TnMn];
while isempty(TnMn)==0
[MFstate,TnMn]=recover3FArris(MFstate);TurnManu=[TurnManu;TnMn];
end
end
% ---定义魔⽅整体旋转⾏为---改变朝前⾯
% r,l,u,d 共4种⾏为
function MFstate=faceTurn(MFstate,manu)
if manu=='r'
MFstate={MFstate{5};rot90(MFstate{3},2);MFstate{1};fliplr(MFstate{4}.');rot90(MFstate{2},2);fliplr(MFstate{6}).'}; elseif manu=='l'
MFstate={MFstate{3};rot90(MFstate{5},2);rot90(MFstate{2},2);fliplr(MFstate{4}).';MFstate{1};fliplr(MFstate{6}.')}; elseif manu=='u'
MFstate={MFstate{4};MFstate{6};fliplr(MFstate{3}.');MFstate{2};fliplr(MFstate{5}).';MFstate{1}};
elseif manu=='d'
MFstate={MFstate{6};MFstate{4};fliplr(MFstate{3}).';MFstate{1};fliplr(MFstate{5}.');MFstate{2}};
else
return;
end
end
----------------------------------------------------------------------------------------------------------------------------------------------------------% ---定义⼀个旋转过程的函数
function turnAroundP(hds,TurnManu,stepNum,tSec,limL,limU)
if nargin==4
limL=-3;limU=0;
end
if TurnManu=='a'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论