- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在制作黑白棋玩家,并实现了一个带有 alpha-beta 剪枝的极小极大算法。然后我在网上对最好的算法进行了一系列研究,并不断听到他们都使用的“negamax”算法。似乎大多数人认为 negamax 比 minimax 快(我认为是因为它不会在最小玩家和最大玩家之间切换?),所以如果不太困难的话,我想将我的 minimax 算法变成 negamax。
我想知道人们是否知道使用 negamax 的速度有多快,以及关于如何将我的 minimax 代码转换为 negamax 算法的任何提示或代码,我们将不胜感激!
这是我的极小极大算法:
def minimax(Board, maximizingPlayer, depth, count):
# maximizing player has 'B' and minimizing 'W'
if maximizingPlayer: player, opp = Board.player, Board.opp
else: player, opp = Board.opp, Board.player
moves_list = Board.get_moves_list(player, opp)
best_move = (-1,-1)
# base case
if ( depth==0 or moves_list == [] ):
best_score, parity, mobility, stability = Board.evaluate()
best_move = (-1, -1)
return best_score, best_move, count
# maximizing player
if maximizingPlayer:
best_score = float("-inf")
for move in moves_list:
new_board = deepcopy(Board)
new_board.play_legal_move(move[0], move[1], player, opp, flip=True)
the_score, the_move, count = minimax(new_board, False, depth-1, count+1)
best_score = max(best_score, the_score)
if (the_score == best_score):
best_move = move
return best_score, best_move, count
# minimzing player
else:
best_score = float("inf")
for move in moves_list:
new_board = deepcopy(Board)
new_board.play_legal_move(move[0], move[1], player, opp, flip=True)
the_score, the_move, count = minimax(new_board, True, depth-1, count+1)
best_score = min(best_score, the_score)
if (the_score == best_score):
best_move = move
return best_score, best_move, count
因为我收到了询问我的 Alpha-beta 修剪的回复,所以这里是:
def alphabeta(Board, maximizingPlayer, depth, count, alpha, beta):
# maximizing player has 'B' and minimizing 'W'
if maximizingPlayer: player, opp = Board.player, Board.opp
else: player, opp = Board.opp, Board.player
moves_list = Board.get_moves_list(player, opp)
best_move = (-1,-1)
# base case
if ( depth==0 or moves_list == [] ):
best_score, parity, mobility, stability = Board.evaluate()
best_move = (-1, -1)
return best_score, best_move, count
# maximizing player
if maximizingPlayer:
best_score = float("-inf")
for move in moves_list:
new_board = deepcopy(Board)
new_board.play_legal_move(move[0], move[1], player, opp, flip=True)
the_score, the_move, count = alphabeta(new_board, False, depth-1, count+1, alpha, beta)
if (the_score > alpha):
alpha = the_score
best_move = move
if beta <= alpha: break
return alpha, best_move, count
# minimzing player
else:
best_score = float("inf")
for move in moves_list:
new_board = deepcopy(Board)
new_board.play_legal_move(move[0], move[1], player, opp, flip=True)
the_score, the_move, count = alphabeta(new_board, True, depth-1, count+1, alpha, beta)
if (the_score < beta):
beta = the_score
best_move = move
if beta <= alpha: break
return beta, best_move, count
最佳答案
我认为现在您已经实现了 minimax,这已经足够好了,但是您需要在 minimax 中实现最重要的优化,即 alpha-beta修剪,这将是对您的代码的简单更改,并且速度会有非常显着的提高。
编辑:-
注意到您已经使用了 alpha-beta,因此您可以实现 negamax,但您认为它不切换的想法是不正确的,但它减少了 minimax 的代码(我怀疑速度有显着提高)。这里的想法是,一个玩家的移动点数始终是另一个玩家的 -ve 但相同的幅度允许您计算 max(a,b) = -min(-a,-b)。
这里的简单翻译是:-
score = -negamax(depth-1,-player)
best = max(score,best)
这些只是使用 negamax 评估 minimax 的行
在这里您不需要交替计算最小值和最大值,但是给定最小玩家的分数总是对正玩家的负值这一事实就足够了,因此您始终可以计算最大值以获得正确的分数。
注意:-
这在速度方面不是很重要的优化,但使代码简单易读,因此值得,但不幸的是,您需要删除大量代码才能将代码转换为 negamax,所以我建议不要这样做。
关于python - 将 Minimax 转换为 Negamax(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24134326/
TLDR:我有一个用于 negamax 实现的非对称评估函数 - 这可以接受吗?还是我需要使其对称? 更长:我正在编写一个游戏 AI(用于类似国际象棋的棋盘游戏“Hive”),它使用带有 alpha-
我有一个尽可能简单的 negamax 算法,用于评估 Tic Tac Toe 中的位置。游戏状态在 numpy 中存储为一个数组,X 的棋子用 1 表示,O 的棋子用 4 表示。 我刚才正在测试这个,
如果满足条件,同一个玩家移动,您如何处理游戏? 我试过这样的东西,但我觉得不太对: function negamax(node, depth, α, β, color) if node is
我已经实现了 Negamax,因为它可以在 wikipedia 上找到,其中包括 alpha/beta 剪枝。 但是,它似乎倾向于失败的一步,据我所知这是无效的结果。 这款游戏是井字游戏,我已经抽象了
这段代码是为计算井字游戏中某个位置的最佳移动而构建的。我几乎得到了代码的每一部分,除了 for 循环中的条件,它表示 minRating != LOSING_POSITION。此代码来自给定伪代码的实
注意:如果您认为这篇文章对您没有足够的详细信息(例如,代码,结果和其他内容;我将相应地编辑帖子。 注意2:我自己编写了这个程序。 我有一个negamax实现,其结果对我来说似乎是非常错误的,我尝试了许
嗨! 我正在尝试为我的国际象棋引擎编写一个 negamax 搜索算法,但我似乎无法让它工作。我以 wikipedias 伪代码为例,但不知何故它没有产生预期的结果。当我用 2 层运行它时,它改变了我的
我一直在使用 negamax 玩连连四。我注意到的是,如果我添加 alpha-beta,它有时会给出“错误”的结果,因为在进行失败操作时,我认为它不应该与我正在搜索的深度相匹配。如果我删除 alpha
我正在上我的第一个 AI 类(class),并尝试在我的 c 代码中实现 NegaMax 算法。我正在使用这个算法来玩简单的 Nim 游戏,每个玩家在轮到他们时移除 1-3 个匹配项。计算机在这里与自
好吧,我先承认这个会有点长。我正在为 C# 编写国际象棋引擎,最终目标包括 UCI 实现。我已经做到了,给定一个棋盘,引擎将生成所有有效 Action 的列表;然而,我的评估代码似乎很挣扎,因为在与自
我对 Negamax 算法以及如何在实际案例中应用它有点困惑。在网上我找到了以下 C/C++ 代码(引用:https://chessprogramming.wikispaces.com/Unmake+
我是游戏树算法的新手,我尝试实现一个简单的井字棋游戏,该游戏利用 NegaMax 算法为计算机 AI 玩家评估拼贴分数。然而,AI 的行为并不聪明(我可以一直赢,因为 AI 不会阻止我的 Action
我为黑白棋游戏编写了 AI 播放器,我决定使用 NegaMax 或 MiniMax 来实现。伪代码: function negamax(node, depth, α, β, color) if
Negamax 通常如下所示: function negamax(node, depth, α, β, color) is if depth = 0 or node is a terminal
我正在尝试为 tic-tac-toe 应用程序实现 negamax 搜索函数,但它不会返回最佳值,而是似乎半随机猜测。这是我的代码的相关部分: public int negamax(Result re
我无法识别 negamax(alpha - beta)实现中的错误。 我可以使简单的 negamax 版本正常工作,但是我无法将其转换为 negaMax 的 alpha-beta 版本。 首先是正在运
我的程序中有一个有效的 negamax 算法。但是,我需要程序在 kMaxTimePerMove 时间内找到最佳可能的着法。我做了一些研究,似乎使用迭代加深和我的 negamax 算法是最好的方法。现
我正在制作黑白棋玩家,并实现了一个带有 alpha-beta 剪枝的极小极大算法。然后我在网上对最好的算法进行了一系列研究,并不断听到他们都使用的“negamax”算法。似乎大多数人认为 negama
关于非递归、基于迭代的 negamax 算法的任何想法或伪代码? 我使用 negamax 作为我的国际象棋 AI 的搜索核心。 我的引擎是用 JavaScript 编写的,根据文献,如果使用迭代而不是
我正在尝试构建国际象棋 AI。我的带 alpha-beta 修剪 (ABP) 的 negamax 函数运行速度比单独的 min 和 max 函数也用 ABP 慢得多(大约 8 倍),尽管返回的移动是相
我是一名优秀的程序员,十分优秀!