• 创建:2006-7-7
  • 文章:116
  • 评论:385
  • 访问:512494
  •  

2008-9-22 13:58 | 三维围棋模型

关键字:电脑围棋

受相对论启发,将三维空间加上时间维,变为四维时空。
最近发现标准的围棋是二维平面,如果加上时间维(着手次序),就可以把围棋变成一个3维的视图。


编辑 | 阅读全文(107) | 回复(1),babituo 发表于 2008-9-22 13:58
关键字:程序开发
UCT是怎么走对征子的呢?
我想,elife前辈的话一定是对的,否则,MC法不可能有目前的领先地位,一定是有某些地方我们还没有理解到位,出了差错。
关于我提出的问题,其实不仅仅是征子的问题,征子只是我用来说明问题的例子,我的问题是:一个导致必胜的着手,一定是在后续的各种任意下法中,胜率最高的着手吗?
我还不知道我的思路哪里出了问题,仅仅是相信elife的结论性判断,并不能立即帮助我解决我的算法问题,我还得继续找问题的原因。
先从正面理解一下:一个导致必胜的着手,一定会是在后续的各种任意下法中,胜率最高的着手,难道不是吗?
这里面可能有概念偷换问题:

一个我们看起来必胜的着手,尽管导致从它开始,直到取得最终胜利的路径,在最极端的情况下,可能只有唯一的1条,虽然和其他可能的行棋路经相比,这条路经 可能是万亿分之一的选择,也许考虑其他的所有路径确实会发现导致失败的路径数更多,但这种“最终导致胜利的路径的多少“和“模拟下棋得到胜利次数的多少” 也许并不是同一个概念。如果我们偷换了这两个概念,就会得到象我之前得到的那种令人疑惑的结果。

为什么这么说?
MC法确实是在已经生成的博弈树上当前结点的所有后续结点中,选择胜率最高的结点为生成着手来决定下一步棋走在哪里的,这容易使我们理解为决定下一着手的唯一依据,就是最高胜率的子结点是谁?你一定会问,难道不是吗?

当然是的,但是,我们有没有想过,一个结点可能发展的后续子子孙孙的结点是个天文数字,凭什么就让某些结点出现在博弈树上,而其他结点就要无情地被"冷落 "呢?(严格地说,UCT算法不是在剪枝,而是在冷落或培植相关的枝),这个"凭什么"的理由,不是比"子结点胜率"更优先的决定着手选择的理由吗?如果 你是一个仅仅在理论上存在的结点,但没有在博弈树上得到"定点"培养的机会,那么,你就压根不可能出现在博弈树上,虽然理论上有很多路会经过你,而且从你 之后也有很多路可走,但这些只是"可能存在的路"而已,对"实际发生的胜率"有什么影响呢?没有任何影响.
而只有那些已经出现在博弈树上的后续结点和未来实际出现在博弈树上的后续结点,才可能对子结点的胜率产生影响.

后续子结点是如何产生的以及其胜率是如何得到计算的,才是决定后续着手的关键原因.这些工作是在下类似17000盘这么个数量巨大的模拟对局的过程中完成的.对这个过程,我原先有这么个误解:认为在模拟对局中,每走一步棋,都会试图在博弈树上去添加新的结点(只要这步棋对应的结点还没有出现在博弈树上),这个误解是致命的,Dlgo曾经成功地启发我走出了这个误解.

实际上,只有在模拟对局中,遇到了某个已经建立的而且访问过[已选择过这个结点进行过一次脱离博弈树的随机对局(所有结点的第一次访问一定是这样发生的)]的"端"结点(没有子结点,但模拟对局还没有终止)的时候,才会去为这个端结点,建立一层后续的子结点,在这层新建的子结点中,随机选择一个结点(这个结点就发生了首次被访问的事件)作为继续前进的路径后,随后的随机对局过程就不再博弈树上进行了,也不再影响博弈树了,只有最终输赢的结果会影响已经走过的路径上的结点的胜率.
因为生成一个着手,要从生成前的博弈树上的结点开始,模拟下17000多盘棋,所以,在

下过前面的具有"开闯新路"性质(为博弈树某个结点新增一层子结点)的一局棋后(开路后那局棋就转到随机对局中去了),后续的模拟对局,开始就会沿着前面对局已经开辟的道路选择前进的方向了,这时候的选择,就不完全是随机选择了,而是根据经过调整的前面累积得到的胜率数(UCT值)来选择了,所以,第二个要搞清楚的概念区别是:模拟对局随机对局不是一回事,随机对局模拟对局的一部分,是在模拟对局遇到"端结点"之后独立于博弈树所进行的部分.
而每一次进行的模拟对局都会返回谁胜谁负的结果,这个结果,就会影响对局过程在博弈树上经历过的结点的被访问次数和取胜次数,从而影响各层结点的胜率.
等到1700盘模拟对局全部结束后,这时候,就只要简单地选择下一个胜率最高的着手作为应对着手了,随后等待对手下棋,对手下的棋一定会出现在博弈树上, 而且一定会被访问过(为什么?有问的我包回答,暂时不展开分析),所以,再下一步生成着手的时候,只要找到和对手下的上一步棋对应的结点就可以了.

搞清楚了博弈树产生的过程和胜率的来由后,再来看原来的问题,就好理解了.用一个比喻来理解可能会更形象.比如:
假设两个天老爷举行下雨比赛,他们能下的雨有两种,一种金雨,很贵,很少;一种普通雨,很多,很便宜。谁能把他的金子雨最先全流到大海,就算谁赢,那么, 聪明一点的老天爷就会想到,他应该在下这每粒滴金雨之前,下很多的普通雨,探明最好的河该怎么流,那么,聪明的老天应该把这很多的普通雨更多地撒向什么地 方呢?
刚开始,地上没有河,老天只好乱下普通雨,后来出现一段河流,也是先前下的雨流出来的,所以,后面下的雨就尽量靠近已经产生的河,就更好,但也不能全下在 原来的河里面,因为,没准还有更近更快的河道还没有被发现,所以要调整下雨的地点,尽量靠近河,但也要照顾河边从来没有下过雨的地方,让那些地方也可以尝 试流一流水,如果成功,那些地方今后自然能成为主流。等这段河到了头,比赛还没有结束的话,老天爷就只好又往后乱下一阵雨了,直到已经发现最好的河床,就 把下一颗金雨,下进这个河床,最终找到大海为止。

所以,虽然地上可能存在的河床路径的数量是个天文数字,老天爷不一定要把整个地面都变成河流,才能取得胜利,聪明一点的老天,总是一边选择走最好的河床, 一边选择靠近原来的最好的河床去探索新的河床,如果地面上确实存在一个地势最低,最直通往大海的河床,这个河床迟早会被聪明的老天发现,然后,越流河越 宽,而其他可能的河床,自然就被冷落了。

导致全局必胜的少有的着手路径,比如关键征子,就是这样的好"河床",最终会被很快地自然发现的.
编辑 | 阅读全文(614) | 回复(4),babituo 发表于 2008-4-3 16:27
关键字:程序开发
电脑围棋模型中的美

许多“人性化”的科幻作家,在作品中把电脑想象为一个冰冷的计算机器,复杂的数学计算公式,没有灵性的,只懂得按指令机械执行的软硬件综合体。
事实不是这样的,事实是:电脑是人脑的自然延伸,人脑终究会让电脑具有“灵性”的。

我经过短暂时间的对CGO的学习,已经感受到电脑围棋模型中的“美”的存在了。
这种美,也只有在建模中才能体会到,在纯粹的算法设计中是体会不到的。

我看到了电脑围棋模型中,层次化升级的美,那种从碳氢氧原子开始,逐层建立起人类生命体的美。

低层次的系统,会凸现其组成事物所不具备的特征,这些特征又参与更高层次系统的构建,更高层次又有新的凸现,这就是层次化升级的美。


一盘围棋,就像一个生态系统的繁衍升级。
盘古开天地,得到一个空的棋盘。
最初落下一颗黑子,得到一颗正原子,再下一颗白子,得到一个反原子。
从单个的棋子开始,就已经开始了子力的互动,这是最底层的活动。
棋子相互连接,形成棋串,棋串的互动建立在棋子互动基础之上,却又超越了棋子的能力,开始出现纠缠互动。
棋串相互耦合,形成棋块,棋块的互动建立在棋串互动的基础之上,却又超越了棋串的能力,开始出现联合互动。
棋块相互呼应,若即若离,形成棋群,棋群的互动建立在棋块互动的基础之上,却又超越了棋块的能力,开始出现整体互动。
围棋的这种互动,给宇宙的企图主宰者的命运提供了两种最终选择的启示:
1.想独霸天下者,最终必将因自身能力不够而分崩离析;
2.追求和谐者,最终会求得只需要微弱优势的动态平衡;

对围棋,这个虚拟的小宇宙建立一个这样的唯美模型也许并不难,难的是对我们这个真实的大宇宙,能否建立和实现这样唯美模型,只有天知道。
编辑 | 阅读全文(462) | 回复(1),babituo 发表于 2008-4-2 11:8

我的围棋程序正式命名为:“和·绿”-和谐&墨绿。

和谐,天地大同,乃围棋精要。我的围棋程序将彻底贯彻这个精要,人是做不到的,程序则可以,所以,我的程序一定会战胜人的。

"墨绿","深蓝"的兄弟,受启发于澳洲某哥们的围棋科幻小说,我的电脑围棋思路还真的和这哥们的科幻思路有相似之处,不过,到我手上已经不是科幻了,到时一定找到这哥们庆祝一下。

编辑 | 阅读全文(191) | 回复(0),babituo 发表于 2008-2-25 12:42
关键字:UML GNU Go

图1。do-gnmove顶层活动



图2.生成正常对局着手活动



图3.查找棋盘信息活动图

图4.有棋子处理内部活动图

图5.无棋子处理内部活动图

编辑 | 阅读全文(881) | 回复(0),babituo 发表于 2008-1-25 10:7
关键字:电脑围棋 UML GNU GO
下述活动图粗略阐释了"获取棋盘信息"用例的内部活动过程.该过程按顺序执行如下操作:
1.识别棋串,2.分析棋串,3.制作势力平衡图,3.棋块分析,4.确定棋块的强弱,5.重估势力范围,6.评估打入影响.
每个活动内部还有详细的执行步骤,将在用例实现中详细叙述.
经过这一系列的操作,棋盘上的棋子分布信息被识别和计算出来,GNU Go的内核基本上象棋手一样,能够"看懂"围棋局势了.

参考信息来源:
http://www.computergo.net/forum/viewthread.php?tid=724&extra=page%3D1

主要参考内容:
第4节,信息获取
......
编辑 | 阅读全文(838) | 回复(0),babituo 发表于 2008-1-16 10:55
GNU GO就不介绍了.
它的内核(引擎)主要做下面四件有价值的事:1.获取棋旁信息,2.生成备选着手,3.备选着手估值,4.输出最佳着手.
四件事按顺序向前依赖,后一件事依赖前一件事的结果进行工作,最终向GNU界面系统提供最佳着手.

原始参考资料来源:
http://www.computergo.net/forum/viewthread.php?tid=724&extra=page%3D1
主要参考内容摘录:
" GNU Go的第一阶段是尝试尽可能读懂当前的棋盘局面,利用在这第一阶段获取的信息,加上着手生成器可以生成一个备选着手列表;最后对每个备选着手根据实地价值(包括吃子或死活影响)和可能的战略影响(如加强弱棋)估值。 "

模型更正
在试图对原用例模型进行用例阐释的时候,经过直接分析源代码,发现整个着手生成的过程虽然可以分成几个阶段进行,但几个阶段都是围绕一个目标:最终得到最佳的着手来进行的,在执行过程中,不存在中间的和界面系统的交互行为,只有执行着手生成的开始和结束作为调用接口和执行返回和街面系统存在交互。
所以,原来的用例模型把着手生成划分为四个用例是不恰当的。特此更正用例模型。
编辑 | 阅读全文(682) | 回复(0),babituo 发表于 2008-1-16 9:56

第一个模型图
电脑围棋人机对弈程序的核心是着手生成器,用来根据当前局势产生下一手棋下在何处。
一个着手生成器包含一个分块器,一个棋块安全性计算器和一个着手效率计算器,也就是说,围棋着手主要依据下一步棋将产生怎样的棋块?其块的安全性如何?着手效率高低几个指标进行评估,找到评估最优的着手作为下一手。

以上模型和分析依据是遵照在网上找到的下述资料进行的:

附件:
“手谈”的编程技术 
  “手谈”的走棋主要决定于静态评价。直至1994年的早期版本,   走棋选点没有用到搜索法。1995年试把搜索法用于走棋选点,   但棋力未见提高。近年虽有些提高,   搜索法的作用还是不能满意的。最近我做了一个选点不用搜索的“手谈”版本。它在与有选点搜索法的版本对弈时似乎差些,   但对其他程序时显得与有选点搜索法的版本一样强。   
  
  “手谈”的棋力主要依靠静态评价的精细计算。关键是棋子分块和块安全性的估计。   
  
  棋子的分块 
  “手谈”的棋子分块与陈克训提出的相似,   首先决定于棋子的“影响”,   再辅之以某些连接模式。   
  **影响 
  “手谈”的影响函数与陈克训的明显不同。一个正常白子的影响是:   
  对其邻位为   4;   
  对其斜邻位为   3;   
  对其关位和小飞位为   2;   
  比关和小飞稍远的某些位置,影响为   1。   
  黑子辐射出负数的影响。   
  死子辐射出反号的影响。半死或受伤的棋子辐射出较少的影响。   
  
  多个棋子对一个点的影响可以叠加,但非线性叠加。例如,某点若同时与黑子和白子相邻,则其值为0,不问有多少个黑子和白子。若某点影响的代数和为   1   或   -1,   则取为   0   (保留   1|-1   表示假眼位)。若影响值大于   2,   则先作为白方的全控制点,   再作圆滑处理(见下);   若影响值小于-2,   则先作为黑方的全控制点再作圆滑处理。黑|白全控制点取值   6|-6。   
  
  影响的单位称为小点(dot)。   
  
  圆滑处理方案包括如下规则:   
  
  与0或负影响相邻的点,不得超过3小点;   
  与1或2小点相邻的点,不得超过5小点;   
  负值(黑影响)有类似的规则;   
  1|-1小点代表白|黑假眼位。   
  **块的构成 
  相互邻接的白非死子、黑死子、以及   1   或超过   3   小点的空点合并成一白块;   邻近的、相互不能分割的白块再合成一白块。黑块亦按类似的方法构成。   
  块危险性估算 
  块危险性可表为有适当单位的一个量。围棋中常用于形势判断的单位为目。块危险性也可以用目为单位。   
  
  块危险性的因素为:1.   不足两眼,   2.   没有足够的自由度。作定量估算时,   还要计及块的大小。因此,   块危险值应为3个自变量的函数:欠眼数、自由度、大小。函数的具体形式应经验地确定,并可在调整时改变。   
  
  **自由度 
  陈克训把自由度解释为块周围的敞开程度。   
  块的自由度可表为封锁它所需的手数。业已探明,有关的函数应为指数型的:封锁手数每增1,块危险值应减半。   
  
  然而,封锁手数恐怕不容易由程序计算。这就有必要设计适当的方案来计算自由度,以代替封锁手数。   
  
  “手谈”有两个自由度方案。   
  
  早期方案:自由度由与块(棋子或空点)的邻位和斜邻位计算。   
  
  第二方案:自由度由属于块的棋子的关位和小飞位计算。   
  
  第二方案视野较广,似较合理。然而围棋编程中,模糊的估算常会有某些优越性,故第一方案在某些情况下会较合适,并使棋走得更好。“手谈”的近年版本计算越来越精细,就需要更精细的自由度第二方案。   
  
  近年还用过一个第三方案,但已发现它有错误。修正了的方案已用于另一程序“弈侣”的新版本。   
  
  模式与效率 
  “手谈”棋力的另一关键是进子价值的效率修改。好着点(急所、手筋等)设为正效率,而坏着点(愚形、俗手等)设为负效率。   
  进子价值被乘以一个因子:正效率对应的因子大于1,负效率对应的因子小于1。   
  
  效率主要由模式识别来赋值。不过“手谈”用了笨拙的模式识别方法:只用指令来处理而没有用模式库。这就使模式难以修改补充,只能包括少量模式。   
  
  模式的大小是不固定的,但不超过下列范围:   
  
                  ... 
                ..... 
              ....... 
              ...*... 
              ....... 
                ..... 
                  ... 
  
  
  这份材料由“手谈”的作者陈志行提供。 
  1999-03-14
编辑 | 阅读全文(839) | 回复(0),babituo 发表于 2008-1-14 10:49
(共 8 条) 上一页 1 下一页

仅列出标题