当前位置: 首页 > 知识库问答 >
问题:

换位表会导致搜索不稳定吗

谭琛
2023-03-14

我正在编写一个国际象棋引擎,最近添加了一个换位表。

在运行一些测试时,我发现尽管搜索仍然返回相同的最佳移动,但移动的值(对最大化玩家来说有多好)是波动的。

这是换位表的正常行为吗?我记得读到转位表会导致搜索不稳定。这是这个意思吗?那么这是我的代码中的正常现象还是严重的错误?

共有2个答案

曹波鸿
2023-03-14

这是换位表的正常行为吗?我记得读过换位表会导致搜索不稳定。这是什么意思吗?

那么这是我代码中的正常现象还是严重错误呢?

乔纳森·谢弗的建议(在“攻击计划”下):

如果您最初将TT查找限制为仅在表深度与您需要的深度完全匹配时才有效,那么TT将不会改变固定深度alpha-beta搜索的结果。然而,它应该减少搜索的节点数量。验证这是否正常工作。

添加迭代深化和移动排序。如果你做得对,它不应该改变搜索的最终结果,但同样,它应该减少搜索的节点数。

只有当你确信以上所有内容都是100%有效的时候,你才应该继续进行更多的搜索增强和更好的评估功能。

邬宏扬
2023-03-14

是的,换位表引入了搜索不稳定性。

幸运的是,它很少发生,以至于换位表的优势远远超过了这种复杂性。

1.换位表的功能是什么?

在向程序中添加转置表(TT)后,您应该注意到两个主要区别:

  1. 改进移动顺序:从 TT 移动通常是最好的移动
  2. 提前截止:当您再次到达已经搜索更远距离的位置时,您可以停止并使用存储在 TT 条目中的值

在国际象棋中,改进的移动顺序是最重要的因素。只有在终局中,换位的可能性增加了,你会看到更多的早期截止。

那么,搜索不稳定意味着什么?这意味着当您搜索具有给定距离的一个位置,然后重复相同的搜索(相同的位置,相同的距离)时,您将获得相同的结果。

2. 简单的最小值/阿尔法贝塔搜索算法

让我们首先忽略搜索扩展,从简单的最小最大值或 alpha-beta 搜索开始。

请注意,您的搜索将具有搜索可重复的属性,并且不会看到搜索不稳定。即使您通过从换位表移动来改进移动顺序,您仍然会在每次搜索中获得相同的结果。但是,在添加TT之后,来自更深入搜索的额外截止通常会破坏该属性并引入不稳定性。

例如,考虑一个包含深度策略的头寸:

    距离较
  • 短的搜索可能看不到它,但距离较远的搜索会看到它。
  • 将该结果存储在TT中后,低距离的重新搜索也将看到该策略。与原始搜索相比,它现在的行为有所不同。
  • 更糟糕的是,当TT条目被覆盖时,改进的知识再次获得很多。

因此,利用额外的知识来迫使早期截止是导致不稳定的一个因素。(但在实践中,这是值得的,因为这更多的是一个理论问题。)

3.搜索扩展

当应用于简单的alpha beta搜索时,改进的移动排序本身不会导致搜索不稳定。在实现许多扩展的现实世界搜索算法中,情况更加复杂。其中一些扩展对移动排序也很敏感。

一个突出的例子是所谓的后期移动减少(LMR)。它利用了这样一个事实,即走法排序的质量通常很高,只有前几个走法需要彻底搜索,而其他的走法很可能是不好的走法,只需以减小的距离进行搜索。

LMR只是移动排序使搜索不那么可重复的一个例子。但是,优势再次占据主导地位。

4.多少搜索不稳定是正常的?

没有明确的答案。在实践中,你不能完全消除不稳定性,但如果不稳定性失去控制,你的搜索将变得低效。

当然,错误也可能是不稳定背后的原因。那么,它是您搜索中的错误吗?嗯,我不知道。可能是。:-)

 类似资料:
  • 问题内容: 我有一个经典的Java EE系统,具有JSF的Web层,用于BL的EJB 3和用于对DB2数据库进行数据访问的Hibernate 3。我在以下情况下苦苦挣扎:用户将启动一个过程,该过程涉及从数据库中检索大型数据集。检索过程花费一些时间,因此用户不会立即收到响应,变得不耐烦,并打开新的浏览器并再次启动检索,有时是多次。EJB容器显然没有意识到第一次检索不再相关的事实,并且当数据库返回结果

  • 我正在尝试为我的portlet创建一个搜索表单。portlet是一个地址簿应用程序,所有dao和服务都是使用service builder构建的。我想为用户提供一个基本/高级搜索表单(与liferay上的其他表单一样,例如control center中的“用户和组织”)。 我已经实现了所有的逻辑和页面,查看了Lifeay源代码(6.1 GA1),但搜索表单没有以任何方式显示,我将把代码放在这里。

  • 问题内容: 我需要不时动态地更改表和变量,因此我编写了这样的python方法: 但是,这导致语法错误异常。我尝试对其进行调试,因此我将变量打印在方法中,然后手动将其填充,并且可以正常工作。所以我不确定我在做什么错? 是因为我尝试使用表的替代品吗? 另外,我该如何调试mysqldb以便将替换查询打印为字符串? 问题答案: DB API中的参数替换仅适用于值-不适用于表或字段。您将需要使用普通的字符串

  • 我试图在laravel应用程序中设置本地化,但我的中间件似乎导致了一个错误。该网站将每个地区略有不同,我使用laravel文件来交换电话号码等。这工作正常。当我改变我的语言环境时,我从lang文件中得到正确的数字。当我有中间件来检查cookie是否已设置为设置也工作的语言环境时。 我还可以使用中间件忘记本地化路由上的前缀,这样我就不必用locale参数更新我的方法。 我的问题是设置一个url前缀,

  • 在我开始这看似很长的一段之前,我想对我可能收到的任何建议/建议表示感谢。朱约翰 我开发了一个简单的测试来帮助我理解spring的声明性(@Transactional)事务管理框架如何与spring的RESTful web服务结合使用。 为此,我开发了以下RESTful控制器: 其中,“tester”是以下服务类的bean,并自动连接到此控制器。类中唯一的方法是事务性的: 在上面,GenericDB

  • 类似于这里的问题。我的测试不稳定。尝试并捕获解决方案在这里不起作用。有解决这个问题的最佳实践吗?