1. 程式人生 > >極大極小樹的剪枝演算法1 alpha-beta剪枝

極大極小樹的剪枝演算法1 alpha-beta剪枝

Alpha-Beta 剪枝演算法用於減小極大極小演算法所搜尋的節點數目,Alpha-Beta 剪枝演算法的效率很大依賴於節點的排列,在理想的排序下,演算法複雜度為O(b^(d/2)),可以使搜尋節點的數量減小一半,從而使在相同時間下的搜尋深度增加一倍。在隨機排序下,演算法複雜度平均為O(b^(d*3/4))

演算法使用了兩個值,分別為alpha和beta,分別代表最佳得分的最小下界和最大上界,最初alpha,beta被設為無窮大和無窮小,隨著搜尋的進行,這個上界和下界逐漸收斂。

1) 任何max節點的alpha值大於其父節點的beta值,則把該節點剩餘的枝剪去,因為這說明在該節點之前至少有一個節點的alpha值比它的上界要小,而父節點

是min節點,所以這個節點明顯不是min節點所想要的。或者說這個節點對對手有利。

2) 同理任何min節點的beta值小於其父節點的alpha值,則把該節點剩餘的枝剪去。

下面引用一個wiki上的例子

上圖中第4層的4 beta = 4 比 其父節點的 alpha值5要小,所以將其剩餘的枝剪去

alphabetapouring

下面是演算法的虛擬碼

alphaBeta(node,alpha,beta,depth,player)
	if (depth = 0)
		return valuation(player)呼叫估值函式
	else 
		if (player = maxplayer)
			foreach child of node
				value :=alphaBeta(child,depth-1,alpha,beta,minplayer)
				if(value>alpha)alpha:=value
				if(alpha>=beta)break
			return alpha
		else
			foreach child of node
				value :=alphaBeta(child,depth-1,alpha,beta,maxplayer)
				if(value<beta)beta:=value
				if(alpha>=beta)break
			return beta 
下面是其更簡潔的negaMax形式
negaAlphabeta(node,alpha,beta,depth)
	if (depth = 0)
		return valuation()呼叫估值函式
	else 
		foreach child of node
			value :=-negaAlphabeta(child,depth-1,-beta,-alpha)
			if(value>alpha)alpha:=value
			if(alpha>=beta)break
		return alpha
使用時將alpha beta初始值設為-∞和+

相關推薦

極大小樹剪枝演算法1 alpha-beta剪枝

Alpha-Beta 剪枝演算法用於減小極大極小演算法所搜尋的節點數目,Alpha-Beta 剪枝演算法的效率很大依賴於節點的排列,在理想的排序下,演算法複雜度為O(b^(d/2)),可以使搜尋節點的數量減小一半,從而使在相同時間下的搜尋深度增加一倍。在隨機排序下,演算法複

算法筆記--極大小搜索及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

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

1568 Find the Winning Move 極大搜尋+alpha-beta剪枝

題目:在一個4*4的格子裡面,x和o兩個人玩遊戲,x畫'x',o畫'o',x先手,給定x和o都已經畫了一定步數的局面,問x是不是必勝的,如果是,輸出他應該畫在哪個位置 思路:極小極大搜尋+alpha-beta剪枝 程式碼: #pragma comment(linker, "

一看就懂的Alpha-Beta剪枝演算法詳解

原貼:http://blog.csdn.net/tangchenyi/article/details/22925957 Alpha-Beta剪枝演算法(Alpha Beta Pruning) Alpha-Beta剪枝用於裁剪搜尋樹中沒有意義的不需要搜尋的樹枝,以

一看就懂的 Alpha-Beta 剪枝演算法詳解

Alpha-Beta剪枝用於裁剪搜尋樹中沒有意義的不需要搜尋的樹枝,以提高運算速度。假設α為下界

四國軍棋引擎開發(6)alpha-beta剪枝演算法

在講alpha-beta剪枝演算法之前先要了解最大最小演算法,在棋類遊戲中,給每一個局面打一個分數,輪到自己下時會選擇有利於自己的下法,即選擇局面分數高的,而對手會選擇更加不利於自己的局面,即分數最低的。如下圖所示,max結點會選擇分數最高的子結點作為分值,而m

五子棋AI演算法第三篇-Alpha Beta剪枝

剪枝是必須的 上一篇講了極大極小值搜尋,其實單純的極大極小值搜尋演算法並沒有實際意義。 可以做一個簡單的計算,平均一步考慮 50 種可能性的話,思考到第四層,那麼搜尋的節點數就是 50^4 = 6250000,在我的酷睿I7的電腦上一秒鐘能計算的節點不超

Alpha-Beta剪枝演算法

1 int AlphaBeta(int depth, int alpha, int beta){ 2 if (depth == 0) { 3   return Evaluate(); 4 } 5 GenerateLegalMoves(); 6 while

POJ Find the Winning Move【minmax搜索+alpha-beta剪枝】【北大ACM/ICPC競賽訓練】

目前 剪枝 find 最大 namespace row 競賽 move icpc 1 #include<iostream> 2 using namespace std; 3 4 int row,col,chess; 5 char bo

leetcode 486. Predict the Winner (Alpha-Beta剪枝實現關鍵點小總結)

題意 小的博弈遊戲,兩個人輪流從一個數組的兩端取數,直到取完,最後取的和最大的人獲勝。問先手能否贏?其中如果和相同,先手勝。 思路 首先如果有偶數個元素,先手必勝,這個可以參考leetcode 877題求解思路,證明連結 奇數個的時候就沒有這麼好的

Alpha-Beta剪枝

Alpha-Beta剪枝 用於裁剪搜尋樹中沒有意義的不需要搜尋的樹枝,以提高運算速度。 假設α為下界,β為上界,對於α ≤ N ≤ β: 若 α ≤ β 則N有解。 若 α > β 則N無解。 下面通過一個例子說明Alpha-Beta剪枝演算法 上圖為整顆搜尋樹。這裡使用極小極大演算

例析Alpha-Beta剪枝

本文使用三子棋問題簡單描述Alpha-Beta剪枝的原理。順序是:先描述三子棋問題,接著描述三子棋問題的極小極大演算法,最後描述三子棋問題的Alpha-Beta剪枝演算法。 對三子棋問題描述如下: 下棋的一方是計算機(記為“MAX",執棋子“X”),另一方是人(

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

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

最小-最大搜索和Alpha-beta剪枝搜尋

最小-最大搜索 Bruce Moreland / 文 從淺顯的地方開始   在國際象棋裡,雙方棋手都知道每個棋子在哪裡,他們輪流走並且可以走任何合理的著法。下棋的目的就是將死對方,或者避免被將死,或者有時爭取和棋是最好的選擇。  國際象棋程式通過使用“搜尋”

博弈(alpha-beta 剪枝)POJ —— 1085 Triangle War

Triangle War Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3066 Accepted: 1207 Description Triangle War is a two-pl

alpha-beta剪枝的程式碼實現

之前在極大化極小演算法minimax說得不夠清楚而且也沒有附帶虛擬碼,所以這裡再寫一篇專門關於剪枝的blog進行補充 http://blog.csdn.net/joshualiunsw/article/details/52131507 ———————————————————

Alpha-Beta剪枝(Alpha Beta Pruning)

Alpha-Beta剪枝演算法(Alpha Beta Pruning) Alpha-Beta剪枝用於裁剪搜尋樹中沒有意義的不需要搜尋的樹枝,以提高運算速度。 假設α為下界,β為上界,對於α ≤ N ≤ β: 若 α ≤ β  則N有解。 若 α > β 則N無解。 下面通過一個例子來說明Alp

2017 ICPC Naning I. Rake It In(alpha-beta剪枝)

題意:Alice和Bob在玩一種名為“Rake It In”的遊戲,起初有一個44的棋盤,每一格為一個1~10的整數,兩人輪流行動,各自k次,行動者選擇棋盤中某一個22的區域,將這四個元素求和,加到最