关于黑白棋2013.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于黑白棋2013

这篇文档讲述了黑白棋程序设计中的主要原理和思想以及几个不太容易理解的点。 学问须合乎自己的兴趣,方可得益。————莎士比亚 对于自己没有半点兴趣甚至十分厌恶但是又不得不做的事情,我深有感触,比如高中时代的化学,还有现在的考试,我知道有些小伙伴对这些东西没有一丝一毫的兴趣,也不想有兴趣,并且他们自己还有更重要且更有意义的事情要做,我想自己在代码方面也帮不了他们什么忙了,或许这样的文档对有些人还是有作用的,因为老师问的更多的是原理方面的东西以及你自己的感受,如果他们看了这个文档并有所收获,并且能腾出时间做他们真正想做的事情,我想我的时间也就没有白费了。 写得比较简单,学霸们看了不要笑,如果有错误,请告知我。 先给一个定义:零和博弈,又称零和游戏或零和赛局,与非零和博弈相对,是博弈论的一个概念,属非合作博弈。零和博弈表示所有博弈方的利益之和为零或一个常数,即一方有所得,其他方必有所失。在零和博弈中,博弈各方是不合作的。非零和博弈表示在不同策略组合下各博弈方的得益之和是不确定的变量,故又称之为变和博弈。如果某些战略的选取可以使各方利益之和变大,同时又能使各方的利益得到增加,那么,就可能出现参加方相互合作的局面。因此,非零和博弈中,博弈各方存在合作的可能性。国际经济中许多问题都属于非零和博弈问题,即国际经济中各方的利益并不是必然相互冲突的。也可以说,自己的幸福是建立在他人的痛苦之上的,二者的大小完全相等,因而双方都想尽一切办法以实现“损人利己”。零和博弈的例子有赌博、期货和选举等。(摘自维基百科) Input:现在轮到电脑着子,它想以当前局面为起点进行一定深度的搜索,从而得出一个最佳着法,输入两个参数:board,当前的棋盘局面,depth,以当前局面为基准指定的搜索深度。 Output:返回一个最佳的着法,这个是根节点的若干个子节点之一,因为不管搜索多少层,你当前能走的只有一步。 1,因为当前局面是电脑走,电脑不是傻子,所以它要走对自己最有利的一步,也就是评估值最大的一步,为了找出最大值,事先定义一个比较大小的基准best_val并赋值负无穷大,后面找到的评估值,只要比best_val大,就更新它。 2,这是一个循环,说得准确点,就是一个遍历,move是当前这个局面可以着子的着法集合,在博弈论上又叫策略集,所以实现时,大部分都是从第1个格子到第64个格子进行试探,每试探一个格子都要判断一下,这个格子我(电脑)能下吗? 3,一旦遍历到可以下的格子, 我(电脑)就在后台把棋子下到这个格子上,并改变可以吃掉的棋子,当然只有后台这样做了,我们并不能在屏幕上看见这种变化,大家想想,棋盘状态这个时候已经改变了,如果下次要搜索同一层的兄弟结点怎么办,所以makemove之前应该保存棋盘状态,以供下次搜索兄弟结点时再还原,注意makemove过后接下来的board就改变了。 4,终于找到一个格子可以下,我(电脑)把棋子下好,这个时候该人类下棋了,人类也不傻,人类要下一个位置并且使我(电脑)的收益最差,因为评估函数是一直相对于电脑来讲的,所以人类走极小过程,这个极小是相对于我(电脑)来讲的,根据零和博弈定义,人类自己其实也是在争取自己的最大收益,注意,深度已经少了一层。 5,这个子节点的搜索(注意是递归的)已经大功告成了,我(电脑)要试探另外的子节点了,当然我要还原到根节点的状态。 6,7,8,因为根节点是max结点,所以如果某个子节点回溯上来的评估值val比当前的最佳评估值best_val大,那我就更新一下best_val,并且把达到这个子节点的着子位置也记下来,因为我们需要的就是位置。 9,全部搜索完成,返回最后留下来的best_move,这个就是最佳着子位置。 说明:已经讲过的相同代码就省略了。 2,3,深度是逐层递减的,如果深度为0,说明已经到了叶子节点,到了叶子几点就调用评估函数对这种叶子局面进行评估。 4,5,6,7,如果我(电脑)不能走,并且人类也不能走,那么这种局面就是一种游戏结束的局面,这也是一种叶子结点,返回评估值。 8,9,如果我(电脑)不能走,但是人类可以走,那我就应该等待一次,让人类走,人类走的话,当然又是一个极小过程,注意这里的depth没有改变,应为这个depth就是函数参数传递进来的depth,前面的几行语句的意思就是:不好意思,我刚刚以为这是一个max过程,但是我现在才发现,这是一个min过程,我重新再走。所以depth当然不用改变。 10,11,12,13,14,15,如果我(电脑)能走,对同一层的子节点进行极小过程,把回溯上来的评估值进行比较,因为当前是极大过程,我们取最大值。 这个和Max过程相似。 我们看了上面的minmax过程来回进行min和max过程,是不是很二逼?但是这是计算机

文档评论(0)

kaiss + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档