我正在 python 上做一个棋盘游戏,我需要在其中实现算法最小值。当我尝试增加搜索深度时,我的程序停止工作。我也尝试实施 alpha beta 削减,但它似乎无法正常工作。当我尝试其他深度值时,它开始进行无效播放,并且还出现此错误:
r = len(Matrix)
TypeError: object of type 'NoneType' has no len()
以下是我的代码:
def AIPlayerMove(board: Board, depth, MaxPlayer: bool, PlayerIndex: int):
if depth == 0:
# value = board.BoardValue()
return board.BoardMatrix
if MaxPlayer == True:
# print("Search Max\n")
BoardNodes = FecthChildNodes(board, PlayerIndex)
results = []
BestMatrix = None
for BN in range(len(BoardNodes)):
results.append(AIPlayerMove(BoardNodes[BN], depth-1, False, PlayerIndex*-1))
for r in range(len(results)):
if r == 0:
m = results[r]
BestMatrix = m
else:
m = results[r]
v1 = CountElementsOfMatrix(m)
v2 = CountElementsOfMatrix(BestMatrix)
if v1 > v2:
BestMatrix = m
#print(BestMatrix)
return BestMatrix
else:
# print("Search Min\n")
BoardNodes = FecthChildNodes(board, PlayerIndex)
results = []
WorstMatrix = None
for BN in range(len(BoardNodes)):
results.append(AIPlayerMove(BoardNodes[BN], depth-1, True, PlayerIndex*-1))
#WorstMatrix = results[0]
for r in range(len(results)):
if r == 0:
m = results[r]
WorstMatrix = m
else:
m = results[r]
v1 = CountElementsOfMatrix(m)
v2 = CountElementsOfMatrix(WorstMatrix)
if v1 < v2:
WorstMatrix = m
print(WorstMatrix)
return WorstMatrix
阿尔法测试版修剪:
def AIPlayerMoveAlphaBeta(board: Board, depth, MaxPlayer: bool, PlayerIndex: int, Alpha, Beta):
if depth == 0:
# value = board.BoardValue()
return board.BoardMatrix
if MaxPlayer == True:
BoardNodes = FecthChildNodes(board, PlayerIndex)
results = []
BestMatrix = None
for BN in range(len(BoardNodes)):
results.append(AIPlayerMoveAlphaBeta(BoardNodes[BN], depth-1, False, PlayerIndex*-1, Alpha, Beta))
for r in range(len(results)):
if r == 0:
m = results[r]
BestMatrix = m
else:
v2 = CountElementsOfMatrix(BestMatrix)
alpha = max(Alpha, v2)
if Beta <= alpha:
print("Break Max")
break
# check alpha beta for best scenario of player Beta <= Alpha
m = results[r]
v1 = CountElementsOfMatrix(m)
if v1 > v2:
BestMatrix = m
return BestMatrix
else:
BoardNodes = FecthChildNodes(board, PlayerIndex)
results = []
WorstMatrix = None
for BN in range(len(BoardNodes)):
results.append(AIPlayerMoveAlphaBeta(BoardNodes[BN], depth-1, True, PlayerIndex*-1, Alpha, Beta))
#print(results)
for r in range(len(results)):
if r == 0:
m = results[r]
WorstMatrix = m
else:
v2 = CountElementsOfMatrix(WorstMatrix)
beta = min(Beta, v2)
if beta <= Alpha:
print("Break Min")
break
# check alpha beta for Worst scenario of player Beta > Alpha
m = results[r]
v1 = CountElementsOfMatrix(m)
if v1 < v2:
WorstMatrix = m
return WorstMatrix
辅助功能:
def FecthChildNodes(board: Board, PlayerIndex: int):
TestBoards = []
for row in range(board.row_count):
for column in range(board.column_count):
# Check if player is according to index
if board.BoardMatrix[row][column] == PlayerIndex:
# Check for Tangent Movements
TangentPositions = board.GetAvailableTangentPositions((row, column))
for p in range(len(TangentPositions)):
tempBoard: Board = Board(board.row_count, board.column_count)
tempBoard.ChangeMatrixValuesWithMatrix(board.BoardMatrix)
tempBoard.MakeNewPieceAt(TangentPositions[p], PlayerIndex)
tempBoard.CatchPiece(TangentPositions[p], PlayerIndex)
TestBoards.append(tempBoard)
# tempBoard.DrawBoardTerminal()
# Check for Long Movements
LongPositions = board.GetAvailableTagentPositionsMovement((row, column))
for p in range(len(LongPositions)):
tempBoard: Board = Board(board.row_count, board.column_count)
tempBoard.ChangeMatrixValuesWithMatrix(board.BoardMatrix)
tempBoard.MovePieceTo((row, column), LongPositions[p], PlayerIndex)
tempBoard.CatchPiece(LongPositions[p], PlayerIndex)
TestBoards.append(tempBoard)
# tempBoard.DrawBoardTerminal()
return TestBoards
启发式功能:
def CountElementsOfMatrix(Matrix):
r = len(Matrix)
c = len(Matrix[0])
counter = 0
for row in range(r):
for col in range(c):
counter += Matrix[row][col]
return counter
当您到达无法移动的状态时(也许游戏只是结束了?),然后FetchChildNodes返回一个空列表,这会导致AIPlayer移动返回无,这会导致错误。
我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应
问题内容: 最小高度不适用于body / html吗? 完全不执行任何操作(firebug报告正文,html标签的高度完全不变) 问题答案: 首先,声明一个doctype以便您符合标准(如果还没有的话)。 现在,正文只能与包含html的正文一样高,因此您需要将HTML标签设置为100%的高度,并将正文设置为min-height 100%。这对我在Firefox上有效。
极小极大算法的一个缺点是每个板状态必须被访问两次:一次查找其子级,第二次评估启发式值。 极小极大算法还有其他缺点或优点吗?对于像象棋这样的游戏,还有更好的选择吗?(当然是带有α-β修剪的极小极大算法,但还有其他吗?)
我已经实现了一个带有alpha beta修剪的NegaMax算法(这只是一个较短版本的极小值算法)。现在我想实现迭代深化,这样我就可以为每个深度找到最佳移动,然后根据之前层的分数重新排序树下的节点,以便我的alphabeta修剪工作更有效。 以下是我迄今为止所做的工作: 这里gs是随每一步移动而变化的游戏属性,包含了所有关于游戏在t点的信息,比如是否可以施法或者是否有可能的内移。我的egamax算
计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法,并通过实例分析帮助大家更好的理解。 一、概念 Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两
无向图G=(V,E)的独立集是V的子集I使得I中没有两个顶点相邻。也就是说,如果u和v在I中,那么(u,v)不在E中。极大独立集M是一个独立集,这样,如果我们给M添加任何附加的顶点,那么它将不再是独立的。每个图都有一个极大独立集。(你能看到这个吗?这个问题不是练习的一部分,但值得思考。)给出了一个计算图G的最大独立集的有效算法。该方法的运行时间是多少? 我不确定对深度优先搜索的修改是否能解决上述问