极大极小搜索算法 minimax search

minimax search

设计象棋等AI模型时常常需要使用博弈论的思想,minimax search就是一种基于当前状态推测出使我方最有利而对方最不利的行动,在实际模型中需要考虑状态函数,树的深度,时间成本等等因素,这里只讲一个最简单的例子说明minmax search的计算过程。

假设根据当前局面我们得到一个下图所示的博弈树:
figure 1

从上往下,单数层是我方行动,双数层是对方行动,我方行动需要选择对我最有利的行动,即value大的行动,对方行动则是选择使我方最不利的行动,即value小的行动。

我们需要从最底层第四层开始考虑,双数层所以是对方行动。对于node I,会选择值更小的node M,node I的值更新为0。再考虑第三层,单数层是我方行动。node F会选择I,J中值更大的J,更新为5,G会选择K,L中值更大的L,更新为8。依次一层层向上类推,可以得到最终结果为:
在这里插入图片描述

alpha-beta prune

当树的深度很大的时候,遍历一遍的代价非常大,alpha-beta prune是一种优化方法,其根据遍历顺序分为left-to-right和right-to-left两种,前者从左边开始遍历,后者从右边开始遍历。

alpha-beta剪枝的基本思想是对于每个max结点设置一个目前已知下界alpha,每个min节点设置一个目前已知上界beta。alpha代表我方可以搜索到的最好值,beta代表了对方可以接受的最坏值。如果某个行动的结果小于或等于alpha,那么它就是很差的行动,我方可以选择更好的行动(当前alpha值的行动)。反之,如果某个行动的结果大于或等于beta,那么整个节点就作废了,因为对手不希望走到这个局面,而它有一定有别的行动(即走当前beta值的行动)可以避免到达这个局面。

但发生下面两种情况时可以剪枝,即停止搜索该节点的其余子节点:
1)当计算一个min结点时,如果它的beta值小于等于其父结点的alpha值,则可以立即停止此结点的计算(alpha剪枝)。
2)当计算一个max结点时,如果它的alpha结点大于等于其父结点的beta值,也可以立即停止此结点的计算(beta剪枝)。

简单来说,当 α ≥ β \alpha \geq \beta αβ时,发生剪枝,因为后续搜索到的行动一定会差于之前的行动或是对方一定不会采取后续的行动。通过剪枝可以减少遍历的节点数,从而加快速度。

还是以之前的博弈树为例(left-to-right)

  1. Initially node A α = − ∞ , β = ∞ \alpha = -\infty, \beta = \infty α=,β=, pass to node B and D.
  2. Starting form node D, b e t a = m i n ( ∞ , 3 ) = 3 beta = min(\infty,3) = 3 beta=min(,</
  • 7
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
三子棋是一种非常简单的棋类游戏,其规则为两个玩家轮流在一个 $3\times 3$ 的棋盘上放置棋子,先将三个棋子连成一线的玩家获胜。极小极大搜索是一种常用的博弈树搜索算法,可以用于解决类似于三子棋这样的博弈问题。 下面是一个使用 Python 实现极小极大搜索智能三子棋游戏的实验内容: 1. 首先定义棋盘类和棋子类,以及棋盘的初始化操作。 ```python class ChessBoard: def __init__(self): self.board = [[' ' for _ in range(3)] for _ in range(3)] self.player = 'X' self.winner = None def display(self): print(' 0 1 2') print('0 ' + ' | '.join(self.board[0])) print(' -----------') print('1 ' + ' | '.join(self.board[1])) print(' -----------') print('2 ' + ' | '.join(self.board[2])) def move(self, x, y): if self.board[x][y] == ' ': self.board[x][y] = self.player if self.check_win(): self.winner = self.player if self.player == 'X': self.player = 'O' else: self.player = 'X' return True else: return False def check_win(self): for i in range(3): if self.board[i][0] == self.board[i][1] == self.board[i][2] != ' ': return True if self.board[0][i] == self.board[1][i] == self.board[2][i] != ' ': return True if self.board[0][0] == self.board[1][1] == self.board[2][2] != ' ': return True if self.board[0][2] == self.board[1][1] == self.board[2][0] != ' ': return True return False def get_valid_moves(self): moves = [] for i in range(3): for j in range(3): if self.board[i][j] == ' ': moves.append((i, j)) return moves class ChessPiece: def __init__(self, x, y, player): self.x = x self.y = y self.player = player ``` 2. 然后定义极小极大搜索算法的实现,其中 `max_value` 和 `min_value` 分别代表极大值和极小值的计算函数。 ```python def max_value(state): if state.winner is not None: if state.winner == 'X': return 1 else: return -1 v = float('-inf') for move in state.get_valid_moves(): next_state = deepcopy(state) next_state.move(*move) v = max(v, min_value(next_state)) return v def min_value(state): if state.winner is not None: if state.winner == 'X': return 1 else: return -1 v = float('inf') for move in state.get_valid_moves(): next_state = deepcopy(state) next_state.move(*move) v = min(v, max_value(next_state)) return v def minimax_search(state): best_move = None best_value = float('-inf') for move in state.get_valid_moves(): next_state = deepcopy(state) next_state.move(*move) v = min_value(next_state) if v > best_value: best_move = move best_value = v return best_move ``` 3. 最后是主函数,实现了人类玩家和 AI 玩家的交互。 ```python def main(): chess_board = ChessBoard() while True: chess_board.display() if chess_board.winner is not None: print('Winner:', chess_board.winner) break if chess_board.player == 'X': x = int(input('X: Enter row: ')) y = int(input('X: Enter column: ')) if not chess_board.move(x, y): print('Invalid move!') else: move = minimax_search(chess_board) chess_board.move(*move) ``` 以上就是使用 Python 实现极小极大搜索智能三子棋游戏的全部内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值