爬山法实现 八皇后问题 (Python 实现)
本文主要簡單闡述爬山法的基本算法思想,并給出用此算法實現八皇后問題詳細過程
最基本的爬上搜索算法表示:(節選自《人工智能》第二版):
function?HILL-CLIMBING(problem)?return?a state thate is a locak maximum
????inputs:?problem
????local variables:?current, a node?
?????????????????????????neighbor,a node
????current?= MakeNode(INITAL-STATE(problem));
????loop do
????????neighbor?= a highest-valued successor of?current?;
????????if?VALUE[neighbor] <= VALUE[current]?then return?STATE[current];
????????current?=?neighbor?;
算法特點:
??????? 爬山法是一個向值增加的方向持續移動的簡單循環過程--類似于登高,它將會在到達一個“峰頂”時終止,此時相鄰狀態中沒有比它更高的值。這個算法不會維護搜索樹,因此當前節點的數據結構只需要記錄當前狀態和它的目標函數值,它不會前瞻與當前狀態不直接相鄰的那些狀態的值。這里更高的值是根據具體的應用場景來定的,準確的說是更接近目標狀態的值,由我們設置的啟發式函數來決定哪個值更好,比如我們求解八皇后問題更高的值就是當前格局中皇后沖突對數最少的情況
算法局限性:
????? 爬山法屬于一種局部的貪婪搜索方法,當它在搜索過程中遇到了局部最大值就很難繼續向下搜索了,局部極大值是一個比它的每個鄰居狀態都高得到峰頂,但是比全局最大值(我們要到達的最終狀態)要低,爬山法算法到達局部極大值附近就會被拉向峰頂,然后卡在局部極大值處無處可走。因此產生了爬山法的變種如隨機爬山法及其變種如隨機爬山法,隨機重新開始的爬山法,模擬退火搜索能夠非常有效的解決N皇后問題。
求解八皇后問題:
(1)啟發式耗散函數?get_numof_conflict求出可以彼此攻擊2的皇后對的數 ?hill_climbing是算法中爬山過程的實現,convert字典中存儲的鍵是所有可能后繼狀態,值是此狀態對應的皇后沖突對數,后面通過遍歷來找到最佳后繼。爬山法算法通常在最佳后繼集合中隨機選擇一個進行擴展,如果這樣的后繼多于一個的話
(2)? 棋盤的排列用列表 status 表示, 依次表示第一列第二列到第n列的擺放位置。 如列表[0,2,1] 表示3*3矩陣第一列皇后放在最下面一格,第二列放在最上面一格,第三列放在中間一格
(3) 運行結果說明:初始狀態每個皇后都在次對角線上 每次運行程序將輸出求解一個八皇后正確解的爬山法實現過程 ,依次輸出求解過程每一個最佳選擇的鄰居狀態和其存在的皇后沖突對數,可以看出在求解過程中 不斷爬山的過程--每進行一步都達到一個更好的格局,沖突次數更少,最后一行顯示的是八皇后的一個正確解 沖突數為 0
運行截圖
本文主要簡單闡述爬山法的基本算法思想,并給出用此算法實現八皇后問題詳細過程
最基本的爬上搜索算法表示:(節選自《人工智能》第二版):
function?HILL-CLIMBING(problem)?return?a state thate is a locak maximum
????inputs:?problem
????local variables:?current, a node?
?????????????????????????neighbor,a node
????current?= MakeNode(INITAL-STATE(problem));
????loop do
????????neighbor?= a highest-valued successor of?current?;
????????if?VALUE[neighbor] <= VALUE[current]?then return?STATE[current];
????????current?=?neighbor?;
算法特點:
??????? 爬山法是一個向值增加的方向持續移動的簡單循環過程--類似于登高,它將會在到達一個“峰頂”時終止,此時相鄰狀態中沒有比它更高的值。這個算法不會維護搜索樹,因此當前節點的數據結構只需要記錄當前狀態和它的目標函數值,它不會前瞻與當前狀態不直接相鄰的那些狀態的值。這里更高的值是根據具體的應用場景來定的,準確的說是更接近目標狀態的值,由我們設置的啟發式函數來決定哪個值更好,比如我們求解八皇后問題更高的值就是當前格局中皇后沖突對數最少的情況
算法局限性:
????? 爬山法屬于一種局部的貪婪搜索方法,當它在搜索過程中遇到了局部最大值就很難繼續向下搜索了,局部極大值是一個比它的每個鄰居狀態都高得到峰頂,但是比全局最大值(我們要到達的最終狀態)要低,爬山法算法到達局部極大值附近就會被拉向峰頂,然后卡在局部極大值處無處可走。因此產生了爬山法的變種如隨機爬山法及其變種如隨機爬山法,隨機重新開始的爬山法,模擬退火搜索能夠非常有效的解決N皇后問題。
求解八皇后問題:
(1)啟發式耗散函數?get_numof_conflict求出可以彼此攻擊2的皇后對的數 ?hill_climbing是算法中爬山過程的實現,convert字典中存儲的鍵是所有可能后繼狀態,值是此狀態對應的皇后沖突對數,后面通過遍歷來找到最佳后繼。爬山法算法通常在最佳后繼集合中隨機選擇一個進行擴展,如果這樣的后繼多于一個的話
(2)? 棋盤的排列用列表 status 表示, 依次表示第一列第二列到第n列的擺放位置。 如列表[0,2,1] 表示3*3矩陣第一列皇后放在最下面一格,第二列放在最上面一格,第三列放在中間一格
(3) 運行結果說明:初始狀態每個皇后都在次對角線上 每次運行程序將輸出求解一個八皇后正確解的爬山法實現過程 ,依次輸出求解過程每一個最佳選擇的鄰居狀態和其存在的皇后沖突對數,可以看出在求解過程中 不斷爬山的過程--每進行一步都達到一個更好的格局,沖突次數更少,最后一行顯示的是八皇后的一個正確解 沖突數為 0
運行截圖
總結
以上是生活随笔為你收集整理的爬山法实现 八皇后问题 (Python 实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux中点号,星号,加号,问号实战
- 下一篇: cmd窗口使用python提示“Pyth