jjzjj

c++ - 换位表会不会导致搜索不稳定

coder 2024-02-03 原文

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

在运行一些测试时,我发现虽然搜索仍然返回相同的最佳着法,但着法的值(value)(对最大化玩家的好处)波动了。

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

最佳答案

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

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

<强>1。转置表的作用是什么?

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

  1. 改善着法顺序:从 TT 开始的着法通常是可能的最佳着法
  2. Early cutoffs:当你再次到达一个已经搜索过更远距离的位置时,你可以停止并使用存储在 TT 条目中的值

在国际象棋中,改进的移动顺序是最重要的因素。仅在残局中,换位的可能性增加,您会看到更多的早期截断。

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

<强>2。简单的 minimax/alpha beta 搜索算法

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

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

例如,考虑一个包含深层策略的职位:

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

因此,使用额外的知识来强制提前中断是导致不稳定的一个因素。 (但在实践中,这是值得的,因为它更像是一个理论问题。)

<强>3。搜索扩展

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

一个突出的例子叫做 Late Move Reduction (LMR) .它利用了这样一个事实,即移动排序的质量通常非常高,以至于只有前几个移动必须彻底搜索,而其他移动很可能是坏的,只会以更短的距离进行搜索。

LMR 只是移动顺序降低搜索可重复性的一个示例。但同样,优势占主导地位。

<强>4。多少搜索不稳定是正常的?

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

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

关于c++ - 换位表会不会导致搜索不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27606175/

有关c++ - 换位表会不会导致搜索不稳定的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  5. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  6. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  9. ruby - 如何搜索有用的 ruby - 2

    寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是ruby​​gems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和ruby​​gems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko

  10. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

随机推荐