对弈类游戏的人工智能(一)

前言:
  对弈类游戏的智能算法, 网上资料颇多, 大同小异. 我写这篇文章, 并非想做互联网的搬运工. 而是想对当年的经典<<PC游戏编程(人机博弈)>>表达敬意, 另一方面, 也想对自己当年的游戏编程人生做下回顾.
  这边我们以黑白棋游戏为例, 从博弈学习两方面来阐述游戏AI的编写要点. 本文侧重于讲述博弈(评估函数+博弈算法).
  

博弈:
  以前看围棋比赛, 常有人评价棋手水平高: 大局观强(评估局面好), 算路精准(计算步数深, 实战效果好). 他山之石可以攻玉, 对弈类游戏的AI本质上也是在评估局面, 博弈深度这两点上做足了文章.
  (一)评估函数:
  让我们先来谈谈局面评估, 那如何从程序的角度去合理评估游戏的局势呢?
  首先局面的好坏, 需要综合考虑多个因素(权重不同, 不同阶段重要性的变化), 其次因素影响力需转化为数值来衡量.
  为了简化模型, 我们引入评估函数G(s), s为当前的局面, G(s)为当前局面的评估值.

G(s) = a1 * f1(s) + a2 * f2(s) + ... + an * fn(s)

  注: fi(s)为某个评估因素的得分, ai为某个评估因素的权重比
  评估函数G(s)的引入, 为游戏AI的智能引入了数学模型, 也是一切的基础.
  回到黑白棋游戏本身, 依据经验选定如下特征评估因素:
  1).地势估值表
  黑白棋和围棋一样, 也遵守着"金角银边烂肚皮"的定律, 四个角的地势值非常大, 其次是四条边. 因此我们再给8*8地图点分配地势值时, 大体满足角边重, 中腹轻的模式.

potential_enegy(s) = ∑ pe[x, y] {map[x,y] is occupied, 8>x>=0, 8>y>=0}

  注: potential_enegy(s) 为地势评估函数, pe[x,y] 为地势估值矩阵, map[x,y]是游戏地图本身.
  2).行动力
  基于这样的假设: 在某局面中, 选择多, 则灵活主动, 而选择少, 则往往陷入被动. 因此选择多少, 就成为了评估局面好坏的参考因素了. 于是我们把面对某一局面, 可以落子的个数, 称之为行动力.
  3).稳定子
  所谓稳定子, 是指无论如何, 都不可能被翻覆的子, 最简单的稳定子就是4个角点, 稳定值越多, 获胜的几率就越大.

  有了这些评估因素后, 再赋予一定的权重系数, 评估函数就比较完善了. 此时游戏的AI也基本构建完毕, 其棋力能击败初学者, 应该不成问题.
  但此时的AI很脆弱, 看似每步都选择最佳落子, 却很容易落入陷阱. 这就是贪心算法, 导致的局部最优陷阱. 如何破这个局呢? 期待王者到来: 博弈树.
  (二)博弈树:
  博弈树本质就是极大极小的搜索过程,相关资料可参考博文: "极大极小博弈树". 
  极大极小的算法, 分支繁多而冗余, 于是引入alpha+beta剪枝做优化, 它可以快速裁剪不必要的搜索分支, 提高搜索效率.
  关于这块, 就不再具体展开, 参见如下博文: A*算法/博弈树, 机器博弈中的基本搜索算法;
  alpha+beta剪枝的极大极小过程示意图:
  

  负极大值算法伪码:

// 负极大值算法
int negamax(GameState S, int depth, int alpha, int beta) {
	// 游戏是否结束 || 探索的递归深度是否到边界
	if ( gameover(S) || depth == 0 ) {
		return evaluation(S);
	}
	// 遍历每一个候选步
	foreach ( move in candidate list ) {
		S‘ = makemove(S);
		value = -negamax(S‘, depth - 1, -beta, -alpha);
		unmakemove(S‘)
		if ( value > alpha ) {
			// alpha + beta剪枝点
			if ( value >= beta ) {
				return beta;
			}
			alpha = value;
		}
	}
	return alpha;
}

展望:
  有了评估函数和博弈树后, 其游戏AI有了飞跃的进步, 但一山更有一山高, 我们是否能够更进一步呢?
  对于评估函数, 我们当前的策略是基于经验, 选择评估因素和权重分配. 能否用机器学习的方法,自动实现因素(特征)选择, 权重系数合理分配呢?
  而对于博弈算法本身, 是否还有优化的地方? 搜索深度和搜索分支的广度如何权衡?
  最重要的如何设置进阶的AI难度, 增强用户的体验?
  因篇幅受限, 决定放到下一篇博文中.

总结:
  为何选择黑白棋作为对弈类游戏AI解说的对象, 一方面游戏规则简单, 另一方面其评估模型容易构建, 且其搜索分支少+搜索深度深, 这些对快速实现并理解博弈游戏的AI核心算法有非常大的帮助. 该博文主要讲述了评估函数和博弈树的原理和优化. 下文讲着重讲述下 博弈游戏的AI如何学习, 以及性能优化的进阶篇.

写在最后:
  
如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.

  

  

 

时间: 2024-10-05 19:38:39

对弈类游戏的人工智能(一)的相关文章

对弈类游戏的人工智能(2)--学习算法

前言: 对弈类游戏的智能算法, 网上资料颇多, 大同小异. 我写这篇文章, 一方面是对当年的经典<<PC游戏编程(人机博弈)>>表达敬意, 另一方面, 也想对自己当年的游戏编程人生做下回顾. 上一篇博文:对弈类游戏的人工智能(1)--评估函数+博弈树算法, 着重讲述了评估函数+博弈树, 本文着重讲述学习算法, 以及性能优化和游戏性问题. 分析: 评估函数的引入, 为游戏AI提供了理论基础. G(s) = a1 * f1(s) + a2 * f2(s) + ... + an * fn

对弈类游戏的人工智能(5)--2048游戏AI的解读

前言: 闲得没事, 网上搜"游戏AI", 看到一篇<<2048游戏的最佳算法是?来看看AI版作者的回答>>的文章. 而这篇文章刚好和之前讲的对弈类游戏AI对应上. 于是有了想法, 想把它作为一个实例来进行解读, 从而对之前偏理论的文章做个总结. 承接上四篇博文: (1). 评估函数+博弈树算法 (2). 学习算法 (3). 博弈树优化 (4). 游戏AI的落地 可能有些人会疑惑? 2048并非对弈类类型? 传统的博弈树模型是否能应用于此? 客官莫急, 让我们来一

对弈类游戏的人工智能(3)--博弈树优化

前言: 对弈类游戏的智能算法, 网上资料颇多, 大同小异. 然而书上得来终觉浅, 绝知此事要躬行. 结合了自己的工程实践, 简单汇总整理下. 一方面是对当年的经典<<PC游戏编程(人机博弈)>>表达敬意, 另一方面, 也想对自己当年的游戏编程人生做下回顾. 承接上两篇博文: (1). 评估函数+博弈树算法 (2). 学习算法 这篇博文回归到博弈树这边, 具体阐述下博弈树的优化手段, 为了游戏性添加的合理技巧. 启发搜索: 博弈树本质是极大极小的求解过程, 而alpha+beta剪枝

谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现

一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者在学习时期和客户端美术策划的小伙伴一起做的游戏,笔者主要负责游戏服务端开发,客户端也参与了一部分,同时也是这个项目的发起和负责人.这次主要分享这款游戏的服务端相关的设计与实现,从整体的架构设计,到服务器网络通信底层的搭建,通信协议.模型定制,再到游戏逻辑的分层架构实现.同时这篇博客也沉淀了笔者在游戏公司实践五

html5文字冒险类游戏《归途》从零开始(0)

转眼从太原来到上海一个多月了,实习也稳定下来了,开始记录自己第一个游戏的制作历程. 首先是技术方面的选择,因为同时肩负着前端技术的练习和定题时定为<基于安卓的文字冒险类游戏归途的设计与实现>的毕业设计,而且我现在在做的实习是JavaWeb开发,所以选择html5是在我知识范围内最不造成冲突的方案. 然后谈谈游戏本身,顾名思义,准备展现一个人在回家路上遇到的种种给人带来一些思考.最初的构思是一个互动短剧的形式,在火车车厢上进行点击探索推动情节发展,根据对话选项和探索程度的不同触发不同的路线和结局

unity3d游戏开发经验之对于关卡类游戏的技巧

过关类游戏在单机类游戏中出现会比较多,但多以休闲为主,比如<Candy Crush>.<Angry Birds>.<P V Z>.<小鳄鱼顽皮爱洗澡>.<Tiny Thief>等经典休闲游戏,鉴于很多圈内人士预测2014年是手游爆发年,且重点在ARPG类型,似乎会冒出很多横版过关或者全3D的过关动作类游戏,我们就针对此类型的游戏进行分析. 首先,此类型的游戏需要关注的是每关卡的独立玩家数量,即玩家ID数量,目的是为了监测玩家主要集中在哪个阶段.比

cocos2d-x 3.2 之 三消类游戏——万圣大作战 (第四篇)

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 呼呼,第四篇咯, 本篇主要讲述 > 时间 > 分数 本篇结束后,整个三消游戏的基本步骤就搞定了 1. 添加时间 一般消除类游戏,要么关卡,要么限制时间,但是关卡的设计很麻烦,个体创作,没有那么多精力, 所以只能通过限制时间来使游戏有些可玩性,但这种可玩性极低啊

cocos2d-x 3.2 之 三消类游戏——万圣大作战

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 首先祝大家万圣节快乐呀~ 紧赶慢赶,第二款cocos2d-x游戏终于出来了. 万圣大作战 三消类的游戏 下面是游戏的一些截图~ 主界面 设置界面: 游戏界面: 结束界面:         和第一款2048相比, 多了 分数的本地存储(未加密) 音乐和音效的 设置

JavaFX战旗类游戏开发 第六课 移动范围的获取

有一段时间没有写这个战旗游戏Demo的教程了.现在来继续. 战旗类游戏的范围获取其实并不复杂,主要是节点的遍历和权值的比较. 大家知道,在A*Star最短寻径算法里,权值是有个G值和H值的,G值是起点到当前点的移动量(通常相邻两格移动量在1),H值是当前点到目标点的移动量估算值. 当然,对于SLG游戏中寻找移动范围,并没有这么复杂,我们在这里只需一个G值,用于表示移动量. 主要算法原理: 1.有两个List----OpenList,CloseList. 2.将要移动的角色位置,添加到OpenLi