使用 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