1. 程式人生 > >對極大極小搜尋和阿爾法貝塔剪枝搜尋演算法的簡單描述與理解--萌新向通俗易懂

對極大極小搜尋和阿爾法貝塔剪枝搜尋演算法的簡單描述與理解--萌新向通俗易懂

這是本人第一次正經寫部落格,排版技術不行,看起來可能有點難受,但我相信如果大家認真按順序讀下去一定能理解這個演算法,如果還有不是很清楚或者覺得我哪裡有講錯的地方歡迎評論留言!這段時間都在!會看和回覆的!

阿爾法貝塔剪枝是基於極大極小值搜尋的一種演算法。

舉個比較簡單的例子。這裡有兩個包,在你知道兩個包裡有什麼的情況下,你需要選一個包然後讓你的競爭對手小明從這個包裡的兩張錢中選一張給你,但是你想讓自己的錢越多越好而小明不想讓你錢多,所以他會選一張相對最小的錢給你。也即對你而言,你需要從中獲得最大利益,而小明只是想承受最小的對手變強程度。在這種情況下你應該選擇包2,小明會給你2元。如果你選擇了包1 ,你只能得到0.5元。

這其實就是極大極小搜尋,抽象到樹的形式來看,這次我們來選數字,注意一點的是這個樹的搜尋順序用人腦其實是反過來的,這個具體我會在後面的程式碼實現裡講,為了方便我們理解就暫時先從下往上看把。就比如是上一題的包裡拿錢問題,0.5,100是第一個包內的錢,2,10是第二個包裡的,當我們拿了一個包就往上推讓B選其中一張較小錢,即0.5或2,最後我們從這兩張錢裡選一張拿到我們手上,因為這是我們自己在推演這個過程,所以要考慮完備也即所有可能的情況,也就是為什麼這裡B可以選兩張錢(這個說出來了就很好理解甚至有點蠢,但是我剛學的時候思路卡了很久所以提一下),這樣在實際情況中其實我們只能選一個包讓b選一張錢給我們,所以一個完備的推演過程可以保證我們獲得的利益也就是最上面的節點的數字最大。其實分析以下我們可以推廣到n層,無非是分成了兩個層:一個是MAX層,這一層由我們來選擇從下一層拿上來的數字,為了自己的利益最大化,我們會從下一層的子節點選擇極大的一個來存在這個節點,故稱為MAX;一個是MIN層,由對手選,同理,他會想方設法降低我們獲得的利益,所以他會從下一層選極小的節點來存,這樣我們的MAX層在選的時候就只能拿到相對較小的極大。

以上就是極大極小值搜尋的內容了,但是單純用極大極小搜尋的意義不是很大,因為在博弈中,一步棋可能會有成千上萬種招法,如果全部進行搜尋時間耗費太長,效率不高,在規定時間內下棋肯定是行不通的。這個時候就需要進行一些優化,也就是阿爾法貝塔剪枝了。

小插曲:感興趣的朋友還可以看看負極大值搜尋這個演算法,跟極大極小內涵一樣,只是人們嫌轉換極大極小不方便,乾脆把極小層加個負號,這樣可以全搜極大,因為極大的負就是這層的最小!這裡不多說了。

剪枝,顧名思義就是剪去枝節,也就是我們的樹的節點鏈。【請務必先理解透徹極大極小的搜尋邏輯和順序!】下圖引用自英文的阿爾法貝塔剪枝維基百科https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning

它和我們上面的選錢遊戲的搜尋樹長得很像,因為這個演算法就是基於極大極小值搜尋的,為什麼叫阿爾法貝塔,因為有alpha,beta兩個值。alpha表示我們需要的最好結果,beta表示對手能承受的最壞結果。基於最壞的打算的思想,把alpha初值設為負無窮即-INF,beta為正無窮INF。上圖是已經搜尋完畢並且剪枝節了的,所以我們從下往上從左往右分析一下,為什麼這樣選,為什麼這樣剪枝。【其實最下面的MAX層我感覺沒必要標出來,它們是已經先存在待選的】在最左邊,選第一個MIN層即B選,對B而言研究beta,即B能承受的最小,拿下面兩個子節點和beta比較,此時beta初值為-INF,一定小於子節點的數,選出了5是較小的,往上走發現第三層【從上往下數,後面也一樣】的第一個節點有另一個子節點,於是去搜索另一個子節點,第五層第一個是7,返回到第四層第二個節點,然後繼續往後,第五層第二個節點是4,比7小於是第四層第二個節點更新為4,此時出現了第一個剪枝【關鍵點來了!】。因為對於第三層第一個節點,我們已經搜過一次,得到此時的alpha是5,第三層是max層,他會從第四層對應子節點選一個極大的值,而第四層是min層會從第五層選擇極小值,也就是說,我們繼續在第五層的對應第四層第二個節點的子節點搜尋也只可能返回給第四層第二個節點比4更小的數字,但是第三層選的是極大,5已經比4大了,換句話說,無論第四層第二個節點再怎麼更新值也只能小於等於4,也即小於5,所以第三層第一個節點一定不會去選第四層第二個節點了,也就沒有必要再搜尋後面了,這就使用了第一次剪枝節。【記住一個關鍵點,考慮父節點的min、max性質,比較兄弟節點來剪枝節】第二次剪枝即第四層第五個節點剪枝同理不再講。對於第三次剪枝節也即第二層第三個節點,我們先搜尋他的第一個子節點,一路搜上來返回了5,這裡直接剪掉了一整條第三層第六節點。這裡從我上面提到的關鍵點考慮,因為第一層是max層,他會從第二層選一個極大,此時我們已經搜尋出來第二層第二個節點是6,而第三個節點是5,第二層是min層,第三個節點繼續搜尋也只可能比5小,也即小於6,所以直接剪去第二層第三節點的所有其他子節點,去搜索第四個節點【如果有的話】。

【為方便閱讀看圖下面再貼一次】

相信到這裡大家應該已經對概念理解的差不多了。上面我曾提到過,為了方便理解,我們從底部往上想,但是在程式碼裡這樣就不太好寫了。對程式碼,我們可以利用遞迴返回來實現從下往上回溯,返回一個一個的節點搜尋值。遞迴如果你比較熟悉的話應該會容易懂,即寫的時候是從上往下寫,但邏輯上其實是從下往上返回值。

先推薦一個我感覺alpha-beta寫的比較清楚的:https://blog.csdn.net/u013351484/article/details/50810224

這個是一個三角點格棋的題,理解這個儲存局面和連邊可能會有點挫折,實在看不明白可以直接看他的alpha-beta函式,不去理會這個題本身,博主註釋寫的還是很清楚的!歡迎評論留言

相關推薦

極大搜尋阿爾剪枝搜尋演算法簡單描述理解--通俗易懂

這是本人第一次正經寫部落格,排版技術不行,看起來可能有點難受,但我相信如果大家認真按順序讀下去一定能理解這個演算法,如果還有不是很清楚或者覺得我哪裡有講錯的地方歡迎評論留言!這段時間都在!會看和回覆的! 阿爾法貝塔剪枝是基於極大極小值搜尋的一種演算法。 舉個比較簡單的例子

極大搜尋 + 剪枝

/* 題意: Alice和Bob玩遊戲,在一個4x4 的方格上 每個人每次選擇2x2的區域將裡面的四個值求和加到最後的分數當中(兩個人共用一個分數), 然後逆時針翻轉它們, Alice想要分數儘量大Bob想要分數儘量小 兩個人每次的選擇都是最優的,求最後的分數

【LeetCode 913】cat-and-mouse | BFS+記憶化 | 極大搜尋+AB剪枝 | CGUZ | H

【難題警告!】 核心:BFS + 記憶化(標程) /  極大極小搜尋 + alpha-beta剪枝(近似解) Difficulty : Hard     Discuss (32) ACCEPTED  1,341          SUBMISSIONS  6

筆記--極大搜索及alpha-beta剪枝

cor article posit oss else hab alt 葉子節點 知乎 參考1:https://www.zhihu.com/question/27221568 參考2:https://blog.csdn.net/hzk_cpp/article/details

博弈基礎——極大搜尋

        計算機博弈(也稱機器博弈),是一個挑戰無窮、生機勃勃的研究領域,是人工智慧領域的重要研究方向,是機器智慧、兵棋推演、智慧決策系統等人工智慧領域的重要科研基礎。機器博弈被認為是人工智慧領

CCF 201803-4 棋局評估 極大搜尋

題意:3X3的井字棋,1先走,2後走,給定一個狀態。當前輪到1走,1,2都按照最優策略行棋,求最後的分數。 #include <cstdio> #include <algorithm

MATLAB—一字棋(極大搜尋

init.m %初始化棋盤狀態 function cur=init() cur=rand(3,3); %儲存當前棋盤的狀態 %計算機為先手時的初值,即均為0 for i=1:3 for j=1:3 cur(i,j)=0;

牛頓極大

牛頓法至少有兩個應用方向,1、求方程的根,2、最優化。牛頓法涉及到方程求導,下面的討論均是在連續可微的前提下討論。 1、求解方程。 並不是所有的方程都有求根公式,或者求根公式很複雜,導致求解困難。利用牛頓法,可以迭代求解。 原理是利用泰勒公式,在x0處展開,且展開

201803-4棋局評估_極大演算法_對抗搜尋(轉載)

問題描述 試題編號:201803-4 試題名稱:棋局評估 時間限制:1.0s 記憶體限制:256.0MB 問題描述:問題描述  Alice和Bob正在玩井字棋遊戲。   井字棋遊戲的規則很簡單

中國象棋人機對弈搜尋演算法學習-極大值,負極大值,alpha-beta演算法

極大極小值法 深度搜索(dfs)虛擬碼 /** 1。 p 為棋盤 2。 d 為規定的搜素最大深度,比如d層紅方,d-1層為黑方,d-2層為紅方...依此類推,可採用mod2來判斷當前是哪一方 4。評估棋盤的函式evaluation,當然需要看

五子棋(人機)-極大搜尋演算法

從人落子開始到出現勝負或者和局,之間所落的子,構成了一個解。而解空間就是一個樹,解就是這解空間中的一條路徑。只不過這個解空間是電腦的選擇和人的選擇共同構成的(奇數層是電腦(因為輪到電腦落子麼),偶數層是人)。 極大極小值搜尋演算法,來搜尋(回溯)這個解空間:它假設人和電腦都

poj 1085 Triangle War 1568 Find the Winning Move 極大搜尋 alpha-beta剪枝

一,極大極小搜尋及alpha-beta剪枝(參考這裡) 在博弈搜尋中,比如:圍棋,五子棋,象棋等,結果有三種可能:勝利,失敗和平局。 理論上可以窮舉所有的走法,這就需要生成整棵博弈樹。實際上不可行。因此搜尋時可以限制博弈樹的深度,到達該深度則不再往下搜,相當

POJ 1085 Triangle War(極大搜尋+alpha-beta剪枝

// // main.cpp // Richard // // Created by 邵金傑 on 16/8/29. // Copyright © 2016年 邵金傑. All rights reserved. // #include<iostream&g

POJ 1085 Triangle War(博弈,極大搜尋+alpha_beta剪枝

題目:給出10個點,總共有18條邊,每次兩個人輪流加入一條邊,如果形成一個三角形,則三角形歸他所有,而且可以額外再走一步。最後三角形多的人勝 博弈問題 所謂的極大極小搜尋,其實就是搞個估價函式。然後主角肯定選個估價函式最大的,即對自己最有利的局面走。 而輪到對方的時候,

QT五子棋專案詳解之四:AI人機戰max-min極大值博弈演算法

不考慮博弈的演算法怎麼能算是AI呢?max-min極大極小值演算法就是考慮了博弈的演算法。來看一個簡單的例子在這個棋局中,電腦為白旗,白旗走哪一步更好呢,也許使用策略表會告訴你,應該衝4,但是衝4後,玩家就會連成4。這就是考慮了博弈之後,這一步棋就是敗局。這就是為什麼有max

[演算法] 極大搜尋

原文連結: http://www.xqbase.com/computer/search_minimax.htm總結兩點:1. 深度優先搜尋,只有在葉子節點計算評估分。 2. max和min層只負責從分支中,選擇最大或者最小的評分。《對弈程式基本技術》專題 最小-最大

極大搜索思想+(α/β)減枝 【轉自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】

ima 基本 個數 博弈論 數字 這就是 pre -- 繼續 極大極小搜索,即minimax搜索算法,專門用來做博弈論的問題的暴力. 多被稱為對抗搜索算法. 這個搜索算法的基本思想就是分兩層,一層是先手,記為a,還有一層是後手,記為b. 這個搜索是認為這a與b的利益關

極大演算法

作者:知乎使用者 連結:https://www.zhihu.com/question/27221568/answer/140874499 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。   先來說極小極大演算法主要應用於什麼樣的遊戲: 1. 零和遊戲(

自定義比例的GS噪聲椒鹽噪聲的加入阿爾修正的均值濾波的實現

椒鹽噪聲的加入和GS噪聲的加入程式已經爛大街(GS噪聲公式很不好想,可能會間歇性遺忘),在這主要是展示下特定比例的實現(其實也很簡單)程式碼直接粘了: jiaoyan: im=double(imread('board-orig.bmp')); [m,n]=size(i

極大演算法原理

參考書籍《人工智慧基礎教程》 該演算法的搜尋策略是考慮雙方若干步之後,從可能的步中選擇相對較好的走發來走。 以MAX表示程式方,MIN表示對手方,P表示局勢,f(P)是根據當前局勢做出的估計函式。 則 F(p)>0表示對MAX有利的局勢 F(p)<0表示對MI