实现AI下井字棋的alpha-beta剪枝算法(python实现).pdfVIP

  • 15
  • 0
  • 约4.57千字
  • 约 4页
  • 2024-01-21 发布于北京
  • 举报

实现AI下井字棋的alpha-beta剪枝算法(python实现).pdf

实现AI下井字棋的alpha-beta剪枝算法(python实现)

代码参考⾃中国⼤学mooc上⼈⼯智能与息社会陈斌⽼师的算法,我在原来的基础上增加了玩家输⼊的异常捕获

AlphaBeta剪枝算法是对Minimax⽅法的优化,能够极⼤提⾼搜索树的效率,如果对这个算法感兴趣的可以去参考相关资料。

当正确理解AlphaBeta剪枝算法后,还可以将它应⽤在象棋、围棋等⼀些⾼级游戏的算法搜索上,使得电脑寻找最优胜率的速度加快

python代码实现

#coding:utf-8

井字棋(Tictactoe)Python3语⾔实现,带有Alpha-Beta剪枝的Minimax算法.

代码参考⾃中国⼤学mooc⼈⼯智能与息社会(陈斌)

importrandom

#⽤如下的9个数字来表⽰棋盘的位置:

#012

#345

#678

#设定获胜的组合⽅式(横、竖、斜)

WIIG_TRIADS=((0,1,2),(3,4,5),(6,7,8),

(0,3,6),(1,4,7),(2,5,8),

(0,4,8),(2,4,6))

#设定棋盘按⼀⾏三个打印

PRITIG_TRIADS=((0,1,2),(3,4,5),(6,7,8))

#⽤⼀维列表表⽰棋盘:

SLOTS=(0,1,2,3,4,5,6,7,8)

#-1表⽰X玩家0表⽰空位1表⽰O玩家.

X_token=-1

Open_token=0

O_token=1

MARKERS=[_,O,X]

ED_PHRASE=(平局,胜利,失败)

defalpha_beta_valuation(board,player,next_player,alpha,beta):

运⽤AlphaBeta剪枝来计算当前局⾯的分值

因为搜索层数少,总能搜索到最终局⾯,估值结果为[-1,0,1]

wnnr=winner(board)

ifwnnr!=Open_token:

#有玩家获胜

returnwnnr

elifnotlegal_move_left(board):

#没有空位,平局

return0

#检查当前玩家payer的所有可落⼦点

formoveinSLOTS:

ifboard[move]==Open_token:

board[move]=player

#落⼦之后交换玩家,继续检验

val=alpha_beta_valuation(board,next_player,player,alpha,beta)

board[move]=Open_token

ifplayer==O_token:#当前玩家是O,是Max玩家(记号是1)

ifvalalpha:

alpha=val

ifalpha=beta:

returnbeta#直接返回当前的最⼤可能取值beta,进⾏剪枝

else:#当前玩家是X,是Min玩家(记号是-1)

ifvalbeta:

beta=val

ifbeta=alpha:

returnalpha#直接返回当前的最⼩可能取值apha,进⾏剪枝

ifplayer==O_token:

retval=alpha

retval=alpha

else:

retval=beta

returnretval

defpri

文档评论(0)

1亿VIP精品文档

相关文档