如何用Java编写一个爱恩斯坦棋代码棋盘

本发明属于电子棋类游戏技术领域特别涉及一种利用信心上限树UCT算法对其进行更新和选择节点的爱恩斯坦棋代码博弈系统。

爱恩斯坦棋代码在2005年被用作爱因斯坦年的官方游戏进入到公众视野它是由德国一个应用数学方向的教授Ingo在2004年根据他之前设计的一个需要很大概率的足球小游戏设计的,原名是EinStein würfelt nicht!中文意思是爱因斯坦不投骰子。游戏的名字的来源是因为爱因斯坦的一句著名的话:我确信上帝不会投骰子

规则简介:棋盘为5*5的方格,红方的出发区在棋盘的左上角蓝方的出发区在棋盘的右下角。初始红方与蓝方各有6枚棋子对应数字1~6且在出发区随意摆放走棋的过程中,双方交替掷骰子然后走动匹配骰子数的棋子。若匹配的棋子被吃掉那么走动与筛子数的相近棋子。双方棋子每次只能走动一格红方走棋的规则为向右、向下、向右下,蓝方走棋的规则为向左、向上、向左上当己方的棋子到达对方的角位置,或消灭对方全部棋孓那么己方获胜,对弈结果只有胜负没有和棋。

目前爱恩斯坦棋代码所采用的技术多为Alpha-Beta与期望极大极小算法。棋类游戏通常是根据當前对弈局面对存在的可能情况向下进行模拟,由此构造出一颗模拟的树状图称之为博弈树。该算法是对当前棋局节点的估值因此必有一个估值函数。通过估值函数将不同的棋盘状态量化通过比较量化后的数字来判断落子的好坏。爱恩斯坦棋代码属于随机特征的博弈每次行棋通过轮流掷骰子来决定走动的棋子,因此对于爱恩斯坦棋代码来说传统的方法并不完全适用同时爱恩斯坦棋代码在开局时紅方与蓝方的棋子可以在出发区随意摆放,因此估值函数的设计相对比较复杂

蒙特卡罗方法,是以概率统计为指导的计算方法这种方法是对当前棋盘所有可能出现的落子方式进行统计可以解决爱恩斯坦棋代码难估值且随机性强的问题。为了实现概率估值的搜索方式使鼡信心上限树算法亦称UCT(Upper Confidence Tree)算法。作为蒙特卡洛算法的一种延伸UCT算法通过对博弈树的落子进行大量快速模拟,计算出UCB(Upper Confidence Bound)值通过选择最优的UCB节點作为最佳走法。

综上所述目前的爱恩斯坦棋代码博弈算法存在的问题其一估值函数不好设计,其二传统的博弈树并不完全适用

本发奣目的是针对现有技术的缺陷,提出了一种爱恩斯坦棋代码游戏系统该系统采用信心上限树算法进行博弈树搜索。

为了实现上述目的夲发明采用以下技术方案:一种爱恩斯坦棋代码博弈系统,包括:输入装置、外部显示装置和内部处理单元;

其中所述输入装置用于用户設置参数和对弈过程中的策略选择并且与内部处理单元建立通讯,进行游戏或者选择自动测试;

所述外部显示装置用于和内部处理单元建立通讯实时显示棋盘上的状态信息和对弈过程;

内部处理单元用于采用了智能博弈技术实现了爱恩斯坦棋代码的智能化,实现智能博弈技术之间的自动对弈以及人与智能博弈技术之间的对弈。

进一步的内部处理单元包括:

搜索模块,采用UCT算法利用蒙特卡洛方法对當前棋盘信息进行搜索和模拟,并根据UCB公式进行节点的选择选择出最优的落子方式;

存储模块:将棋盘上的信息利用5×5的数组进行存储,当棋盘上棋子发生变化时通过改变对应数组的数据值实现对棋盘信息的更新;

信息交互模块:用于实现输入装置、外部显示装置和内蔀处理单元之间的数据传输,并对爱恩斯坦棋代码系统进行控制;

互动模块:通过在外部显示装置弹出选择对话框来让用户进行游戏模式選择用于人人对弈、人机对弈与机机对弈的选择入口。

进一步的基于UCT算法的搜索和模拟包括以下步骤:

(1)选择节点:对爱恩斯坦棋代码模拟产生的博弈树,从根节点开始选择UCB值最大的子节点一直到叶子节点;

(2)展开节点:父节点在选择子节点时,如果当前子节点没有叶节點对当前子节点的模拟,达到了设定的次数那么为该节点的拓展子节点;

(3)模拟棋局:对所有的拓展节点采取同样的方式,进行棋盘的模拟下棋直到结束为止,然后统计节点的数据;

(4)回馈更新:根据模拟棋局得到的数据计算博弈树中节点的值,将模拟棋局的胜负结果囷访问次数沿着父节点反馈更新整个搜索树

进一步的,步骤1中节点的选择采用以下步骤:

(1)在节点中加一变量‘dice’,初值为0;

(3)确定骰子後根据UCB公式选择棋子;

(4)确定棋子后根据UCB公式选择移动方向,以确定子节点.

进一步的UCB公式如下:

其中:vi是以节点ni为根节点的所有子节点汸真结果的平均值;Ti表示的是节点ni被选择的次数;∑iTi是节点n的访问次数;c是一个手工设定的常数,兼顾当前局面模拟的充分程度和局面好壞

进一步的,步骤2中对于差棋不对其进行拓展节点。

进一步的步骤3中对于叶节点模拟下棋采用5局3胜制。

进一步的最优的落子方式昰UCB值最大的节点。

爱恩斯坦棋代码系统的界面层提供的功能有强制下棋、测试、悔棋、设置棋盘参数等在主界面中用户可以选择下棋的筞略、玩家类型、骰子策略等。同时在主菜单提供了自动对弈通过自动对弈用户可以选择策略并且验证策略的好坏以及对参数的调整。意外总会出现当某方玩家不小心出现错误时,出现错误的玩家可以向对方提出悔棋的请求在经过对方同意后,爱恩斯坦棋代码游戏系統提供悔棋的功能通过点击悔棋按钮,棋盘会回到前一状态

爱恩斯坦棋代码系统的搜索层是通过加载系统的算法搜索方法,按照当前棋盘的状态通过系统的搜索算法的应用根据当前棋局,该算法会一直模拟下棋并统计下棋的结果,根据以上得到的数据之后通过该算法的选择,从而选择最优的走棋方式

UCT算法能够对当前棋盘局面存在的所有可能落子方式进行多次全面的模拟,模拟结束后通过算法Φ的公式计算出节点的好坏,表现好的节点将被优先选择于传统的搜索算法相比,该算法在较大规模的博弈树搜索上有着明显的优势。此算法可以在规定的时间内获得对当前棋盘的局势较好的落子方式此方法很好的解决了爱恩斯坦棋代码目前存在的估值难的问题。

采鼡了UCT算法作为爱恩斯坦棋代码博弈系统的技术具备了以下几方面的优势首先解决了传统算法的估值问题,其次UCT算法对所有可能出现的落孓方式进行了模拟在此基础上根据模拟得到的结果,采用公式对其好的节点进行大量的局部搜索不仅能避免局部最优,而且使得到的結果较优最后爱恩斯坦棋代码游戏采用了多线程,在模拟的时候可以再规定的时间内进行更多的模拟不仅充分利用了电脑的资源,而苴能在有限的时间内使结果更优

图1实施例爱恩斯坦棋代码系统的策略选择界面。

图2实施例爱恩斯坦棋代码系统的主界面

图3实施例爱恩斯坦棋代码系统流程图。

图4实施例UCT算法模拟过程的改进

为了能够详细的理解本发明中的一些技术方案,下面结合附图进行更加系统详细嘚介绍1、爱恩斯坦棋代码博弈系统

该系统主要包括对界面与处理层的设计,对于界面层的设计它的功能是负责与玩家的交互操作,例洳设置需要的参数、显示棋盘的过程处理层的设计主要是采用了智能的博弈算法来实现爱恩斯坦棋代码游戏的智能化,实现了博弈技术の间的自动对弈实现了人与智能机器之间的对弈以及机器和机器之间的博弈。

爱恩斯坦棋代码博弈系统以Java为编程语言且实现了多线程技术,使爱恩斯坦棋代码博弈系统在模拟的时候能够同时进行大量的模拟提高了CPU的使用率,从而增强了爱恩斯坦棋代码的棋力根据该博弈系统的要求,如图1是策略选择的界面其系统的主界面如图2所示。

爱恩斯坦棋代码系统包括:输入装置、外部显示装置和内部处理单え

输入装置:便于用户设置参数和对弈过程中的策略选择,并且与内部处理单元建立通讯使其能够更好的进行爱恩斯坦棋代码游戏或鍺选择自动测试。Java中的消息响应机制满足了爱恩斯坦棋代码博弈系统界面层设计的各种要求通过点击菜单的按钮,然后调用相应的函数對事件进行处理

外部显示装置:用于和内部处理单元建立通讯,实时显示棋盘上的状态信息和对弈过程爱恩斯坦棋代码博弈系统的界媔通过导入相应的Java包,从而减少了开发者的任务量

内部处理单元:采用了智能的博弈技术实现了爱恩斯坦棋代码的智能化,实现了智能博弈技术之间的自动对弈以及人与智能博弈技术之间的对弈。

搜索模块:该系统采用了UCT算法对当前棋盘信息进行大量的搜索和模拟然後根据UCB公式进行节点的选择,然后选择出最优的落子方式

存储模块:棋盘上的信息利用了5*5的数组进行存储,二位整型数组表示的棋盘存储棋子ID,ID=20+number(number是1到6表示6个棋子)表示红方棋子ID=10+number(number是1到6表示6个棋子)表示蓝方,ID=0表示无棋子如公式(2)所示。棋子棋盘上棋子发生变化时对應的数组的数据值将发生改变。

信息交互模块:它是输入装置、外部显示装置和内部处理单元的数据传输通道并且对爱恩斯坦棋代码起箌了控制作用。当爱恩斯坦棋代码运行后输入装置处于开启状态,搜索模块对爱恩斯坦棋代码进行初始化然后接受输入装置对爱恩斯坦棋代码进行设置参数和策略选择的控制信号,若显示机器下棋此时内存处理单元会根据当前棋盘的状态进行大量的模拟,然后选择出朂佳的走子若显示人工下棋,则用鼠标点击对应的棋子和要走的方向每一步走棋都会将棋子的信息发送给处理单元,然后实时更新存儲的数组计时功能是通过内部处理单元根据下棋的信号来计时,然后将信息传给外部显示装置显示双方的对弈用时若对弈的过程中出現点错棋子的时候,可以进行悔棋操作通过点击悔棋按钮,将此信息传到内部处理单元内部处理单元根据传来的信息对下棋的最新记錄撤销,然后将此信号传给外部显示装置

互动模块:爱恩斯坦棋代码包含了人工策略类和智能策略类,实现了人与人、人与机器和机器與机器之间的对弈爱恩斯坦棋代码提供了几种下棋的接口,通过加载不同的策略从而实现了人人对弈、机机对弈和人机对弈。

2、基于UCT算法的搜索方法

所谓的蒙特卡洛模拟棋局就是根据当前的棋盘,交给计算机负责博弈直到模拟结束,然后判定结果并返回此结果UCT接收到返回的结果,根据UCB公式计算更新叶子节点的胜率和访问次数再更新父节点,直到更新到根节点

UCT算法的搜索方法包括:选择节点、拓展节点、模拟棋局、回溯更新。其具体过程如附图3所示下面具体介绍下该算法的搜索方法。

SearchMCTS)方法和UCB公式相结合,应用于爱恩斯坦棋玳码上作搜索的算法爱因斯坦棋随机性大,比赛时下一步的走棋很大一部分取决于骰子骰到的点数而骰子又是无法预知的。所以对UCT算法的选择节点这一步做了改进:在节点中加一变量‘dice’初值为0,选择节点时做三大步骤(选择骰子选择棋子,选择移动方向)选择骰子時dice+1作为选中的骰子值,随后dice=(dice+1)mod6确定骰子后,根据UCB公式选择棋子(可能有两个可走的棋子)确定棋子后根据UCB公式选择移动方向,以确定孩子節点此做法能保证每个骰子都会被UCT算法考虑到,UCT算法可为每一个骰子值都能得到最佳的走法

UCT算法中对于拓展节点来说,需要为当前的節点拓展子节点对于爱恩斯坦棋代码来说,棋盘为5*5的格子棋子不多,因此我们要做的是尽可能的拓展所有可能出现的节点但是对于┅些不必要的节点尽量不去拓展,也就是裁剪掉很差的走子方式

利用蒙特卡洛模拟的思想,当一个节点被选中那么从当前节点出发,開始随机走棋直到游戏结束,以此来进行大量的随机模拟然后根据模拟的结果的反应情况进行估值,对于爱恩斯坦棋代码来说通常棋局模拟一趟得到的结果(赢或输)并不能决定该节点的好坏,所以对棋局模拟做一下改进:对于叶节点模拟1次改为模拟5次即1局1胜制改为5局3胜淛如图4所示;每个节点至少模拟一盘改为至少模拟200盘上述改进虽然会使爱恩斯坦棋代码模拟次数减少数倍,但每次模拟得到的胜率是具囿价值的

根据模拟棋盘得到的胜负情况和节点的访问次数,然后利用模拟得到的数据对博弈树进行计算更新的方式沿着父节点反馈到整个博弈树。这里更新的胜负只对胜利的叶节点进行更新对弈结束没有和棋只有胜负,因此对当前叶节点所在路径的各节点胜利次数执荇加1操作

考虑到爱恩斯坦棋代码的特殊性,由于双方的下棋是有掷骰子决定的因此下棋随机性比较大,要在规定的时间内做出最好的落子因此在选择最佳的节点时,也就是落子方式的时候应该考虑到当前棋盘上的棋子,对被掷到概率的大的棋子多做模拟在轮到我方棋权的时候,以当前棋盘为根节点开始模拟建立博弈树对每一个层都要拓展所有可能出现的落子方式,之后进行UCT算法不断的搜索不斷的进行选择、拓展、模拟、更新,直到达到设定的时间结束UCT算法,找出UCB值最大的作为本次最优落子

以上所述,仅是本发明的较佳实施例而已并非对本发明做任何形式的限制。凡是依据本发明的技术和方法实质对以上实施例所作的任何简单修改、等同变化与修饰均仍属于本发明的技术和方法方案的范围内。

 * 假设有一条绳子上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序您

 * 希望将之分类,并排列为蓝、白、红的顺序要如何移动次数才会最少,注意您只能在绳子上

 * 进行这个动作而且一次只能调换两个旗子。

 * 假设有一条绳子上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序您

 * 希望将之分类,并排列为蓝、白、红的顺序要如何移动次数才会最少,注意您只能在绳子上

 * 进行这个动作而且一次只能调换两个旗子。

我要回帖

更多关于 爱恩斯坦棋 的文章

 

随机推荐