使用 Python 和 2 面广度优先搜索来求解 2x2 魔方。
受到 MIT 6.006 项目的启发。从头开始独特地创建。
https://youtu.be/ZHxLO6fubaU
从头开始创建立方体 API、算法和 GUI。 6 条边各有 4 个不同的方格,总共 24 个方格。此外,立方体共有 8 个角块,每个角块都有 3 个方向,因此与 24 个正方形相匹配。
我将每条边的 24 个小部分定义为一个字符串,格式为“xyz”,其中 x 是直接面向的颜色,y 和 z 围绕该角的立方体按顺时针顺序排列。
我绕着立方体走一圈,为每一面分配一个代表已解决状态的固定数字。例如,0、1、2、3 是正面白色面的 4 个部分,其中 0 为左上角,其他部分按顺时针顺序排列。
可以在立方体上执行 12 种移动。右、左、上、下、前、后。其中每一个都有逆时针运动,因此 6x2 = 12 次移动。这 12 个人中的每一个都操纵着立方体的一半,即 12 个正方形。为了进行这些移动,我为子方块从原始位置旋转到以下位置的 6 个顺时针方向中的每一个创建了字典。为了做素数,我只是交换了键和值。
由于立方体有大量可能的排列,解决这个问题尤其棘手。有 24 个子方格,结果为 24P24 = 24!。其大小为 10^23。由于某些情况,数量少于这个数量,但数量仍然很大。
要创建树,我必须运行每个动作,并运行变得非常大的动作中的所有动作。 12^树的高度。我能够通过创建访问过的位置的字典来限制这个大小,这样它就不会重做之前访问过的排列的操作。
我开始创建一个单边 BFS,但这会达到递归限制,因为分支树会变得太大。为了解决这个问题,我使用了2 边 BFS,通过交替从开始和结束解决方案创建分支。它将创建树木并检查对方是否已经找到了该点。如果是,它将返回连接点。
在所有这些过程中,每个节点都会保存其父节点(对于前分支)或子节点(对于后分支)。为了找到它所走的路线,我递归地找到了连接节点的父节点,然后找到了该点的所有子节点。这导致了从打乱到解决的一系列位置。
这个项目应用了我对图论和广度优先搜索的使用。我提高了Python和递归的能力。我还通过实验发现解决 2x2 立方体的最大移动次数为11 步,因为我永远找不到需要更长时间的解决方案
学习了如何使用 tkinter 库为项目制作 GUI