问题标签 [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.

0 投票
0 回答
189 浏览

python - 在 Negamax 算法中设置最佳移动的问题

嘿,我正在尝试制作一个国际象棋引擎,但是当我运行它运行良好的代码时,问题是有时它没有设置最佳移动并且它显示错误,因为搜索没有返回一个移动来玩。我的 negamax 包括 AB pruning、MD Pruning、QSearch、ID 和 TT 表。这是我的实现。

您可能已经注意到我并没有按应有的方式否定每回合的得分。原因是因为当您调用 move 函数时,它会返回分数已经被否定的位置。例如,

它不是移动生成,因为它返回每个位置状态的正确移动。最佳值是 -INFINITY 和 negamax,它应该始终设置最佳移动。任何帮助都会有所帮助。

0 投票
1 回答
82 浏览

algorithm - 使用 alpha-beta-pruning 预测 minimax 算法的剩余运行时间

问题

我正在尝试使用带有alpha-beta-pruning的negamax算法来解决完美信息零和游戏(如滴答声或国际象棋) 。目标是证明一名球员是否可以强制获胜或平局。这意味着没有深度限制,但算法总是评估游戏树,直到有赢/平局。

我花了数周时间优化我的代码以适应我的特定游戏,并将其缩短为几天的运行时间。但问题就在这里:

由于 alpha-beta 修剪,极小极大算法的运行时间是高度不可预测的。我不知道它会在接下来的 5 分钟内完成还是再运行 5 周,直到我真正模拟它为止。我希望能够预测剩余的运行时间,而不是偏离几个数量级。

到目前为止我尝试了什么

我正在记录所有和子子分支的结果,最多5*子分支,以及我的机器模拟它们所花费的时间。然后我只是假设同一级别的职位需要相同的时间来评估并收工。这些预测有时会偏离10 倍或更多

我还查看了记录的数据,看看我的假设是否成立。评估5* 子分支0.01s所需的时间在180s. 这就是为什么我的预测不正确的原因。谁会猜到。

我的问题

正如我想象的那样,这将适用于 minimax 的所有实现:

  1. 是否有更复杂的算法可以准确预测带有 alpha-beta-pruning 的 minimax-algorithm 的剩余运行时间?还是极小极大只是设计不可预测的?

  2. 如果是这样,它们是如何工作的?

0 投票
2 回答
215 浏览

python - 在 Python 中停止递归函数

我正在创建一个国际象棋引擎,并且在让它停止从其递归负极大(极小极大)框架中计算时遇到了一些麻烦。我希望它在给定的时间限制结束时返回迄今为止的最佳移动。这是我的代码的结构:

我遇到的问题是当 negamax 函数的时间到时停止并将 None 返回给 ai_make_move() 函数以便能够执行类似if not move: return best_move_so_far[-1]. 或者立即将其返回到初始调用。

是否可以停止这样的递归调用?现在,如果我返回一些东西,它只会返回到先前的 negamax 调用等等,这将给出一个错误。

0 投票
1 回答
1475 浏览

minimax - Minimax 和 Negamax 有什么区别?

我对这两个感到困惑。Negamax 只是对 minimax 的优化吗?还是 Negamax 是另一种搜索树算法?如果 negamax 是另一种搜索树算法,那么哪个更好?

0 投票
1 回答
128 浏览

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::,将多行转换为函数)。
虽然不应该改变功能。

根调用

搜索功能

扩展搜索

0 投票
0 回答
83 浏览

c++ - 如何通过在 negamax 算法(国际象棋)中添加多线程来提高搜索速度

我需要提高 negamax 算法的搜索速度,我看到 stockfish 已经使用多线程来做到这一点。

但是,当我尝试为当前节点的每个子节点生成一个线程时,由于线程的不断创建和销毁速度很慢,这会减慢搜索时间。

我已经有了 alpha beta pruning、transposition table、move ordering 等。

如何使用线程进一步提高 negamax 性能?

谢谢

0 投票
1 回答
103 浏览

rust - 我的 Negamax 实施有问题吗?

我正在尝试为我的国际象棋引擎在 Rust 中编写一个简单的负最大算法。我有一个非常简单的评估函数:

这是我的 negamax 实现:

其中很多来自 Negamax 算法的 Wikipedia 伪代码。然而,在深度 5 的以下位置中,为白色生成的最佳着法是 Nxd3,此时应该是 Nb7 来分叉皇后和国王,然后在下一步行动中捕获皇后(是的,我的移动生成器确实考虑了叉子)。

有问题的立场

我感觉我的 Negamax 实现有问题,但是我不知道在哪里。

0 投票
1 回答
82 浏览

python - Negamax 不适用于 Python 国际象棋引擎

我正在使用标准 Python 国际象棋库和一个非常简单的评估函数制作一个非常简单的 Python 国际象棋引擎;黑色总重量的总和(正)加上白色总重量的总和(负)。引擎始终显示为黑色。

我使用 Negamax Wikipedia 页面作为指导,深度是第四层。我不指望大师级的表现,但是引擎做出了非常可疑的举动,例如:白色的e2e4和f1c4导致引擎通过b7b5自由放弃它的棋子。

谁能帮我吗?我完全不知道我做错了什么。Negamax(称为搜索)和评估函数如下所示:

0 投票
1 回答
189 浏览

python - python国际象棋引擎的转置表

这是我上一篇文章的后续。该代码可以正常工作,并且可以计算下一个最佳移动。我一直在研究如何将转置表和排序移动到我的 negamax 函数中,以使其运行得更快、更准确,但对于像我这样的初学者来说,这似乎有些困难和先进。

你可以在这里找到我的代码。

在研究国际象棋编程维基时,我发现了一些转置表的示例代码:

我尝试进行一些修改以将其集成到我的代码中,但我没有从中得到任何结果。我还看到了一些关于使用 Zobrist 键存储位置的哈希键,但我不太了解它是如何工作的,所以我放弃了这个想法。目前有点卡在这些问题上,不知道下一步是什么。

0 投票
1 回答
28 浏览

chess - 国际象棋引擎 beta 截止使引擎的威胁性降低?

我对国际象棋编程很陌生,并且在搜索时遇到了问题。目前,我的引擎有一个简单的“标准”负最大搜索,具有基本的评估功能(纯材料计数,非位置)。

但结果是给定以下 FEN:

rnbqkbnr/1ppppppp/p7/7Q/4P3/8/PPPP1PPP/RNB1KBNR b KQkq -

黑不想g7g6威胁女王。但是,如果我删除了 beta 截止值,它确实可以。据推测,它认为白色可能会移动皇后导致没有捕获,因此不是一个有利的位置(在检查中评估的分数等于 beta,而不是更大if score >= beta)。

我假设评估功能可能与它有关,并且需要的不仅仅是材料数量,否则需要实施什么样的事情才能使引擎更具侵略性?