基于Qt有限状态机人工智能的一种实现及改进方法
人工智能在今年是一个非常火的方向,当然了,不仅仅是今年,它一直火了很多年,有关人工智能的一些算法层出不穷。人工智能在很多领域都有应用,就拿我熟悉的游戏领域来说吧,一些寻路算法,比如说A*算法(我的《十日驱鬼记》就曾经使用了A*算法进行寻路),还有一些高级的算法,比如说决策树等,都在游戏中得以了广泛的应用。我目前想制作的项目和人工智能也有一定的关系,因此,我这个月开始学习搭建一些简单的人工智能框架。
蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/46628447。欢迎同行前来探讨。
Qt为了更加方便地在既有的GUI界面上增添更加复杂的逻辑,在4.6的时候引入了有限状态机这个概念。有限状态机指的是以限定个数的状态进行相互转换,而形成的一种有机的整体,它在游戏中用得也非常多,我以前在制作游戏项目的时候也见过自己制作有限状态机来处理复杂逻辑的。因此我开始重新拾起有限状态机,看看能不能更深入地挖掘它的内容。
如果你和我一样了解了QML的用法,那么一定会有印象,Qt 将有限状态机模块移植到了QML环境中来了。要使用QML的有限状态机,需要来一句“import QtQml.StateMachine 1.0”这样的声明。Qt的文档非常丰富,在介绍有限状态机的时候甚至专门有一个章节,叫做“The Declarative State Machine Framework”,来介绍它的用法。如果大家还对QML的有限状态机不是很熟悉的话,还是看看这篇Qt帮助文档吧!
Qt的有限状态机,分为两个重要的内容。一个是“State”,指的是具体的某个状态,另外一个则是“Transition”,指的是两个状态之间的具体的转换。我在使用的时候发现,QML提供的有限状态机,只提供了SignalTransition以及TimeoutTransition这样的转换,并没有像Qt那样提供很多实用的Transition。刚开始尝试简单的时候,觉得还好,但是想到以后的状态机异常复杂,一旦涉及到的状态千变万化,就可能要写很多的状态,实在是不方便。我拿我正在制作的项目打比方吧:
上图是一个非常简单的有限状态机,它只有入口,没有出口,并且只有三个状态。除了初始状态s1之外,只是在s2和s3之间做切换。在图中,方框表示状态,箭头表示一个转换(transition)。那么不包括开始那个箭头,我们这里总共出现了6个状态,也是3×2个状态。用QML代码表示的话,是这个样子:
QtObject
{
id: root
signal output( string text )
property string input
property var stateMachine: StateMachine
{
running: true
initialState: s1
State
{
id: s1
onEntered: o