Python Tictaoe Alpha-Beta修剪

Python Tictaoe Alpha-Beta修剪,python,minimax,alpha-beta-pruning,Python,Minimax,Alpha Beta Pruning,编辑2021年3月30日:这个问题的措辞真的很糟糕,重新编排了它 我用Python实现了一个Alpha-Beta修剪算法,我想知道它不走最快的胜利路线是否正常(有时它会在2步中获胜,而它可能在1步中获胜) 导入数学 从收款进口柜台 从复制导入复制,复制 “”“板类定义”“” 班级委员会: “构造函数” 定义初始化(自): #初始数据 self.data=[“”表示范围(9)中的i) “”“复制等效构造函数”“” @静力学方法 def副本(板): 返回副本(板) “”“在给定坐标处播放”“” de

编辑2021年3月30日:这个问题的措辞真的很糟糕,重新编排了它

我用Python实现了一个Alpha-Beta修剪算法,我想知道它不走最快的胜利路线是否正常(有时它会在2步中获胜,而它可能在1步中获胜)

导入数学
从收款进口柜台
从复制导入复制,复制
“”“板类定义”“”
班级委员会:
“构造函数”
定义初始化(自):
#初始数据
self.data=[“”表示范围(9)中的i)
“”“复制等效构造函数”“”
@静力学方法
def副本(板):
返回副本(板)
“”“在给定坐标处播放”“”
def播放位置(自身、位置、颜色):
#看看你能不能玩
如果self.data[position]==”:
#行动
self.data[位置]=颜色
返回真值
#没有玩
返回错误
“”“获取棋盘上空棋子的坐标”“”
def获得可播放的合作(自我):
#定义空平铺的坐标
如果self.data[i]='',则返回范围(9)中的[i代表i]
“董事会已满”
def已满(自身):
#定义平铺计数器
c=计数器([范围(9)内i的自数据[i])
返回值(c[“x”]+c[“o”]==9)
“获得董事会冠军”
def获得优胜者(自我):
#要检查的直线
直线=[(0,1,2)、(3,4,5)、(6,7,8)、(0,3,6)、(1,4,7)、(2,5,8)、(0,4,8)、(2,4,6)]
#检查直线-共8条
对于范围(8)中的i:
#得到一行瓷砖的计数器
c=计数器([i]]中j的自数据[j])
#不同场景
如果c[“x”]==3:
返回“x”
elif c[“o”]==3:
返回“o”
#若棋盘已满,则游戏为平局
如果self.is_已满():
返回“抽签”
#默认情况下返回None
一无所获
“”“如果'reverse'==False,则获取电路板的启发值-对于“x”
def get_启发式_值(自身、反向):
#初始变量
值=0
#要检查的直线
直线=[(0,1,2)、(3,4,5)、(6,7,8)、(0,3,6)、(1,4,7)、(2,5,8)、(0,4,8)、(2,4,6)]
#检查直线-共8条
对于范围(8)中的i:
#得到一行瓷砖的计数器
c=计数器([i]]中j的自数据[j])
#不同场景
如果c[“x”]==3:
数值+=100
如果c[“x”]==2和c[““]==1:
数值+=10
如果c[“x”]==1和c[““]==2:
值+=1
elif c[“o”]==3:
值-=100
如果c[“o”]==2和c[““]==1:
值-=10
如果c[“o”]==1和c[““]==2:
值-=1
#返回启发式值
如果相反:
返回值
其他:
返回值
“”“模型类定义”“”
类别模型:
“构造函数”
定义初始化(自身,颜色):
#定义参数
self.color=颜色
self.other=self.get\u对手(颜色)
#定义板
self.board=board()
#定义胜利者
self.winner=无
#“x”首先播放
如果self.other==“x”:
self.make_ai_move()
“抓住对手”
def获取对手(自身、玩家):
如果玩家==“x”:
返回“o”
返回“x”
“”“玩家在给定位置移动”“”
def使玩家移动(自身、位置):
如果self.winner为无:
#获得board方法的结果
res=自板播放(位置,自板颜色)
#检查游戏结束
self.winner=self.board.get_winner()
如果res和self.winner为无:
#移动AI
self.make_ai_move()
“”“AI通过在所有子节点上使用alphabeta修剪进行移动”“”
def使_ai_移动(自身):
#初始变量
最佳,最佳值=无,-math.inf
因为我在self.board.get_playable_coord():
#儿童版
copie=Board.copy(self.Board)
复制。播放(我,自己。其他)
#使用alpha beta&(可能)注册播放
value=self.alphabeta(copie,10,-math.inf,math.inf,False)
如果值>最佳值:
最佳,最佳值=i,值
#在最佳坐标下比赛
self.board.play_(最好是self.other)
#检查游戏结束
self.winner=self.board.get_winner()
“”“alpha-beta函数(极大极小优化)”
def alphabeta(自身、节点、深度、alpha、beta、最大化玩家):
#终止条件
如果depth==0或node.get\u winner()不是None:
返回节点。获取启发值(self.other==“o”)
#递归部分初始化
如果最大化玩家:
value=-math.inf
对于节点中的位置。获取可播放的坐标():
#儿童版
子节点=板。复制(节点)
儿童游戏(位置、自身和其他)
值=最大值(值,自身。alphabeta(子,深度1,alpha,beta,False))
#更新alpha
alpha=最大值(alpha,值)
如果α>=β:
打破
返回值
其他:
value=math.inf
对于点头的pos