棋类人机对战的一般原理

下棋的程序,主要难点在“人机对战”,也就是机器有多聪明,下棋水平(AI)高不高。 不同的棋类,棋盘、棋子、规则都各不相同。但制作人机大战的思路有许多共同的特点。

1.局面估值 根据当前的棋局和“轮到谁走下一步棋”对当前局面进行估算,得到一个或少数几个整数(小数也无防)。一般是4个整数合成(加法)一个整数,这4个整数是: 我攻+我防+敌攻+敌防。即对自己有利的 避开对自己有害的 避开对敌人有利的 对敌人有害的。(感谢咙想酒甜  446828992)

2.搜索
2.1 单步搜索。根据当前棋局,算出我方最可能下的一步棋几种情况,然后计算每一种可能下子后的局面估值,哪个局势对我方最有利就下哪一步。
2.2 多步搜索。在内存中演绎(模拟)我方走一步(记为第1步),敌方走一步(记为第2步),我方再走一步(记为第3步)……模拟n步后,每一步都取对己方(有时我是己方,有时敌是己方)最有利的一步,最终算出第1步应该走哪步。
搜索往往是核心,计算量非常大,所以一般很难搜得深。为了加速搜索速度,会引入许多剪枝算法,常用的是Alpha-Beta剪枝。

3.开局库 游戏开始就使用开局库,如果局面命中开局库,就按库来走子,省掉了大量搜索,开局库往往是经验的积累,好的开局库能很大的提高棋力(棋力也叫博弈软件的AI水平)

4.残局库 残局库通常收录的是必胜的棋局,只要命中(可能为全局命中或局部命中,具体情况具体分析)照着走就能胜出。对有些棋类可能残局库难以适用。

5.开局、搜索、残局的关系 开局使用开局库,直到超出库的范围。然后每次都搜索残局库(性能优化方面再依具体情况而定),命中则按残局库走,未命中则搜索。

6.学习功能 学习功能主要是对残局库、开局库的丰富,但也可以用在局面估值参数的调优。
6.1残局库的丰富 (前面说了残局库的每一个都是必胜局面)
    如果当前从当前局面出发总能进入残局库,则当前局面为必胜局面,添加入残局库。实时添加。
6.2开局库的丰富
    通过事后以大量的数据进行分析,统计出超出开局库后的第1步(仅1步)的多种不同走法的胜败概率,从而将胜率较高的一步添加入开局库。非实时添加。

6.3 局面估值参数的调优
     在对参数进行调整前后,两个软件对战1000局,根据结果决定是否采纳新的参数。参数多时,有必要设计一套调整算法,只要有时间就让机器跑,跑得多了参数也就趋于最优。理论上是这样的。

严格来讲6.2和6.3不算学习功能,不管算不算学习功能,它们都是很有意义的。

如果需要对软件的棋力分档设置(如初级、中级、高级),简单的做法是设置搜索的深度,初级搜得浅,高级深。

由于搜索是一棵树,每一个节点都可能有许多子节点,这棵树的节点很多,所以需要优化,一般的优化是剪枝,也往往会使用多种技术综合进行剪枝,所以出现了搜索相同的深度,不同的棋局所需要的时间大不相同。考虑到玩家的等候时间不宜过长,所以需要在搜索的同时控制时间。个人认为让用户等6秒到10秒,还是比较正常的,两个人的下棋,也差不多是这个时间。当然有时需要的时间极短。

让两个软件相互PK,对AI的改进有重大的作用。需要对两个软件进行对接,从代码对接(两份代码融为一份,类似双核CPU),耦合性太高,通用性太低。从界面对接,耦合性和通用性中等,操作繁琐,通信效率低(想象一下,PK1000局所花的时间)。理想的情况是网络对接。需要一套公共的协议,然后只要实现了该协议的任何2个软件就可以进行PK。

本文根据聊天记录整理,主要是当作自己的笔录。当然也欢迎各位朋友评论和指正。

时间: 2024-11-11 05:38:31

棋类人机对战的一般原理的相关文章

人机对战:不断革新的AlphaGo ——深度学习

2017-04-23 2017年5月23日-27日,现等级分第一人.世界冠军柯洁九段将在浙江乌镇迎战谷歌人工智能AlphaGo,"人机大战Ⅱ"势必再掀围棋热潮. 人机对战:不断革新的AlphaGo AlphaGo是一款由谷歌旗下DeepMind公司研发的围棋人工智能程序.这个名字第一次见诸报端还是去年初,它在没有让子的前提下5-0击败欧洲冠军樊麾.但彼时AlphaGo也仅被视为诸多棋类AI中的一个,尚无今日的影响力. 直到去年三月,在业内普遍乐观的情况下,世界冠军头衔上双的韩国棋手李世

C语言 AI智能,五子棋 人机对战,人人对战

C语言五子棋,人机对战,人人对战 [email protected]:~$ cat main.c  # include<stdio.h> # include<string.h> # include<stdlib.h> # define SPA 0 # define MAN 1 # define COM 2    /* 空位置设为0 ,玩家下的位置设为1 ,电脑下的位置设为2 */ int qipan[15][15];    /* 15*15的棋盘 */ int a,b,

Android 蓝牙对战五子棋项目实现(含人机对战功能)

上周花了一周时间做的课程设计的项目,实现的功能如下: 基本功能: (1) 该APP能够通过蓝牙自动搜索周围其他使用了该APP的手机,用户可选择其中某一个APP发起对战的要求,被发起方可以同意或者拒绝: (2) 双方可以实现五子棋蓝牙对战: (3) 具备悔棋等功能. (4) 实现人机对战.提供难度选择. (5)提供用户战绩排名系统. 项目已经上传到Github:https://github.com/jiangzhengnan/PumpkinGoBang.git Github跳转 下面是界面截图和实

HTML5+JS 《五子飞》游戏实现(八)人机对战

要想实现人机对战,就必须让电脑自动下棋,而且要知道自动去查找对方的棋子,看看有没有可以挑一对的,有没有可以夹一个的,这样下起来才有意思. 当电脑用户下完棋后,电脑应立即搜索用户的棋子,然后如果没有被吃的,就再随机走一个棋子(要想让电脑成为下棋高手就不能随机下棋,要考虑下棋后会不会再被对方吃掉等等,这里只简单做随机下子了). 完整<五子飞>游戏人机对战:http://www.lyout.com/projects/Fiveflychess/FiveflyChess8.htm // 查找是否有可挑的

高考作文,人机对战,人工智能只有小学水平

3月份时的人机围棋大战,国际顶尖选手李世石遭阿尔法狗完爆,这次人机对战考验的是围棋的逻辑能力,而计算机本就是逻辑产物,李世石落败情理之中.在昨天高考作文的人机大战中,拼的不仅是逻辑,更重要的语言文字的情感表达能力.在此次直接的语言文字比拼中,人工智能的情感表述尚显稚嫩. 人工智能情感表述尚显稚嫩,高考作文水平不及格 语文高考作文每年都是网络热点话题之一,而在昨天微软小冰也参加了高考作文创作,这被很多网友认为是人工智能与人类又一场PK,微软小冰同场与张鸣.安意如.潘采夫等10位名家进行高考作文创作

介绍一款Android小游戏--交互式人机对战五子棋

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6589025 学习Android系统开发之余,编写了一个小游戏--交互式人机对战五子棋,自娱自乐.之所以称之为交互式人机对战五子棋,一是因为在进入人机对战模式这前,你可以任意设置好开局,同时,在对战过程中,你可以看到机器的思考过程,还可以标识出每一个落子点的优劣势:二是因为可以为机器增加游戏经验,使得机器越来越聪明.希望喜欢五子棋的同学能够喜欢,

安卓五子棋(2)-人机对战

人机对战,无非是通过算法来实现AI,遍历五子棋棋盘,返回一个X,Y的值,再去绘制棋盘就行了. 不多说,下面直接附上代码,人机的算法,有这个算法后,在自定义的View里去用就行了 package com.dcx.bean; import android.util.Log; public class SmartAIPlayer  { private final static int FIVE = 10000; private final static int LIVE_FOUR = 4500; pr

结队-人机对战象棋游戏-项目进度

截止至2017-09-29,人机对战象棋游戏进度为: 1:背景以及棋盘已经布置完成,大小以及基本按钮都已完成. 2:基本页面布局和旗子图片都已完成. 存在的问题:现在还没找到优化象棋走步的功能(比如马走日,象走田之类的) https://gitee.com/vip_zjw/XiangQiYouXi

基于Qt Creator实现中国象棋人机对战, c++实现

GitHub地址: https://github.com/daleyzou/wobuku 这是自己大一学完c++后,在课程实践中写过的一个程序,实现象棋人机对战的算法还是有点难的, 自己当时差不多也是写了两个月左右吧!当时看书又有很多问题得不到解决,所以就在网上找了一个视频跟着写. 当然,这其中有很多功能都是自己扩展的. 我把视频分享出来,希望能对新手有帮助吧! 视频地址:链接:https://pan.baidu.com/s/1pIp6UMJ6LXsuJ3GT80NGfw 密码:9k8y 注意: