×

基于软件的魔方解算器

消耗积分:0 | 格式:zip | 大小:0.17 MB | 2023-07-06

李慎梓

分享资料个

第一步很简单,我们给魔方的一面拍照

poYBAGOhXdWAdmadAAJq01t6wN4957.png
第 1 步 - 初始照片
 

 

第二步是创建图像的灰度副本并应用抗噪滤镜

pYYBAGOhXd2AebjpAAHeiOYTu6Q253.png
第 2 步 - 带抗噪滤波器的灰度
 

 

第三步是使用 Canny Edge Detection 找到图像中的所有边缘

pYYBAGOhXeGABJXHAABQJHUIlQc406.png
第 3 步 - Canny 边缘检测
 

 

第四步是扩大边缘。我们想让它们更厚,因为这样更容易找到立方体的正方形。

poYBAGOhXeOAIsFXAAAc4mOGZp8077.png
第 4 步 - 扩大边缘
 

 

第五步是找到膨胀图像中所有形状的轮廓。在下图中,蓝线是图像中的各种轮廓。红线是每个轮廓的近似形状。我们检查红线的所有形状以找到看起来像正方形的那些(有四个角,每个角大约为 90 度,等等)。如果我们认为轮廓是正方形,我们会将该轮廓显示为绿色。

pYYBAGOhXeqATFTDAAJQqxMmGQE958.png
第 5 步 - 寻找轮廓
 

 

第六步去除非方形轮廓

poYBAGOhXfaASD4xAAJad-TAg44212.png
第 6 步 - 删除非正方形
 

 

第七步是去除巨大的轮廓。上图中只有一个巨大的轮廓,它是围绕着外边缘的一个轮廓,几乎囊括了整个图像。

pYYBAGOhYnKABClBAAJclFNVC1Q990.png
第 7 步 - 去除巨大的轮廓
 

 

第八步是去除矮轮廓,这些轮廓太小而不能成为魔方。

poYBAGOhYnaAft3OAAJii2rPvEE340.png
第 8 步 - 去除矮化轮廓
 

 

第九步也是最后一步是确定立方体的大小、立方体的边界并移除立方体边界外的任何轮廓

poYBAGOhYnuARU-CAAJqX9wgAVc305.png
第 9 步 - 确定立方体大小和边界
 

我们对所有六个面执行上述步骤,并提取 5x5x5 魔方的所有 150 个正方形的 RGB 值。

 

 

软件 - 立方体状态的 RGB 值

我们现在需要获取所有 150 个方块的 RGB 值,并将每个方块减少为六种颜色(白色、黄色、红色、橙色、绿色和蓝色)中的一种。这将为我们提供计算立方体的解所需的立方体状态。

此图像显示从上一步图像中提取的每个方块的颜色。请注意,颜色有一些变化,并非所有白色方块都是完全相同的白色,橙色和红色有时看起来非常相似,等等。

pYYBAGOhYn6ALNWkAADYex-yz9o594.png
原始 RGB 值
 

为了将每个 RGB 值减少到六种颜色(白色、黄色等)中的一种,我们将对颜色进行排序。一旦对它们进行排序,我们就可以轻松地将它们分成六组,大小相等,并为每组分配一个颜色名称。

对人类来说,颜色分类很容易,但事实证明,对计算机来说,这是相当具有挑战性的。如果我们采用上面的颜色并简单地按照它们的 RGB 值对它们进行排序,我们将得到以下结果,您可以看到它根本不是按照您或我对这些颜色进行排序的顺序。

pYYBAGOhYoKAILB6AAAhyoxACXE880.png
RGB排序
 

如果我们改为按 HSV(色调、饱和度、值)对它们进行排序,排序会更好但仍然不正确:

poYBAGOhYoSAQjzhAAAlO3GH3PM851.png
HSV排序
 

经过多次试验和错误后,我发现最好的方法是使用旅行推销员算法对颜色进行排序。你可以在这里看到我们可以将颜色分成六个干净的组。

pYYBAGOhYoeAITAiAAAaUZDmsYs915.png
旅行推销员
 

旅行商问题是一个著名的计算机科学问题。它要解决的问题是销售员必须以最有效的顺序访问多个城市(根据总行进距离)。

pYYBAGOhYoqALrbWAAFVaO16aPw704.png
 

 

有很多库和算法可以解决旅行商问题,我使用了tsp_solver python 库。我们在 3D 中绘制 150 个 RGB 值,并使用旅行推销员算法找到理想的访问顺序。旅行推销员找到的顺序提供了对颜色进行排序的顺序。在视觉上它看起来像这样:在这里,您可以看到按旅行推销员排序的所有边缘部分(5x5x5 有两组/边缘轨道)。我们可以很容易地将它们分成六组,并为每组分配一个颜色名称。

pYYBAGOhYpCAc_NBAACGDHMsFaA713.png
 

我们还通过 Traveling Salesman 对中心块和角块进行排序,并为每个方块分配六种颜色中的一种。您会注意到下图中颜色不再变化,所有白色方块完全相同,所有蓝色方块完全相同,等等。

poYBAGOhYpOAPa9KAADd6ZOzIYo956.png
 

到达这里需要做很多工作,但此时 CraneCuber 知道立方体的确切状态。这使我们能够计算出如何解决立方体的解决方案。

该软件是开源的,可在 github 上获取,网址为https://github.com/dwalton76/rubiks-color-resolver

软件 - 计算解决方案

基于软件的魔方解算器是一个很大的话题,学生们已经完成了算法的博士学位,可以单独解决 3x3x3。我将描述我最终是如何编写我的求解器的,以及它是如何在较高层次上工作的,但要深入细节将超出本文档的范围(并且本文档已经很长了)。

为什么?

当我开始使用 CraneCuber 时,我并没有打算编写自己的魔方求解器。有许多用于 2x2x2 和 3x3x3 立方体的开源解算器,但没有那么多的人为 4x4x4 和更大的立方体编写解算器。我能够找到一个 4x4x4 的开源求解器,但那是井枯竭的地方。没有任何用于 5x5x5、6x6x6 等的开源求解器 :( 我决定编写自己的求解器,并牢记几个目标:

  • 它将是开源的
  • 它将是一个 NxNxN 求解器,这意味着它可以求解任何大小的立方体
  • 它将能够在最小的硬件上运行,例如 Raspberry Pi

它花了大约 5 个月的时间来解决 4x4x4 和 5x5x5 问题,又花了 5 个月的时间来实现 NxNxN!在过去的一年里,我继续致力于解决方案,我已经能够减少计算解决方案所需的时间以及它找到的解决方案的长度。

我有信心说它是世界上唯一的开源 NxNxN 求解器,我为此感到非常自豪 :) 该求解器可在 github 上找到,网址为https://github.com/dwalton76/rubiks-cube-NxNxN-solver

如何?

基于软件的魔方求解器的核心是一种称为迭代深化 A*的算法您经常会看到它缩写为 IDA*(发音为 IDA-star)。

魔方解算器必须解决的问题是找到将魔方从打乱状态带到​​已解决状态的一系列移动。我们可以编写一个求解器,通过越来越长的移动序列进行蛮力广度优先搜索,直到找到解决方案,但我们会在它完成之前很久就老死了。我们需要一种更智能、更快速的方法来找到解决方案!

IDA* 是一种算法,允许求解器在搜索解决方案时消除大量移动序列。它不能很好地求解 5x5x5 立方体,但它确实可以很好地求解立方体的某些子集,例如求解中心。一旦解决了中心问题,我们就可以再次使用 IDA* 来解决边缘问题。这些被称为“阶段”。我们可以将求解立方体的问题分解为多个阶段,然后使用 IDA* 求解每个阶段。立方体越大,求解立方体所需的阶段就越多。大多数 3x3x3 求解器使用两个阶段,而我的求解器使用七个阶段来求解 5x5x5。

这是对基于软件的魔方解算器如何工作的非常简短的介绍。我写了一篇关于这个主题的冗长博客文章,如果您对立方体求解器的工作原理感兴趣,可以访问http://programmablebrick.blogspot.com/2017/07/rubiks-cube-solver.html 。

结论

我希望你喜欢我的项目。我真的很喜欢它的工作 :) 对于这么长的关于它如何工作的文章,我深表歉意。项目的软件方面涉及太多,我觉得我应该给出一个深入的解释。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !