【人工智能】博弈搜索(极小极大值、α-β剪枝)

1. 极小极大值算法

  人工智能中 “博弈” 通常专指博弈论专家们称为有完整信息的、确定性的、轮流行动的、两个游戏者的零和游戏(如国际象棋)。术语中,这是指在确定的、完全可观察的环境中两个 Agent必须轮流行动,在游戏结束时效用值总是相等并且符号相反。例如下国际象棋,一个棋手贏了,则对手一定是输了。正是 Agent 之间效用函数的对立导致了环境是对抗的。

博弈的游戏通常被 AI 作为一个好的问题来进行研究主要是因为:

  • 玩家需要向人一样的智慧
  • 游戏可能非常复杂(如象棋、围棋)
  • 需要在一定的时间限制内做出决策
  • 游戏是容易被定义的而且可以重复
  • 游戏完全可观察并且有有限的环境
  • 可以直接将人与AI进行比较

以井字棋为例我们可以得到下面的博弈树:
在这里插入图片描述
  通过以上博弈树可以得知游戏的终止会有两种结果MAX得到+1,MIN就会是-1,MAX是-1,MIN就会是+1,也就是一名玩家最大化结果,另一名玩家的结果就会最小。

  假设两个玩家(MAX为计算机、MIN为其对手)都发挥最佳效果,那么在计算机移动后,对手将选择最小化(但对于对手来说是最有利的操作)的移动,由此可得计算机应在考虑其移动和对手的最佳移动的情况下选择最佳移动,如下图所示:
在这里插入图片描述

  如上图所示计算机在根节点有四种选择方式,每种选择之后其对手又有不同种选择方式,在其对手选择完成后就会进入终止状态产生结果,计算机 (MAX) 为确保自己所获利益最大,应当选择B、C、D、E中最大的值,因为对手 (MIN) 总会选择对自己最有利的决策,所以B值的由来是F、G中的最小值、C的由来是H、I、J的最小值,由此就可以得到了极小极大值的算法,极小代表的是在计算机 (MAX) 决策后其对手 (MIN) 总会选择对于计算机 (MAX) 来说获利最小的操作,极大值代表的是计算机 (MAX) 需要在所有的决策中(所有的极小值中),选择最大的值,通过以上分析可得运用递归的方法是比较容易实现以上操作的,具体伪代码如下:

function MINIMAX_DECISION(state) returns an action
	inputs: state,current state in game
	return the a in Actions(state) maximizing MIN-VALUE(RESULT(a,state))

function MAX-VALUE(state) returns a utility value
	if TERMINAL-TEST(state) then return UTILITY(state)
	v = -for a,s in SUCCESSORS(state) do 
		v = MAX(v,MIN-VALUE(s))

function MIN-VALUE(state) returns a utility value
	if TERMINAL-TEST(state) then return UTILITY(state)
	v =for a,s in SUCCESSORS(state) do 
		v = MIN(v,MAX-VALUE(s))

  从如上代码中可以得到 MAX-VALUE 函数与 MIN-VALUE 函数相互调用,通过深度优先搜索与逆向的归纳实现了极小极大值算法流程。

2. α-β剪枝

假设有如下博弈搜索树:
在这里插入图片描述
其正常的深搜顺序如下所示:
在这里插入图片描述
但根据极小极大值算法来看,我们发现有些搜索是没有必要进行的,请看以下分析:
在这里插入图片描述
  查看上图得知,MAX已完成了对第一个子节点的搜索,此时 MAX 在未搜索到其它节点的情况下的选择应该是大于等于3的 (目前所得到的极小极大值为3)。
在这里插入图片描述
  继续对第二个子节点进行搜索,但在第二个子节点的孩子节点搜到 2 时,我们就得知第二个子节点的值只会 ≤2 ,比第一个节点的值要小,因为我们要在所有子结点中选择最大值,因此在搜完第二个子节点的 2 节点之后,第二个子节点的孩子节点就没有搜索的必要了。
在这里插入图片描述
  但如果在搜索第三个节点时搜索到了值为 14 的节点,剩余的节点是还要继续搜索的,因为我们不知道第三个子节点的最小孩子节点是多少,所以需要继续搜索。
  以上过程只是展示了 MAX 在搜索中的剪枝过程,同理我们也可以得到 MIN在搜索时,也可以利用同样的优化方案,此时我们就可以得到 α-β 剪枝的伪代码:

function ALPHA-BETA-SEARCH(state) returns an action
	v = MAX-VALUE(state,-∞,+)
	return the action in ACTIONS(state) with value v

function MAX-VALUE(state,α,β) returns a utility value
	if TERMINAL-TEST(state) then return UTILITY(state)
	v = -for each a in ACTIONS(state) do
		v = MAX(v,MIN-VALUE(RESULT(s,a),α,β))
		if v ≥ β then return v
		α = MAX(α,v)
	return v
	
function MIN-VALUE(state,α,β) returns a utility value
	if TERMINAL-TEST(state) then return UTILITY(state)
	v = +for each a in ACTIONS(state) do
		v = MIN(v,MAX-VALUE(RESULT(s,a),α,β))
		if v ≤ α then return v
		β = MIN(β,v)
	return v

  其中 α 表示到目前为止路径上发现的 MAX 的最佳 (即极大值) 选择,β表示到目前为止路径上发现的 MIN 的最佳 (即极小值) 选择。

### 构建五子棋AI中的极大极小值算法 在构建五子棋AI的过程中,极大极小值算法扮演着至关重要的角色。该算法假设玩家和对手都是理性个体,会尽力使自己获胜的概率最大化或对方获胜概率最小化。 #### 创建初始博弈树结构 为了实现这一目标,首先需要创建一个表示当前游戏状态的节点作为根节点。此节点下的每一层分别对应于两名选手的动作序列。对于五子棋而言,这意味着每一步可能的落子位置都会形成新的分支[^1]。 ```python class GameState: def __init__(self, board=None): self.board = [[0]*15 for _ in range(15)] if not board else board.copy() def generate_children(state): children = [] for i in range(len(state.board)): for j in range(len(state.board[i])): if state.board[i][j] == 0: # 如果当前位置为空,则可以放置新棋子 new_state = GameState(state.board) new_state.board[i][j] = get_next_player(state) # 假设有一个函数返回下一个玩家编号 children.append(new_state) return children ``` #### 应用极大极小搜索策略 当有了上述的基础之后,就可以利用递归来模拟多步预测的效果。在这个过程中,交替执行最大值(Max)操作与最小值(Min)操作,直到达到预定义的最大深度或是某个终止条件被满足为止。 ```python import math def minimax(state, depth, maximizingPlayer): if terminal_test(state): # 判断是否到达叶结点或其他结束情况 return evaluate_board(state) if depth == 0 or is_time_up(): return heuristic_evaluation(state) if maximizingPlayer: maxEval = -math.inf for child in generate_children(state): eval = minimax(child, depth - 1, False) maxEval = max(maxEval, eval) return maxEval else: minEval = math.inf for child in generate_children(state): eval = minimax(child, depth - 1, True) minEval = min(minEval, eval) return minEval ``` #### Alpha-Beta剪枝优化 尽管基本形式已经能够工作得很好,但在实际应用中通常还会加入Alpha-Beta剪枝技术来减少不必要的计算量。这种方法可以在不影响最终结果的前提下显著提高效率[^2]。 ```python def alphabeta(state, alpha=-math.inf, beta=math.inf, depth=3, maximizingPlayer=True): if terminal_test(state): return evaluate_board(state), None best_move = None if depth == 0 or is_time_up(): return heuristic_evaluation(state), None if maximizingPlayer: value = -math.inf for move in sorted_moves(generate_children(state)): # 对移动进行优先级排序以加速收敛 next_value, _ = alphabeta(move, alpha, beta, depth-1, False) if next_value > value: value, best_move = next_value, move alpha = max(alpha, value) if alpha >= beta: break # Beta cut-off return value, best_move else: value = math.inf for move in sorted_moves(generate_children(state)): next_value, _ = alphabeta(move, alpha, beta, depth-1, True) if next_value < value: value, best_move = next_value, move beta = min(beta, value) if beta <= alpha: break # Alpha cut-off return value, best_move ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值