每週一道資料結構(四)A 演算法 博弈樹 剪枝

2021-09-22 07:42:05 字數 2364 閱讀 9733

前陣子考試學了a*演算法、博弈樹和回溯,自己真是愚蠢至極,根本沒就搞明白這些,所以對於這些演算法問道的話就不能說清楚,也記不住,所以才有了這篇筆記。在這裡感謝面試我的那位工程師~~

啟發式資訊:用於幫助減少搜尋量的與問題有關的資訊或知識。

啟發式搜尋:使用啟發資訊指導的搜尋過程叫做啟發式搜尋。

估價函式:定義在狀態空間上的實值函式。

open表:未擴充套件的節點

close表:已擴充套件或正在擴充套件的節點

用f(n)表示節點n的估價函式:

1. f(n)表示從起點到目標,經由節點n最小費用路徑上費用的估計。(最短路徑 = 目前最短 + 剩下的估計最短路徑)

(在搜尋圖中,接近解路徑的節點有較低的函式值)

2. 以估價函式f的遞增次序排列open表中的節點:

估價函式低的排在前;具有相等函式值的節點以任意次序排序。

a演算法: 使用估價函式f(n)=g(n)+h(n) 排列open表中節點順序的

graphsearch演算法。

g(n):對g*(n)的乙個估計,是當前的搜尋圖g中s到n的最優路徑費用 

g(n)≥g*(n)

h(n):對h*(n)的估計,是從n到目標節點的估計代價,稱為啟發函式。

例如:當h(n) = 0, g(n) = d, 則f(n) = g(n)就變為了寬度優先搜尋,也就是如果不需要啟發,那就是寬度優先搜尋的演算法了。

a*演算法:一種靜態路網中求解最短路最有效方法。與a演算法不同,對

任何節點n都有h(n)≤h*(n)的a演算法。

八數碼問題:利用估價函式f(n)=d(n)+w(n)正向搜尋八數碼難題,其中d(n)為深度,w(n)為目標的偏差數。

a*演算法與以往的圖的搜尋演算法不同,是一種啟發式的演算法,通過設計一種恰當的估計函式,越是接近真實值,就越會掉地搜尋的成本,降低演算法的開銷。這樣的話,估計的函式的設計就尤為重要了。

博弈樹是指由於動態博弈參與者的行動有先後次序,因此可以依次將參與者的行動展開成乙個樹狀圖形。

對於任何一種博弈競賽,我們可以構成乙個博弈樹。它類似於狀態圖和問題求解搜尋中使用的搜尋樹。博弈樹的結點對應於某乙個棋局,其分支表示走一步棋;根部對應於開始位置,其葉表示對弈到此結束。在葉節點對應的棋局中,競賽的結果可以是贏、輸或者和局。 

在二人博弈問題中,為了從眾多可供選擇的行動方案中選出乙個對自己最為有利的行動方案,就需要對當前的情況以及將要發生的情況進行分析,通過某搜尋演算法從中選出最優的走步。

基本思想或演算法是:

(1) 設博弈的雙方中一方為max,另一方為min。然後為其中的一方尋找乙個最優行動方案。

(2) 為了找到當前的最優行動方案,需要對各個可能的方案所產生的後果進行比較,具體地說,就是要考慮每一方案實施後對方可能採取的所有行動,並計算可能的得分。

(3) 為計算得分,需要根據問題的特性資訊定義乙個估價函式,用來估算當前博弈樹端節點的得分。此時估算出來的得分稱為靜態估值。

(4) 當端節點的估值計算出來後,再推算出父節點的得分,推算的方法是:對「或」節點,選其子節點中乙個最大的得分作為父節點的得分,這是為了使自己在可供選擇的方案中選乙個對自己最有利的方案;對「與」節點,選其子節點中乙個最小的得分作為父節點的得分,這是為了立足於最壞的情況。這樣計算出的父節點的得分稱為倒推值。

(5) 如果乙個行動方案能獲得較大的倒推值,則它就是當前最好的行動方案。

在博弈問題中,每乙個格局可供選擇的行動方案都有很多,因此會生成十分龐大的博弈樹。試圖利用完整的博弈樹來進行極小極大分析是困難的。所以才有了α-β剪枝。

為了提高搜尋的效率,引入了通過對評估值的上下限進行估計,從而減少需進行評估節點的範圍。

主要概念:

max節點的評估下限值α:

作為max節點,假定它的min節點有n個,那麼當它的第乙個min節點的評估值為α時,則對於其它節點,如果有高於α的節點,就取那最高的節點值作為max節點的值;否則,該點的評估值為α。

min節點的評估上限值β:

作為min節點,同樣假定它的max節點有n個,那麼當它的第乙個max節點的評估值為β時,則對於其他節點,如果有低於β的節點,就取最低的節點值作為min節點的值;否則,該店的評估值為β。

主要思想:

可以分為兩個步驟,分別為α剪枝和β剪枝。

如圖:

每週一道演算法題005 切木棒

假設要把長度為n厘公尺的木棒切分為1厘公尺長的小段,但是1根木棒只能由1人切分,當木棒被切分為3段後,可以同時由3個人分別切分木棒。求最多有m個人時,最少要切分幾次。譬如n 8,m 3時如下圖所示,切分4次就可以了。求當n 20,m 3時的最少切分次數。求當n 100,m 5時的最少切分次數。這道題...

每週一道LeetCode演算法題 兩數之和

class solution return result 分析class solution for int i 0 i nums.length i throw newillegalargumentexception no two sum solution class solution map.put...

每週一道演算法題008 考拉茲猜想

考拉茲猜想 對自然數n迴圈執行如下操作。n是偶數時,用n除以2 n是奇數時,用n乘以3後加1 如此迴圈操作的話,無論初始值是什麼數字,最終都會得到1 會進入1 4 2 1這個迴圈 現在設定初始值為偶數時,對其進行乘以3後加1,後續操作不變。如 4 13 40 20 10 5 16 8 4 10000...