一种通用的计算机博弈问题策略搜索引擎类库的制作方法

文档序号:14129751阅读:348来源:国知局

本发明涉及计算机博弈技术领域,具体是一种通用的计算机博弈问题策略搜索引擎类库。



背景技术:

计算机博弈作为人工智能的重要发展方向之一,是对人工智能广泛、深层逻辑决策能力的一大挑战。计算机博弈树搜索算法,以基于简单深度优先搜索的极大极小值搜索为起点,已经经过了长足的发展,诞生了影响深远、应用广泛的alpha-beta剪枝,其各种改进版本如sss算法、pvs算法、mtd(f)算法,以及置换表、启发表、杀手表等辅助数据结构。

但是随着对基于极大极小值搜索算法的改进日趋饱和,人们开始普遍地将目光移向博弈局面评估方法的设计上。而一个好的局面评估方法,势必涉及大量博弈局面评估经验,这提高了开发优秀计算机博弈树搜索引擎的技术门槛,削弱了这类传统算法的推广能力。

蒙特卡洛树搜索算法的提出为通用的计算机博弈树搜索引擎带来了希望。这类随机算法通过大量随机模拟博弈,获得博弈树中各个状态结点的模拟胜率,即局面价值,同时利用ucb1、ucb1-tuned等平衡策略,使随机模拟博弈过程中的策略选择兼顾横向探索倾向与纵向挖掘倾向,令博弈树的展开更高效、有针对性。

蒙特卡洛树搜索算法具有两个值得注意的特性:由于该类算法使用随机模拟累计胜率来描述特定局面的优劣,不再依赖任何博弈规则以外的场景相关博弈知识或经验,具有极佳的泛用性;所有随机模拟过程之间很大程度上相互独立,有竞争资源,但没有同步需求,只要调度合理,完全有可能将算法并行化。

事实上,在围棋计算机博弈系统,包括著名的围棋aialphago中,并行化的蒙特卡洛树搜索算法已经得到了广泛运用,其中“更新发生冲突则放弃更新”的“lockfree”改良机制更是十分具有启发性。



技术实现要素:

本发明的目的在于提供一种通用的计算机博弈问题策略搜索引擎类库,以解决上述背景技术中提出的问题。

为实现上述目的,本发明提供如下技术方案:

一种通用的计算机博弈问题策略搜索引擎类库,包括:

1)蒙特卡洛树搜索算法类:包含以局面哈希值为键,以局面对应的博弈树结点的搜索状态类实例为值的哈希映射表数据结构,表级的线程互斥锁,蒙特卡洛随机模拟方法,策略选择方法,以及局面评估方法;

2)特定局面的博弈树搜索状态类:包括对应局面下蒙特卡洛模拟总数计数器,对应局面下行动方的蒙特卡洛模拟胜利总数计数器,结点级线程互斥锁类实例,蒙特卡洛模拟胜利情况下的博弈树搜索状态更新方法,蒙特卡洛模拟失败情况下的博弈树搜索状态更新方法;

3)结点级的线程互斥锁类:包含一个线程安全的、可抢占原子变量,一个可配置互斥锁写行为原则(阻塞/非阻塞)的类构造方法,通过该类的成员方法,实现基于循环等待的读/写状态抢占机制。

作为本发明进一步的方案:蒙特卡洛随机模拟方法,以当前结点为任务起点,以模拟博弈结束为任务终点;

查询搜索状态索引表,在特定结点预热模拟未完成时,即其所有分支的模拟访问总数均不小于设定阈值前,均匀地随机挑选下一个分支局面继续迭代模拟;

查询搜索状态索引表,在特定结点预热模拟已完成,即其所有分支的模拟访问总数均不小于设定阈值,按照配置的平衡策略(ucb1/ucb1-tuned)挑选下一个分支局面继续迭代模拟。

作为本发明进一步的方案:策略选择方法,通过公式min{cpu逻辑核数,参数设定的线程数},确定启动蒙特卡洛模拟线程的实际数量;

查询蒙特卡洛树搜索算法类实例中的博弈树搜索状态映射表,获取当前博弈局面的直接分支的模拟胜率;

对局面归属与当前局面不一致的局面的胜率进行翻转,即用模拟总数减去胜利总数,作为新的胜利总数;

选择胜率最高的分支作为最佳分支;

获取使当前局面进入最佳分支的策略并返回之。

作为本发明进一步的方案:局面评估方法,通过公式min{cpu逻辑核数,参数设定的线程数},确定启动蒙特卡洛模拟线程的实际数量;

查询蒙特卡洛树搜索算法类实例中的博弈树搜索状态映射表,获取当前博弈局面的模拟胜率,作为当前博弈局面的局面评估值。

作为本发明进一步的方案:蒙特卡洛树搜索算法类,该类的实现形式为泛型类;该类的编译过程依赖本类库用户程序对博弈局面状态维护类的实现;该类的编译过程依赖本类库用户程序对博弈局面可哈希的、可唯一标识局面状态的数据结构的选择;该类的编译过程依赖本类库用户程序对策略描述数据结构的实现;

作为本发明进一步的方案:用户程序需要实现博弈局面状态维护类应包括:获取博弈局面哈希值的成员方法、获取当前博弈局面归属方的成员方法、获取当前博弈局面经过的累计回合数的成员方法、可选策略生成方法、返回博弈局面状态维护类实例拷贝的策略执行方法。

表级的线程互斥锁,实质上为一个原子变量与配套的使用权抢占、释放方法。

以局面哈希值为键,以局面对应的博弈树结点的搜索状态类实例为值的哈希映射表数据结构。该哈希映射表的条目存在性查询与条目添加过程将依靠表级线程互斥锁保障线程安全,即当前线程将循环等待并在抢占映射表使用权后执行条目存在性查询或条目添加,随后释放对映射表使用权的占用。

用户程序需要选择博弈局面可哈希的、可唯一标识局面状态的数据结构类型,如所有基本数据类型和c++编程语言中的bitset数据结构;

用户程序需要定义策略描述数据结构。

蒙特卡洛模拟胜利情况下的博弈树搜索状态更新方法,即同时更新模拟总数计数器和胜利总数计数器;

蒙特卡洛模拟失败情况下的博弈树搜索状态更新方法,即只更新模拟总数计数器。

作为本发明进一步的方案:通过结点级线程互斥锁的成员方法实现的基于循环等待的读/写状态抢占机制,包括:

①当结点级线程互斥锁处于空闲状态时,被写状态线程或读状态线程抢占;

②读/写状态线程都首先使用一轮循环等待确认线程互斥锁为空闲状态;

③读/写状态线程在确认互斥锁可用后立刻开始第二轮循环,尝试抢占互斥锁;

④若抢占失败,返回②过程;

⑤若读状态线程抢占互斥锁成功,将以互斥锁中的原子变量为读状态线程计数器,允许其他读状态线程共同占用互斥锁,不允许写状态线程占用互斥锁;

⑥在所有读状态线程释放对互斥锁的占用后,互斥锁回归空闲状态,允许被读/写状态线程抢占,即回到①状态;

⑦若写状态线程抢占互斥锁成功,将以互斥锁中的原子变量为独占标志,不允许任何其他读/写状态线程占用互斥锁,直至该线程释放对互斥锁的占用;

⑧若结点级线程互斥锁在构造实例时配置成有退让的互斥锁,互斥锁占用状态下的状态结点更新请求将直接被无视;

⑨若结点级线程互斥锁在构造实例时配置成阻塞的互斥锁,互斥锁占用状态下的状态结点更新请求将被阻塞直至互斥锁回到空闲状态。

与现有技术相比,本发明的有益效果是:

为了充分利用蒙特卡洛树搜索算法的泛用性与可并行化的特点,首先,本发明利用泛型编程技术实现了一个模板类,对蒙特卡洛树搜索算法进行封装,向所有计算机博弈系统提供调用接口;然后,本发明在搜索算法类的搜索状态索引表中添加表级线程互斥锁、结点级线程互斥锁,共两个粒度的线程互斥锁,并启动多个线程并行执行随机模拟过程,在线程间维护同一张搜索状态索引表。本发明在计算机博弈系统如棋牌游戏中,这种引擎具有广泛的适用性,优秀的通用类库提供了极大方便。该类库实现了经典的随机模拟算法——蒙特卡洛树搜索算法。该类库通过使用多线程技术,充分利用现代多核计算机的并行计算能力,具有高性能。该类库针对博弈搜索状态树设计了哈希映射表数据结构并创造性地设计了配套的、多粒度的、具有让步机制的高效互斥锁组件。类库采用泛型编程技术实现,对各种计算机博弈问题求解场景具有强泛用性。

附图说明

图1是本发明的详细结构示意图。

图2是本发明中表级线程互斥锁抢占机制示意图。

图3是本发明中结点级线程互斥锁抢占机制示意图一,读状态请求。

图4是本发明中结点级线程互斥锁抢占机制示意图一,写状态请求。

具体实施方式

下面将结合本发明实施例,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

并行计算机博弈搜索引擎在博弈系统中有很多适用场景,视情况可以代替基于深度优先搜索算法的精确搜索算法。

实施例1

本发明实施例中,点格棋游戏系统是一种典型的棋类计算机博弈系统,5×5网格棋盘的点格棋作为国际计算机奥林匹克大赛项目,既具有娱乐性且益智,又可以用作考验博弈树搜索引擎性能的途径。

本实施例中,一种通用并行计算机博弈树搜索引擎类库,与用户程序,即点格棋游戏的博弈局面维护类与配套的策略描述类,都使用c++编程语言,c++11标准来实现。

点格棋用户程序按照本发明类库的要求,选择编程语言默认提供哈希方法的std::bitset<69>数据类型为博弈局面的唯一键(索引)数据类型。用户程序还定义了名为move的结构体数据结构用以描述点格棋策略。

点格棋用户程序按照本发明类库的要求,实现了博弈局面维护类s,与所有必需的成员方法,这些方法的接口定义形式如下:

①博弈局面维护类默认构造方法:s(),即默认的博弈局面维护类初始化方法;

②局面键获取方法:bitsetget_key(),不需要向该方法提供任何参数,方法返回值为描述当前局面的c++的std::bitset<69>类型数据结构;

③生成可选策略方法:voidmake_moves(std::vector<move>&legal),需要向该方法提供空的可选策略容器,本实施例中选用c++编程语言中的std::vector&lt;move&gt;引用类型数据结构作为可选策略容器,容器名为legal;

④执行策略方法:smove(movem),需要向该方法提供将执行的策略,策略由move类型数据结构来描述,策略名为m,方法返回值为当前博弈局面执行过制定策略后的新局面,由数据结构s,即博弈局面维护类来描述;

⑤获取局面信息方法,intget_turn(),intget_turn_num(),intgame_over(),本实施例中,获取局面信息方法方法被拆分为三个方法,分别获取当前局面的行动权归属方的标识值、博弈中各方累计行动回合数和游戏结束判定结果,这三个局面信息都由整型变量来描述,其中,在点格棋博弈系统的用户程序中,游戏结束判定结果,可能由3个可能值,即游戏未结束的标识值、玩家1胜利标识值和玩家2胜利标识值。

调用通用并行计算机博弈搜索引擎类库包括如下步骤:

①执行“mcts<s,bitset,move>&&mcts=mcts<s,bitset,move>();”,即初始化蒙特卡洛树搜索算法模板类;

②执行“ss=s();”,即以默认形式实例化一个点格棋局面维护类对象;

③执行“state&&state=mcts.evaluate(s,c,60,8,1200,0);”,即调用蒙特卡洛树搜索算法模板类中的方法,令每个线程执行1200次模拟,评估目标局面;

④执行“state&&state2=mcts.evaluate(s,c,60,8,0,3);”,即调用蒙特卡洛树搜索算法模板类中的方法,共执行3秒模拟,评估目标局面;

⑤执行“move&&move=mcts.select(s,c,60,8,1200,0);”,即调用蒙特卡洛树搜索算法模板类中的方法,令每个线程执行1200次模拟,为目标局面选择最佳策略;

⑥执行“move&&move=mcts.select(s,c,60,8,0,3);”,即调用蒙特卡洛树搜索算法模板类中的方法,共执行3秒模拟,为目标局面选择最佳策略。

采用c++编程语言实现整个点格棋博弈系统后,进行了系统性能实测,测试软件环境为64位ubuntu16.04操作系统、gcc5.4.0编译器,硬件环境为coretmi7-6700hqcpu@2.60ghz×8处理器、15.6gb内存、466.1gb磁盘。

采用“g++-std=c++11"game.cpp"-wall-o3-o"game"-pthread”编译命令对程序源码进行编译。

程序输出如下:

1200simulationsperthread

3179/9600

3secondstimelimitforeachthread

18340/58384

1200simulationsperthread

(verticaledge,row:0,col:0)

3secondstimelimitforeachthread

(verticaledge,row:0,col:0)

其中,第2行输出表示8个线程以目标点格棋局面为模拟对局起点,进行了共9600次模拟,其中当前行动方的胜利次数为3179次,正处于劣势;

其中,第4行输出表示3秒内8个线程以目标点格棋局面为模拟对局起点,进行了共58384次模拟,其中当前行动方的胜利次数为18340次,正处于劣势;

其中,第6行输出表示8个线程以目标点格棋局面为模拟对局起点进行1200×8=9600次模拟后选择横向第0行第0列的边为当前最佳行动策略;

其中,第8行输出表示8个线程以目标点格棋局面为模拟对局起点进行3秒模拟后选择横向第0行第0列的边为当前最佳行动策略。

对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。

此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1