經典的八數碼問題,這幾天嘗試了一些不同的做法,現在總結下。
1.廣搜+雜湊
這是最容易想到的一種做法,雜湊的方法是康托展開,組合數學上有介紹。
廣搜+雜湊
2.雙向廣搜+雜湊
雙向廣搜的複雜度大約是單向的一半,所以效率上會有不錯的提高。
雙向廣搜+雜湊
3.a*+雜湊+曼哈頓距離
用到廣搜,就可以想到能用經典的a*解決,用深度作為g(n),剩下的自然是啟發函式了。對於八數碼,啟發函式可以用兩種狀態不同數字的數目。接下來就是a*的套路,a*的具體思想不再贅述,因為人工智慧課本肯定比我講的清楚。但是必須得注意到,a*需要滿足兩個條件:
1.h(n)>h'(n),h'(n)為從當前節點到目標點的實際的最優代價值。
2.每次擴充套件的節點的f值大於等於父節點的f值小。
自然,我們得驗證下我們的啟發函式,h驗證比較簡單不用說,由於g是深度,每次都會較父節點增1。再看h,認識上, 我們只需要將h看成真正的「八數碼」,將空格看空。這裡,就會發現,每移動一次,最多使得乙個數字回歸,或者說不在位減乙個。 h最多減小1,而g認為是深度,每次會增加1。所以,f=g+h, 自然非遞減,這樣,滿足了a*的兩個條件,可以用a*了!
a*+雜湊+曼哈頓距離
4.ida*+曼哈頓距離
因為要用到ida*搜尋,所以我們搜尋之前先判斷一下是否有解。
判斷的方法是學習乙個大神的:
判斷八數碼問題是否有解
ida*比起bfs的好處是空間複雜度極低,同時因為有剪枝,比起bfs降低了盲目性;比起a*的好處是不用去維護乙個堆。
ida*+曼哈頓距離
八數碼問題的幾種解法
1.用雙向bfs解決八數碼問題 2.用迭代加深搜的a 演算法解決八數碼問題 注 本實驗我採用的都是從283104765到123804765的最短步數 首先,雙向bfs指的是從初始狀態和目標狀態同時開始搜尋,廣度優先搜尋是每次先搜尋周圍,然後再向外擴充套件,這裡我們把矩陣轉化為數字序列,更方便 我將用...
網頁中豎線的幾種做法
q 網頁中豎線的幾種做法 a 1 用水平線做 一般水平線的是寬長高短 做豎線我們可以反過來寬短高長,怎麼樣?豎線出來了吧?不過這個做法我發現好象有個bug,就是高只能顯示100px的,你設的再高也沒用!2 用 做 1 如下 width 1 border 1 bordercolor 000000 he...
svn強制解鎖的幾種做法
某個開發人員對乙個檔案使用 svn工具進行 get lock 操作後,其它人只有等這個人 release lock 之後才能進行編輯提交。但在某些特殊情況下,假使這位開發人員不在,就需要對已經鎖定的檔案進行強制解鎖了。使用 svnadmin lslocks 命令可以列出當前被鎖定的檔案,語法為 sv...