日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

爬山法实现 八皇后问题 (Python 实现)

發布時間:2025/3/11 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬山法实现 八皇后问题 (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皇后問題。

求解八皇后問題:

  • #-*- coding: utf-8 -*-
  • import random
  • #函數一:參數為當前棋盤布局狀態,根據布局判斷當前八皇后布局存在沖突的皇后對數
  • def get_numof_conflict(status):
  • num = 0
  • for i in range(len(status)):
  • for j in range(i + 1,len(status)):
  • if status[i] == status[j]:
  • num += 1
  • offset = j - i
  • if abs(status[i]-status[j]) == offset:
  • num += 1
  • return num
  • #函數二:參數為當前棋盤布局狀態,利用爬山法思想選擇鄰居狀態最好的布局并返回
  • def hill_climbing(status):
  • convert = {}
  • length = len(status)
  • for col in range(length):
  • best_move = status[col]
  • for row in range(length):
  • if status[col] == row:
  • continue
  • status_copy = list(status)
  • status_copy[col] = row
  • convert[(col,row)] = get_numof_conflict(status_copy)
  • answers = [] #最佳后繼集合
  • conflict_now = get_numof_conflict(status) #當前皇后沖突對數
  • #遍歷存儲所有可能后繼的字典,找出最佳后繼
  • for key,value in convert.iteritems():
  • if value < conflict_now:
  • conflict_now = value
  • for key,value in convert.iteritems():
  • if value == conflict_now:
  • answers.append(key)
  • #如果最佳后繼集合元素大于一個 隨機選擇一個
  • if len(answers) > 0:
  • x = random.randint(0,len(answers)-1)
  • col = answers[x][0]
  • row = answers[x][1]
  • status[col] = row
  • return status
  • #函數三:求得八皇后滿足沖突數為0的一個解,循環輸出每一步的后繼集合 直到不存在沖>突為止
  • def Queens():
  • status = [0,1,2,3,4,5,6,7] #初始狀態所有皇后都在對角線
  • #當存在沖突的個數大于0時 循環求解最佳后繼 直到找到八皇后解
  • while get_numof_conflict(status) > 0:
  • status = hill_climbing(status)
  • print status
  • print get_numof_conflict(status)
  • print "the answer is"
  • print
  • print status
  • if __name__ == '__main__':
  • Queens()
  • 代碼說明 :

    (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皇后問題。

    求解八皇后問題:

  • #-*- coding: utf-8 -*-
  • import random
  • #函數一:參數為當前棋盤布局狀態,根據布局判斷當前八皇后布局存在沖突的皇后對數
  • def get_numof_conflict(status):
  • num = 0
  • for i in range(len(status)):
  • for j in range(i + 1,len(status)):
  • if status[i] == status[j]:
  • num += 1
  • offset = j - i
  • if abs(status[i]-status[j]) == offset:
  • num += 1
  • return num
  • #函數二:參數為當前棋盤布局狀態,利用爬山法思想選擇鄰居狀態最好的布局并返回
  • def hill_climbing(status):
  • convert = {}
  • length = len(status)
  • for col in range(length):
  • best_move = status[col]
  • for row in range(length):
  • if status[col] == row:
  • continue
  • status_copy = list(status)
  • status_copy[col] = row
  • convert[(col,row)] = get_numof_conflict(status_copy)
  • answers = [] #最佳后繼集合
  • conflict_now = get_numof_conflict(status) #當前皇后沖突對數
  • #遍歷存儲所有可能后繼的字典,找出最佳后繼
  • for key,value in convert.iteritems():
  • if value < conflict_now:
  • conflict_now = value
  • for key,value in convert.iteritems():
  • if value == conflict_now:
  • answers.append(key)
  • #如果最佳后繼集合元素大于一個 隨機選擇一個
  • if len(answers) > 0:
  • x = random.randint(0,len(answers)-1)
  • col = answers[x][0]
  • row = answers[x][1]
  • status[col] = row
  • return status
  • #函數三:求得八皇后滿足沖突數為0的一個解,循環輸出每一步的后繼集合 直到不存在沖>突為止
  • def Queens():
  • status = [0,1,2,3,4,5,6,7] #初始狀態所有皇后都在對角線
  • #當存在沖突的個數大于0時 循環求解最佳后繼 直到找到八皇后解
  • while get_numof_conflict(status) > 0:
  • status = hill_climbing(status)
  • print status
  • print get_numof_conflict(status)
  • print "the answer is"
  • print
  • print status
  • if __name__ == '__main__':
  • Queens()
  • 代碼說明 :

    (1)啟發式耗散函數?get_numof_conflict求出可以彼此攻擊2的皇后對的數 ?hill_climbing是算法中爬山過程的實現,convert字典中存儲的鍵是所有可能后繼狀態,值是此狀態對應的皇后沖突對數,后面通過遍歷來找到最佳后繼。爬山法算法通常在最佳后繼集合中隨機選擇一個進行擴展,如果這樣的后繼多于一個的話

    (2)? 棋盤的排列用列表 status 表示, 依次表示第一列第二列到第n列的擺放位置。 如列表[0,2,1] 表示3*3矩陣第一列皇后放在最下面一格,第二列放在最上面一格,第三列放在中間一格

    (3) 運行結果說明:初始狀態每個皇后都在次對角線上 每次運行程序將輸出求解一個八皇后正確解的爬山法實現過程 ,依次輸出求解過程每一個最佳選擇的鄰居狀態和其存在的皇后沖突對數,可以看出在求解過程中 不斷爬山的過程--每進行一步都達到一個更好的格局,沖突次數更少,最后一行顯示的是八皇后的一個正確解 沖突數為 0

    運行截圖



    總結

    以上是生活随笔為你收集整理的爬山法实现 八皇后问题 (Python 实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。