围棋AI之路(二)棋盘的实现

Katago+Sabaki个人围棋AI工具安装配置 阅读详情
代码先公布:http://download.csdn.net/source/891878

到现在为止,我只实现了一个棋盘,确切的说是在棋盘上随机走棋的速度测试程序,我借鉴了lib-ego,在上面做了一些改进,现在这个棋盘可以使用围棋规则或者五子棋规则。我的目标是让我的AI程序用同样的算法来对待围棋、五子棋甚至小时候玩过的黑白棋,它不需要任何棋类知识,你只要告诉它下棋的规则。我们的脑细胞可曾了解究竟什么是围棋?它们只是机械的执行自己的职能,而亿万个细胞堆叠在一起就使人类会下棋了。

上面说的三种棋的棋盘有一些共同的特点:棋盘是由n行n列的平行线段交叉组成的格子,棋子分黑白两种颜色,棋手分为两方,分执一种颜色的棋子。双方轮流下子,每次下一个子,棋子要下在空的交叉点上(黑白棋似乎是下在格子里,但是应该没有本质区别)。

根据这些特点我们开始设计棋盘的结构。

一、比特棋盘

很想在围棋中使用比特棋盘,就像国际象棋中那样,用一个64bit的数就描述了棋盘上的一种棋子。围棋上尽管也可以做到,例如用一个361bit的数来描述棋盘上的黑棋,另一个361bit数描述白棋,但是没见过谁这么做。

一般还是用传统的数组来描述棋盘,数组的每个元素有三个状态:黑(black)、白(white)、空(empty)。

为何计算机不是三进制的?我以前曾经这么想过,如果计算机是三进制的,会不会能更好的描述围棋?

后来我发现,其实棋盘上的点不只三个状态,还漏掉了一个off_board,也就是棋盘外的点。因此棋盘其实是4进制的,和2进制的计算机还是契合的不错的。

如何理解off_board也是一种状态?我们可以观察一下棋盘的边界,边界再往外就是off_board了,对围棋来说,通常的一颗子有4口气,但是到边界上就变成三口气或者两口气了,就仿佛边界外有敌人的子一样。对于五子棋,如果对方冲四冲到边界上,就不用挡了,就好像棋盘外有自己的棋子给它挡住了一样。

我按这种物理意义来为这些状态指派2进制数:

empty 00
black 01
white 10
off_board 11

这里empty就是没有棋子,black和white分别有一个棋子,而off_board则是同时有两个棋子,哪方的棋子靠近它,它就表现为另一方。

这样做的好处是,我可以用一个8bit的数来描述一个棋子的邻点,8bit总共256种情况,非常适合查表,通过查表,我就能得知任何情况下交叉点的“气”了。

关于计算交叉点的“气”,lib-ego中采用的另一种方法,它仅仅只增量计算交叉点周围黑、白、空三种情况的数量(off_board就分摊到黑白两种情况上了),而不管具体分布情况。目前我还没有发现我的方法表现出来的优势,但是我坚信我的方法比lib-ego中的好,因为它合乎道。

看起来,可以用一个8bit的数来存4个位置的状态,那么整个棋盘总共需要56个64bit数,比国际象棋没多太多,然而最终我没有贯彻比特棋盘的思想,因为我觉得那样不自然,我仍然选用传统的数组方式。

二、代码优化

许多人都指出优化应该晚做。但是对一份已经优化过的代码,如果不了解其优化手段,很难明白一些代码的意义。

1 使用编译期常量来代替变量。
例如棋盘的尺寸这个量,棋子的坐标计算依赖于它,为一些结构分配多大空间也与这个量相关。为了避免运行期再去计算这些东西,我们可以用宏或者const int来定义它:
  1. const uint board_size = 9;
但是我们希望程序可以运行在9路,13路,19路棋盘上,而且运行中可以改变棋盘,因此我采用了template。基本棋盘结构类似下面这样:
  1. template<uint T> 
  2. class Vertex {
谈谈人工智能、围棋与数学 最近几天,AlphaGo与围棋世界冠军李世石的对弈引起了全世界的关注,已然成了历史性的事件。今天下午第四场比赛结束,由于AlphaGo程序出现bug,使得李世石获得了唯一的一次胜利。 这自然凸显出人工智能的强大,大家觉得,计算机的计算速度之快,只要遍历完所有可能的情况,自然会胜过人类。其实,这是没有真正理解围棋困难程度的表现。 AlphaGo与李世石的对局 阅读详情

相关推荐

围棋基类源码分析:AI算法与游戏实现

简介:围棋是一种古老策略游戏,现已成为AI领域研究热点。本源码文件包含了一个围棋产品的完整实现,为学习围棋算法AI结合提供了实例。分析源码,可以了解棋盘类、棋子类、玩家类的设计,围棋规则的编程实现,游戏状态管理,以及AI算法如何影响围棋游戏体验。此外,还包括了用户交互和胜负判断机制,并展示了性能优化技术。

weixin_36212459的博客 1395

引入了UCT算法围棋AI程序代码

说是围棋程序,但是直接编译是按五子棋下的。

Python-Tensorflow仿AlphaGo框架实现AI围棋程序

Tensorflow仿AlphaGo框架实现AI围棋程序

如何从零创造一个围棋AI

如果你对围棋和编程都感兴趣,不妨看看,简单介绍如如何从零开始,创建围棋人工智能

zkdjen的博客 2632

用python实现ai围棋_围棋AI.Leela+Python脚本分析棋谱

完成了Sabaki+LeelaSabaki+Leela GTP搭建完美围棋AI平台后,在“飞扬围棋论坛”看到有棋友介绍用Leela+Python脚本分析棋谱,于是也试了一下。软件下载和安装leela-analysis的Github页面将下载得到的“master.zip”文件解压缩到之前下载安装的Leela0110GTP文件夹下。如下图。analysis-master文件夹就是leela-analy...

weixin_39530437的博客 2180

MCTS人工智能围棋

基于一些已学习过或独立研发的 AI 算法开发自己的 AI 智能围棋程序,通过使用多种最优搜索和强化学习的算法在一个缩小版的围棋游戏中进行对战。相比于正常围棋,在本次对战中使用的围棋棋盘尺寸缩小为 5x5(正常围棋尺寸为 19x19)。你的目标是使用你的智能围棋程序和你的同学进行竞赛,通过使用不同的搜索算法实现最优的围棋策略,打败你的竞争对手们

weixin_47108207的博客 1253

#转载汉化 用C++写出来的人工智能围棋游戏

感觉挺有意思的,算法也很强,另外这款游戏据说算法是和“阿尔法狗”一样的呢我咋不信呢另外游戏进行了汉化处理。。。下载地址:https://pan.baidu.com/s/124Y-VdFtA8RIx8M6irXMIw 密码: q4cv...

qq_41243082的博客 2110

围棋棋盘怎么编程python_python实现围棋ai

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!腾讯野狐围棋上经常有直播讲解,和电视节目讲解有所不同,解说会搬出绝艺(腾讯出品的围棋ai软件),对一些关键步骤,给出几种推荐的选点,以及随后几步的...但要注意的是goreviewpartner支持的是python 2,在python 3下可能存在兼容问题。 通过anaconda可以...

weixin_39580749的博客 2253

支招功能最强人工智能围棋软件_AI智能棋盘全新上线,围棋的奥秘原来在这里?...

乐弈围棋乐在‘棋’中2016年谷歌公司研发的AlphaGo击败人类围棋史最为传奇的棋手之一“不败少年”李世石后,围棋AI相关的消息迅速席卷了各大主流媒体。围棋AI的出现不仅没有让这项人类智慧的结晶迅速走向衰落,反而在海内外扩大了围棋的影响力。与此同时,人工智能的介入让我们对围棋的奥秘有了更深的理解。原先,围棋的理解是由一代代天赋过人的职业棋手们积累下来的。这其中不仅有着人类算力的局限性,...

weixin_39789646的博客 1111

AI围棋学习之路一----棋盘和落子的类构建

我是一个围棋业余3段的人,学了三年,一直想拥有一个属于自己的AI,目前围棋基础还可以,就是苦于自己的编程实力不够,最近看到了一个非常棒的教程,有兴趣的去找tyler_download看他的文章,代码非常详细具体,适合小白,现将我的学习心得和要点一一陈述出来 要做围棋AI先要把架子打出来,先实现基本围棋游戏再考虑引入神经网络,今天就先完成棋盘和落子的类构建 如果你有一定围棋基础,理...

qq_41957257的博客 2425

c++围棋源码

c++围棋源码,良好的编程习惯,计算气以及很多测试用例都有包含

中国象棋AI算法 C/C++

中国象棋的AI算法,一步一步教你学习AI设计,六个版本,难度逐次增加。非常好的学习资料。

实现AlphaGo():快速构建棋盘围棋规则

我们迅速进入到代码编写阶段 我们要实现围棋机器人必须做到以下几点: 1, 跟踪当前所下的每一步棋。 2, 跟踪当前的棋局进展。如果是机器人自我对弈,那么代码对棋局的跟踪与人和机器人对弈是对棋局的跟踪有所不同。 3, 根据当前棋盘局势,搜索多种可行的下法,并从中评估出最好的走法。 4, 将棋局转换为可以拥有训练网络的数据。 我们从易到难,先解决好小范围的问题,打好基础后才能处理更复杂的问题。首先我们要用代码编制好棋盘,player,落子等对象。首先我们用代码实现棋手: ...

hxxjxw的博客 1595

AI智能棋盘计算围棋气数逻辑

本文深入解析智能围棋棋盘中基于气数计算的生死判定机制,介绍通过BFS连通块检测与局部重算实现毫秒级响应的核心算法,并探讨其在嵌入式系统中的高效实现与实际应用价值。

weixin_42509513的博客 1180

智能电子围棋棋盘大盘点

所谓电子棋盘,抑或智能棋盘,是安装了棋子检测传感器,能识别对弈双方的落子,进而能实现记录棋谱、人机/联网对战等功能的棋盘。历史上曾出现过多个公司,开发出了各种形态的电子棋盘

yingzhao80的专栏 3035

Halcon实现棋盘检测:智能围棋辅助工具

Halcon实现棋盘检测:智能围棋辅助工具 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在围棋这项古老的智慧游戏中,棋盘与棋子的精准识别对于提高棋手水平、开发围棋AI具有重要意义。Halcon实现棋盘检测项目,正是为了满足这一需求而诞生。该项目基于Halcon图像处理库,提供了一套高效的围棋棋盘和棋子检测解决方案。通过该技术,用户可以轻松识别围棋棋盘,并准确判定棋子...

gitblog_06776的博客 882

使用yolov3训练识别围棋死活题和围棋局面

我的知名围棋APP忘忧围棋的开发者(www.gog361.com),一直想做一个可以通过手机拍摄识别死活题的功能,前后经过了半年时间的折腾,终于上线这个功能。这个过程很艰辛,并且踩了还不少的坑,所以记录下这个过程。 应用的场景有以下几种 1. 小孩子在学围棋的时候,家长是不懂围棋的,老师给的题目在书本上,家长可以拍照识别题目并通过AI解题 2. 在现实中下棋的时候,棋局结束的时候数子,或者棋局中间的时候形势判断,都可以拿起手机拍照后数子后进行形势判断,AI推荐,AI分析,AI复盘等 3. 即使在线上

wyzegg的专栏 6783
上一篇: 围棋AI之路(一)理论
下一篇: 围棋AI之路(三)UCT,进来之后才发现是地狱
oyd
oyd
博客等级 码龄24年 186粉丝 81原创
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值