我正在编写一个国际象棋引擎,最近添加了一个换位表。
在运行一些测试时,我发现虽然搜索仍然返回相同的最佳着法,但着法的值(value)(对最大化玩家的好处)波动了。
这是换位表的正常行为吗?我记得读过一个转置表会导致搜索不稳定。这是什么意思?那么这是我的代码中的正常现象还是严重错误?
最佳答案
是的,换位表引入了搜索不稳定性。
幸运的是,这种情况很少发生,换位表的优势远远超过了它的复杂性。
<强>1。转置表的作用是什么?
在您的程序中添加换位表 (TT) 后,您应该注意到两个主要区别:
在国际象棋中,改进的移动顺序是最重要的因素。仅在残局中,换位的可能性增加,您会看到更多的早期截断。
那么,搜索不稳定意味着什么?这意味着当您搜索具有给定距离的一个位置并稍后重复相同的搜索(相同位置,相同距离)时,您将得到相同的结果。
<强>2。简单的 minimax/alpha beta 搜索算法
让我们首先忽略搜索扩展并从简单的极小极大或 alpha-beta 搜索开始。
请注意,您的搜索将具有搜索可重复的属性,并且不会发现搜索不稳定。即使您通过换位表中的移动改进了您的移动顺序,您仍然会在每次搜索中得到相同的结果。然而,在添加 TT 之后,来自更深层次搜索的额外中断通常会破坏该属性并引入不稳定性。
例如,考虑一个包含深层策略的职位:
因此,使用额外的知识来强制提前中断是导致不稳定的一个因素。 (但在实践中,这是值得的,因为它更像是一个理论问题。)
<强>3。搜索扩展
当应用于简单的 alpha beta 搜索时,改进的移动顺序本身不会导致搜索不稳定。在实现许多扩展的现实世界搜索算法中,情况更为复杂。其中一些扩展也对移动顺序敏感。
一个突出的例子叫做 Late Move Reduction (LMR) .它利用了这样一个事实,即移动排序的质量通常非常高,以至于只有前几个移动必须彻底搜索,而其他移动很可能是坏的,只会以更短的距离进行搜索。
LMR 只是移动顺序降低搜索可重复性的一个示例。但同样,优势占主导地位。
<强>4。多少搜索不稳定是正常的?
没有明确的答案。在实践中,您无法完全消除不稳定性,但如果不稳定性失控,您的搜索将变得低效。
当然,错误也可能是不稳定的原因。那么,这是您搜索中的错误吗?嗯,我不知道。可能。 :-)
强>强>强>强>关于c++ - 换位表会不会导致搜索不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27606175/
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我在我的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服务器更新战俘
我使用的是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上找到一个类
我使用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
如何将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.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是rubygems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和rubygems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko
我有很多这样的文档: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+)/