極小化極大アルゴリズム及びAlpha-beta剪定
4843 ワード
初心者の方のメモですが、足りないところはご指摘ください.
極小化極大アルゴリズム(minimax)L'algorithm minimax
極小化極大アルゴリズムは深さ優先の探索アルゴリズムであり,ツリー構造が再帰し,tic-tac-toeのような棋類などの双方が対決するゲームやプログラムに多く用いられる.
それはゼロの総和ゲームを満たす必要があります.例えば、碁の試合で、当方の得点、相手の失点、総得点値は永遠に0またはある定数です.
そのため、私たちは勝つために、味方の利益(Max)を最大化し、相手の利益(Min)を最小化する必要があります.
疑似コードは次のとおりです(Wikipediaより):
最初のif擬似コードブロックは、depth=0がレイヤ数の頂点に達し、ゲームが終了し、あるノードに再帰され、プログラムが再実行できないか、またはすでに一方が勝っているかの2つの出口を指摘している.
2番目のifダミーブロックは、相手ノードにある場合に最小値をとることを示す
そうでなければelseが味方のノードにある場合、最大値をとります
minimaxアルゴリズムは木構造であるため,nのx次方程式の結果を計算する必要があり,碁盤の比較的大きなゲームでは計算量が幾何学的倍数に増加するため,Alpha‐beta剪定を用いてこのアルゴリズムを最適化する必要がある.
Alpha-beta剪定L'algorithme Alpha-beta
前述したように、alpha-beta剪定は実際にminimaxのアップグレードバージョンです.
minimaxの検索ツリーを、意味のない検索不要な幹を切り取って検索効率を向上させ、ワークロードを削減
疑似コードは次のとおりです(Wikipediaより):
私たちの一歩一歩は上の層の行方を予測するためであるため、各層は自分で(max)である.α ,相手は(min)β
ツリー構造が到着するとα >= β の場合、次のサブノードが何であるかにかかわらず、等しい以下になります.β,サブノードが相手の最小値minをとるため
自分が取るのはmaxなので、次に現れるのは何でも重要ではありません.
これで、右側の枝を減らすことができ、計算に時間を費やす必要はありません.
その後pythonコードと手画の導出を補充します
極小化極大アルゴリズム(minimax)L'algorithm minimax
極小化極大アルゴリズムは深さ優先の探索アルゴリズムであり,ツリー構造が再帰し,tic-tac-toeのような棋類などの双方が対決するゲームやプログラムに多く用いられる.
それはゼロの総和ゲームを満たす必要があります.例えば、碁の試合で、当方の得点、相手の失点、総得点値は永遠に0またはある定数です.
そのため、私たちは勝つために、味方の利益(Max)を最大化し、相手の利益(Min)を最小化する必要があります.
疑似コードは次のとおりです(Wikipediaより):
function minimax(node, depth)
if node is a terminal node or depth = 0
return the heuristic value of node
if the adversary is to play at node
let α := +∞
foreach child of node
α := min(α, minimax(child, depth-1))
else {we are to play at node}
let α := -∞
foreach child of node
α := max(α, minimax(child, depth-1))
return α
最初のif擬似コードブロックは、depth=0がレイヤ数の頂点に達し、ゲームが終了し、あるノードに再帰され、プログラムが再実行できないか、またはすでに一方が勝っているかの2つの出口を指摘している.
2番目のifダミーブロックは、相手ノードにある場合に最小値をとることを示す
そうでなければelseが味方のノードにある場合、最大値をとります
minimaxアルゴリズムは木構造であるため,nのx次方程式の結果を計算する必要があり,碁盤の比較的大きなゲームでは計算量が幾何学的倍数に増加するため,Alpha‐beta剪定を用いてこのアルゴリズムを最適化する必要がある.
Alpha-beta剪定L'algorithme Alpha-beta
前述したように、alpha-beta剪定は実際にminimaxのアップグレードバージョンです.
minimaxの検索ツリーを、意味のない検索不要な幹を切り取って検索効率を向上させ、ワークロードを削減
疑似コードは次のとおりです(Wikipediaより):
01 function alphabeta(node, depth, α, β, maximizingPlayer) // node = ,depth = ,maximizingPlayer =
02 if depth = 0 or node
03 return
04 if maximizingPlayer
05 v := -∞
06 for
07 v := max(v, alphabeta(child, depth - 1, α, β, FALSE)) // child =
08 α := max(α, v)
09 if β ≤ α
10 break // β
11 return v
12 else
13 v := ∞
14 for each
15 v := min(v, alphabeta(child, depth - 1, α, β, TRUE))
16 β := min(β, v)
17 if β ≤ α
18 break // α
19 return v
私たちの一歩一歩は上の層の行方を予測するためであるため、各層は自分で(max)である.α ,相手は(min)β
ツリー構造が到着するとα >= β の場合、次のサブノードが何であるかにかかわらず、等しい以下になります.β,サブノードが相手の最小値minをとるため
自分が取るのはmaxなので、次に現れるのは何でも重要ではありません.
これで、右側の枝を減らすことができ、計算に時間を費やす必要はありません.
その後pythonコードと手画の導出を補充します