python国际象棋的价值_python – 国际象棋negamax功能

嗨!

我正试图为我的国际象棋引擎编写一个negamax搜索算法,但我似乎无法让它工作.我使用wikipedias伪代码作为示例,但不知何故它不会产生预期的结果.当我以2的ply运行它时,它会改变我的电路板数据结构,尽管它不应该.功能完成与ply 2一起运行后,所有白色(或黑色的.取决于玩家所称的功能.)棋子从起始位置向前移动2个空格.

我的make和unmake move函数完美地工作,因为我使用非递归函数测试它们,搜索最多5层.然后,它完美地工作.我的negamax实现一定有问题.

非常感谢您的帮助!

def negaMax(self, board, rules, ply, player):

""" Implements a minimax algorithm. """

if ply == 0:

return self.positionEvaluation()

self.max_eval = float('-infinity')

self.move_list = board.generateMoves(rules, player)

for self.move in self.move_list:

board.makeMove(self.move, player)

self.eval = -self.negaMax(board, rules, ply - 1, board.getOtherPlayer(player))

board.unmakeMove(self.move, player)

if self.eval > self.max_eval:

self.max_eval = self.eval

return self.max_eval

解决方法:

这里的主要问题是我相信对象变量的使用而不是局部变量.

self.move是一个对象变量,每次你改变它 – 递归的每个级别“看到”变化,这通常是递归算法的坏事.

递归算法应该是自包含的,并且如果对调用环境有任何改变则做最小化 – 这使得更容易遍历算法流程.

我在这段代码中看到的两个主要问题是:

> self.move应该是一个局部变量(将其声明为move).当你以后做:board.unmakeMove(self.move,player) – 我怀疑该板正在撤消一个不同的移动,它在递归树中设置得更深,而不是你想要的那个.使用局部变量将消除这种不期望的行为.

>递归调用的每个级别都设置self.max_eval = float(‘ – infinity’) – 所以你不断改变它,虽然它可能不是你想要做的.

解决方案应该是这样的:

def negaMax(self, board, rules, ply, player):

""" Implements a minimax algorithm. """

if ply == 0:

return self.positionEvaluation()

max_eval = float('-infinity')

move_list = board.generateMoves(rules, player)

for move in move_list:

board.makeMove(move, player)

currentEval = -self.negaMax(board, rules, ply - 1, board.getOtherPlayer(player))

board.unmakeMove(move, player)

if currentEval > max_eval:

max_eval = currentEval

return max_eval

我不是100%肯定它确实会解决代码中的所有内容(但它会解决其中的一些问题)但我100%肯定避免使用对象变量会使代码更容易理解和调试.

标签:python,chess

来源: https://codeday.me/bug/20190630/1331763.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值