獲取主要變例

2021-07-13 09:07:27 字數 1806 閱讀 6769

要點

經常有人問,如何在搜尋完成後提取主要變例。主要變例是程式認為的對雙方來說都是最好的著法線路。它不會由未修改的「alpha-beta函式」來獲得,所有的alpha-beta都只返回數值。

我們需要做的是對普通的alpha-beta搜尋作修改,使得它能獲取主要變例。修改的部分用醒目的顏色標出:

typedef

struct tagline line;

int alphabeta(int depth, int alpha, int beta, line *pline)

generatelegalmoves();

while (movesleft())

if (val > alpha)

} return alpha;

}

這個函式或許效率很低,因為它用到很多的堆疊空間,但是**工作起來並不慢。有了這些改動後,如果函式返回alpha和beta之間的值,那麼它不僅僅返回乙個值,還包括能產生這個值的路線(一系列**的著法)。這對於搜尋樹的任何結點都是有效的,包括根結點(它是最值得這麼做的)。你可以這麼來呼叫alpha-beta:

val = alphabeta(depth, -infinity, infinity, &line);

你得到的是局面的值,以及在「line」這個儲存區里儲存的**路線。「line」的資料結構是乙個著法陣列,以構成乙個路線,另有乙個整數來告訴你路線中有多少著法。

如果你用深度等於零去呼叫alpha-beta,那麼這個函式只呼叫「evaluate()」並返回它的值。乙個著法也沒搜尋,因此乙個著法也沒選擇,從而和分值一起返回的路線其長度為零。

如果你用某個深度呼叫這個搜尋函式,那麼你可以找到乙個著法其值在alpha和beta之間,而你得到的不僅僅是分值,而且包括能產生這個值的一系列著法。為了在alpha-beta過程中建立路線,你拿出這個搜尋到的著法,把它存入傳遞的路線儲存區中【譯註:即函式中的「*pline」】,並把區域性的路線儲存區【即函式中的「line」】也加到傳遞的儲存區中。

你可能會問:「既然有傳過來的路線儲存區,為什麼又要在每次遞迴的堆疊中新分配乙個?」因為你在搜尋樹中找到乙個區域性的線路,那麼原來的線路被推翻了,但你不能毀壞已經建立好的線路。如果你找到某個返回值在alpha和beta之間的結點,你就認為這個結點在搜尋樹的根結點的路線上,這是不對的。有很多零碎的主要變例是被丟棄的。

讓你們感到驚訝的是,我在迴圈內用了「memcpy」這個函式【事實上這也是個迴圈,因此可能會認為它的效率很低】,它幾乎不花時間,因為它很少被執行。

另乙個思想

另乙個一目了然的方法,就是在搜尋值返回後,從主置換表中提取主要變例。置換表項中有乙個區域存放這局面的最佳著法。由於每個pv結點都有乙個值在alpha和beta之間,雜湊項中必定儲存著「最佳著法」。

從置換表中提取主要變例,可以沿著雜湊項組成的鏈來提取,這就像吃餡餅一樣簡單。

我知道很多程式(包括一些專業程式)是這樣做的,但是我沒有試過。

【情況可能會比想象中的複雜,因為置換表中的資料會被覆蓋,這樣做就必須選擇合適的覆蓋策略。顯然根結點是不會被覆蓋的(它總是最後乙個寫入置換表),因此至少能提取出乙個著法(即程式要走的那步棋),但是後續著法就很難保證了。深度優先的覆蓋策略會比較有利,除此之外,也可以考慮pv結點優先的策略,因為pv結點的數量比alpha結點和beta結點少得多,所以這個覆蓋策略對置換表不會產生很大的影響。

另外,直接從alpha-beta函式提取的主要變例,會因為置換表的運用而中斷,除非置換表裡有一項用來儲存主要變例(這不是不可能的,因為pv結點的數量非常少)。如果要得到完整的主要變例,可以考慮不在置換表中寫入pv結點(某些程式甚至只在置換表中寫入beta結點)。】

主要變例搜尋

主要變例搜尋 對alpha beta的改進 主要變例搜尋 pvs,principal variation search 是提高 alpha beta 演算法效率的一種方法。在alpha beta搜尋中,任何結點都屬於以下三種型別 1.alpha結點。每個搜尋都會得到乙個小於或等於alpha的值,這就...

單例模式的主要實現

package single.doublecheck create by author luozhiyuan on 2019 08 22.time 14 26 final不允許被繼承 public final class singleton public static singleton getin...

獲取位元幣的主要方法

前面我說了種種事情,很多人對於位元幣非常的嚮往,畢竟這都是錢啊。也是誰會和錢過不去那,我同事的朋友在接觸這個圈子之前可是一兩萬都需要貸款的,現在搞的瑪莎拉蒂都有了。有很多人看了關於位元幣的種種事情問我,那可是內心特別激動,想的下乙個富起來的就是我。現如今能夠獲取位元幣的方法主要有兩種 一種買位元幣,...