c语言编简单博弈小游戏,[2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏.doc...

[2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏

实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏

一、实验目的与要求

(1)了解极大极小算法的原理和使用方法,并学会用α-β剪枝来提高算法的效率。

(2)使用C语言平台,编写一个智能井字棋游戏。

(3)结合极大极小算法的使用方法和α-β剪枝,让机器与人对弈时不但有智能的特征,而且计算的效率也比较高。

二、实验原理

一字棋游戏是一个流传已久的传统游戏。游戏由两个人轮流来下,分别用“X”和“O”来代替自身的棋子。棋盘分9个格,双方可以在轮到自己下的时候,可以用棋子占领其中一个空的格子。如果双方中有一方的棋子可以连成一条直线,则这一方判胜,对方判负。当所有的格子都被占领,但双方都无法使棋子连成一条直线的话,则判和棋。

这是一个智能型的一字棋游戏,机器可以模拟人与用户对弈。当轮到机器来下的时候,机器会根据当前棋局的形势,利用极大极小算法算出一个评价值,判断如何下才对自身最有利,同时也是对方来说对不利的,然后下在评价值最高的地方。另外利用α-β剪枝,使机器在搜索评价值的时候不用扩展不必要的结点,从而提高机器计算的效率。

在用户界面方法,用一个3×3的井字格来显示用户与机器下的结果。当要求用户输入数据的时候会有提示信息。用户在下的过程中可以中途按下“0”退出。当用户与计算机分出了胜负后,机器会显示出比赛的结果,并按任意键退出。如果用户在下棋的过程中,输入的是非法字符,机器不会做出反应。

三、实验步骤和过程

1.α-β搜索过程  在极小极大搜索方法中,由于要先生成指定深度以内的所有节点,其节点数将随着搜索深度的增加承指数增长。这极大地限制了极小极大搜索方法的使用。能否在搜索深度不变的情况下,利用已有的搜索信息减少生成的节点数呢?

MINIMAX过程是把搜索树的生成和格局估值这两个过程分开来进行,即先生成全部搜索树,然后再进行端节点静态估值和倒推值计算,这显然会导致低效率。如图中,其中一个MIN节点要全部生成A、B、C、D四个节点,然后还要逐个计算其静态估值,最后在求倒推值阶段,才赋给这个MIN节点的倒推值-∞。其实,如果生成节点A后,马上进行静态估值,得知f(A)=-∞之后,就可以断定再生成其余节点及进行静态计算是多余的,可以马上对MIN节点赋倒推值-∞,而丝毫不会影响MAX的最好优先走步的选择。这是一种极端的情况,实际上把生成和倒推估值结合起来进行,再根据一定的条件判定,有可能尽早修剪掉一些无用的分枝,同样可获得类似的效果,这就是α-β过程的基本思想。α-β搜索过程一字棋的

图一字棋第一阶段α-β剪枝方法为了使生成和估值过程紧密结合,采用有界深度优先策略进行搜索,这样当生成达到规定深度的节点时,就立即计算其静态估值函数,而一旦某个非端节点有条件确定其倒推值时就立即计算赋值。从图中标记的节点生成顺序号(也表示节点编号)看出,生成并计算完第6个节点后,第1个节点倒推值完全确定,可立即赋给倒推值-1。这时对初始节点来说,虽然其他子节点尚未生成,但由于s属极大值层,可以推断其倒推值不会小于-1,我们称极大值层的这个下界值为α,即可以确定s的α=-1。这说明s实际的倒推值决不会比-1更小,还取决于其他后继节点的倒推值,因此继续生成搜索树。当第8个节点生成出来并计算得静态估值为-1后,就可以断定第7个节点的倒推值不可能大于-1,我们称极小值层的这个上界值为β,即可确定节点7的β=-1。有了极小值层的β值,很容易发现若α≥β时,节点7的其他子节点不必再生成,这不影响高一层极大值的选取,因s的极大值不可能比这个β值还小,再生成无疑是多余的,因此可以进行剪枝。这样一来,只要在搜索过程记住倒推值的上下界并进行比较,就可以实现修剪操作,称这种操作为α剪枝。类似的还有β剪枝,统称为α-β剪枝技术。在实际修剪过程中,α、β还可以随时修正,但极大值层的倒推值下界α永不下降,实际的倒推值取其后继节点最终确定的倒推值中最大的一个倒推值。而极小值层的倒推值上界β永不上升,其倒推值则取后继节点最终确定的倒推值中最小的一个倒推值。在进行α-β剪枝时,应注意以下几个问题:  (1)比较都是在极小节点和极大节点间进行的,极大节点和极大节点的比较,或者极小节点和极小节点间的比较是无意义的。  (2)在比较时注意是与"先辈层"节点比较,不只是与父辈节点比较。当然,这里的"先辈层"节点,指的是那些已经有了值的节点。  (3)当只有一个节点的"固定"以后,其值才能够向其父节点传递。  (4)α-β剪枝方法搜索得到的最佳走步与极小极大方法得到的结果是一致的,α-β剪枝并没有因为提高效率,而降低得到最佳走步的可能性。  (5)在实际搜索时,并不是先生成指定深度的搜索图,再在搜索图上进行剪枝。如果这样,就失去了α-β剪枝方法的意义。在实际程序实现时,首先规定一个搜索深度,然

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中重载 参数顺序_Java方法中的参数太多,第4部分:重载

java中重载 参数顺序期望将过多的参数传递给Java方法的问题之一是,该方法的客户端很难确定它们是否以适当的顺序传递了适当的值。 在以前的文章中,我描述了如何使用自定义类型 , 参数对象和构建器来解决此问题。 解决此问题的另一种方法&…

c语言金箍棒答案,《西游记》阅读测试题(带答案)

《西游记》测试题(后附答案)姓名得分1.《如来佛辨识假猴王》故事中,那只假孙悟空是什么猴子变的?()A.金丝猴 B.石猴 C.六耳猕猴2.金角大王和银角大王原来是()的弟子。A.太上老君 B.孙悟空 C.观音菩萨3.蜘蛛…

五个金念什么_四个“金”字读什么?

展开全部读音为:jīn ,是金字的异体字写法,读音和意思与金字完全相同,打不62616964757a686964616fe58685e5aeb931333431353265出来,如下图:金拼音:jīn释义:1.俗称金子。金属元素&am…

Istio的零停机滚动更新

本系列文章的第一部分介绍了如何在Kubernetes集群中实现真正的零停机时间更新。 我们专门解决了将流量从旧实例切换到新实例时出现的请求失败。 本文将展示如何使用Istio群集实现相同的目标。 服务网格技术(例如Istio)通常与容器编排结合使用。 Istio以…

聚类dbi指数_一种基于DBI-PD聚类算法的异常检测机制

一种基于DBI-PD聚类算法的异常检测机制丁姝郁【期刊名称】《电脑开发与应用》【年(卷),期】2015(000)002【摘要】分析了网络数据维数和检测准确度之间的关系,介绍了常用于入侵检测的聚类分析方法及其优缺点。在此基础上,提出一种以戴维森堡丁指数(DBI)为…

单片机红外通信c语言,基于C语言的计算机与多单片机红外无线串口通信的实现.doc...

基于C语言的计算机与多单片机红外无线串口通信的实现基于C语言的计算机与多单片机红外无线串口通信的实现黄文亮 信息学院 电子信息工程专业指导教师 刘传菊摘要:计算机与一台或多台单片机的通信系统中的数据通讯一般采用的是串行通信方式。串行通信可采用有线与无线…

android 设置资源,Android 资源

Android 资源Android Resources02/01/2018本文内容本文介绍了 Xamarin 中 Android 资源的概念,并介绍了如何使用这些资源。其中介绍了如何使用 Android 应用程序中的资源来支持应用程序本地化和多个设备,包括不同的屏幕大小和密度。This article introdu…

zbrush常用笔刷_ZBrush中常用笔刷综合简介

单击左托盘的笔刷图标,弹出一个笔刷库,其中有许多常用笔刷,这也是许多初学者所头疼的问题,ZBrush的笔刷非常多,而且功能很强大,好多朋友不知道该选择哪一个笔刷进行雕刻。其实,在ZBrush的学习中…

spring java配置_Spring:使基于Java的配置更加优雅

spring java配置大家好,我很久没有写新文章了。 积累了很多资料,需要在不久的将来在我的博客中发布。 但是现在我想谈谈Spring MVC应用程序配置。 确切地说,我想谈谈基于Java的Spring配置。 尽管在3.0版本中引入了基于Spring java的配置&…

android封装oauth2,Android AccountAuthenticator和OAuth2

这肯定是可行的。来自Android AccountManager文档:Many servers support some notion of an authentication token, which canbe used to authenticate a request to the server without sending theusers actual password. (Auth tokens are normally created with…

php redis 队列抢红包_php+redis实现消息队列

消息队列:是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它应…

使用Spring Security在Spring Boot中进行缓存

在这篇文章中,我想分享一下O&B的一个团队的经验教训。 他们正在使用带有Spring Security的Spring Boot。 默认情况下,Spring Security保护的所有内容都将通过以下HTTP标头发送到浏览器: Cache-Control: no-cache, no-store, max…

wifi定位算法android,WIFI定位算法

网络定位指通过周边wifi列表、基站列表、IP地址等信息确定用户位置的过程。 我们采集的训练数据是每个GPS坐标位置和对应的Wifi和基站列表。 其中每个Wifi和基站有唯一的Mac地址作为ID和信号强度。有三种定位方法:均值法首先估计一个wifi的中心点位置,可…

仿小黄车android定位,小黄车ofo是怎么实现自行车定位功能的?

摩拜单车通过车身携带的GPS而实现单车定位,但是我们知道ofo是没有安装GPS,它又是如何实现单车定位的呢?我居住的地方距离地铁站步行大约15分钟左右,距离最近的商场步行将近30分钟,距离周边的便利店,水果店,饭店等步行1…

python苹果下载软件助手哪个好_Mac上有什么实用的必备软件?

Mac上的一些软件真的超好用,比如...每天依据时间变化的壁纸,看清晨、看夕阳我是 Super叔 ,关注了就是好朋友,这里说明下还是,软件只是工具,初衷是为了方便自己提高效率,别为了去模仿所谓某某软件可以怎么怎么复杂的,用得多么炫酷好用,而去花非常多精力为…

hibernate 刷新_Hibernate事实:了解刷新操作顺序很重要

hibernate 刷新Hibernate将开发人员的思维方式从思考SQL转变为思考对象状态转换。 根据Hibernate Docs,实体可能处于以下状态之一: new / transient:实体不与持久性上下文相关联,因为它是数据库不知道的新创建的对象。 持久性&a…

android变量要不要附空值,android-如何在使用Parcelable时序列化空值

我见过的大多数序列化代码都使用两个标志来指示值的存在/不存在,或者在值前加上一个计数字段(例如,在编写数组时),如果该值不等于,则计数字段仅设置为零。 根本不存在。检查Android核心类的源代码会发现以下代码(来自Message类)&a…

gprs连接中断记录_请收好!脉搏波血压计连接天天血压APP使用指南

总有那么几个粗心的小伙伴丢失了说明书,在后台追问波哥如何连接“天天血压”,于是给大家安排了这篇使用指南。首先我们来了解下“天天血压”的功能:1.通过蓝牙或GPRS传输,同步记录每次测量结果;2. 血压趋势分析&#x…

使用Spring Boot,JHipster和React构建照片库PWA

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 从本质上讲,React只是一个UI工具包,即ala GWT,但是…

html5画布funcition,2020前端基础知识学习第一节(示例代码)

一、选择题1. 浏览器端的存储技术有哪些()A.cookie  B.localStorage  C.session  D.userData答案:A B D分析:cookie通常用于存储用户等登录信息,能够存储的数据是有限的,而且在指定域名下所有的请求都会带上。localStoage是…