问题标签 [negamax]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 在 Negamax 算法中设置最佳移动的问题
嘿,我正在尝试制作一个国际象棋引擎,但是当我运行它运行良好的代码时,问题是有时它没有设置最佳移动并且它显示错误,因为搜索没有返回一个移动来玩。我的 negamax 包括 AB pruning、MD Pruning、QSearch、ID 和 TT 表。这是我的实现。
您可能已经注意到我并没有按应有的方式否定每回合的得分。原因是因为当您调用 move 函数时,它会返回分数已经被否定的位置。例如,
它不是移动生成,因为它返回每个位置状态的正确移动。最佳值是 -INFINITY 和 negamax,它应该始终设置最佳移动。任何帮助都会有所帮助。
algorithm - 使用 alpha-beta-pruning 预测 minimax 算法的剩余运行时间
问题
我正在尝试使用带有alpha-beta-pruning的negamax算法来解决完美信息零和游戏(如滴答声或国际象棋) 。目标是证明一名球员是否可以强制获胜或平局。这意味着没有深度限制,但算法总是评估游戏树,直到有赢/平局。
我花了数周时间优化我的代码以适应我的特定游戏,并将其缩短为几天的运行时间。但问题就在这里:
由于 alpha-beta 修剪,极小极大算法的运行时间是高度不可预测的。我不知道它会在接下来的 5 分钟内完成还是再运行 5 周,直到我真正模拟它为止。我希望能够预测剩余的运行时间,而不是偏离几个数量级。
到目前为止我尝试了什么
我正在记录所有子和子子分支的结果,最多5*子分支,以及我的机器模拟它们所花费的时间。然后我只是假设同一级别的职位需要相同的时间来评估并收工。这些预测有时会偏离10 倍或更多。
我还查看了记录的数据,看看我的假设是否成立。评估5* 子分支0.01s
所需的时间在180s
. 这就是为什么我的预测不正确的原因。谁会猜到。
我的问题
正如我想象的那样,这将适用于 minimax 的所有实现:
是否有更复杂的算法可以准确预测带有 alpha-beta-pruning 的 minimax-algorithm 的剩余运行时间?还是极小极大只是设计不可预测的?
如果是这样,它们是如何工作的?
python - 在 Python 中停止递归函数
我正在创建一个国际象棋引擎,并且在让它停止从其递归负极大(极小极大)框架中计算时遇到了一些麻烦。我希望它在给定的时间限制结束时返回迄今为止的最佳移动。这是我的代码的结构:
我遇到的问题是当 negamax 函数的时间到时停止并将 None 返回给 ai_make_move() 函数以便能够执行类似if not move: return best_move_so_far[-1]
. 或者立即将其返回到初始调用。
是否可以停止这样的递归调用?现在,如果我返回一些东西,它只会返回到先前的 negamax 调用等等,这将给出一个错误。
minimax - Minimax 和 Negamax 有什么区别?
我对这两个感到困惑。Negamax 只是对 minimax 的优化吗?还是 Negamax 是另一种搜索树算法?如果 negamax 是另一种搜索树算法,那么哪个更好?
c++ - (国际象棋)negamax 搜索缺少将死的问题
我正在使用带有alpha-beta pruning的Negamax在搜索功能中实现搜索算法。但是,它经常错过强制将死。
(注意: “X 中的伴侣”计算整个回合,而“深度”和“移动”依赖于半个移动。)
例子
具有以下 FEN 的位置:1k1r4/pp1b1R2/3q2pp/4p3/2B5/4Q3/PPP2B2/2K5 b - - 0 1
在 3 中具有 Mate(算法的深度为 5)。它是 Qd1+、Kxd1、Bg4+、Kc1/Ke1(没关系)、Rd1#。
它可以从 1 步远的地方发现将死,但在更高的深度会失败。
可能的原因
这可能是一个错字、误用type
,甚至是对方法的完全误解,因为所有这些都发生过。
简化代码
我已经使代码的某些部分更易于阅读。(例如 remove std::
,将多行转换为函数)。
虽然不应该改变功能。
根调用
搜索功能
扩展搜索
c++ - 如何通过在 negamax 算法(国际象棋)中添加多线程来提高搜索速度
我需要提高 negamax 算法的搜索速度,我看到 stockfish 已经使用多线程来做到这一点。
但是,当我尝试为当前节点的每个子节点生成一个线程时,由于线程的不断创建和销毁速度很慢,这会减慢搜索时间。
我已经有了 alpha beta pruning、transposition table、move ordering 等。
如何使用线程进一步提高 negamax 性能?
谢谢
python - Negamax 不适用于 Python 国际象棋引擎
我正在使用标准 Python 国际象棋库和一个非常简单的评估函数制作一个非常简单的 Python 国际象棋引擎;黑色总重量的总和(正)加上白色总重量的总和(负)。引擎始终显示为黑色。
我使用 Negamax Wikipedia 页面作为指导,深度是第四层。我不指望大师级的表现,但是引擎做出了非常可疑的举动,例如:白色的e2e4和f1c4导致引擎通过b7b5自由放弃它的棋子。
谁能帮我吗?我完全不知道我做错了什么。Negamax(称为搜索)和评估函数如下所示:
python - python国际象棋引擎的转置表
这是我上一篇文章的后续。该代码可以正常工作,并且可以计算下一个最佳移动。我一直在研究如何将转置表和排序移动到我的 negamax 函数中,以使其运行得更快、更准确,但对于像我这样的初学者来说,这似乎有些困难和先进。
你可以在这里找到我的代码。
在研究国际象棋编程维基时,我发现了一些转置表的示例代码:
我尝试进行一些修改以将其集成到我的代码中,但我没有从中得到任何结果。我还看到了一些关于使用 Zobrist 键存储位置的哈希键,但我不太了解它是如何工作的,所以我放弃了这个想法。目前有点卡在这些问题上,不知道下一步是什么。
chess - 国际象棋引擎 beta 截止使引擎的威胁性降低?
我对国际象棋编程很陌生,并且在搜索时遇到了问题。目前,我的引擎有一个简单的“标准”负最大搜索,具有基本的评估功能(纯材料计数,非位置)。
但结果是给定以下 FEN:
rnbqkbnr/1ppppppp/p7/7Q/4P3/8/PPPP1PPP/RNB1KBNR b KQkq -
黑不想g7g6
威胁女王。但是,如果我删除了 beta 截止值,它确实可以。据推测,它认为白色可能会移动皇后导致没有捕获,因此不是一个有利的位置(在检查中评估的分数等于 beta,而不是更大if score >= beta
)。
我假设评估功能可能与它有关,并且需要的不仅仅是材料数量,否则需要实施什么样的事情才能使引擎更具侵略性?