打印

计算机人工智能技术纵览-----2中级进阶

[复制链接]
3614|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
二、中级进阶(模糊状态机、决策树、寻路技术、博弈论)




(1)模糊状态机 (FuSM)


模糊状态机就是我们入门部分中的有限状态机(FSM)的进阶版本,它在有限状态机的基础上加入了模糊逻辑技术(Fuzzy Logic)


如果说有限状态机判断的是 是与非,0或1,那么模糊逻辑判断的就是0.0到1.0,或者是一个判断集合。


以下两点是模糊状态机与有限状态机重要区别:


1.有限状态机同一时间只能停留在一个状态上面,例如我们的乐高倒垃圾机器人,待命状态就不能移动,移动状态就不能倒垃圾。而模糊状态机则不然,它可以在同一时间运行多个状态,并且给每个状态分配不同的权重,例如,20%的移动状态 + 80%的倒垃圾状态。每个状态都可以处理这个权重植,例如20%的移动状态就是把移动速度降为原有的20%等等。
这样做的目的是什么呢?我们想象一下人类最自然的行为是怎么样的,我们倒垃圾和走路,不会说是像军训一样死板,先要立定,然后倒垃圾,一定等到垃圾桶完全还原,然后向后转,齐步走。这样太机械化,而我们人类则是非常连贯自然的行业,可能在垃圾桶倒完垃圾还没来得及翻转回来时,就开始了转身移动的行为。在转身移动的过程中,我们才慢慢的把垃圾桶翻转回来。这就是我们人类的模糊行为。


如果我们的乐高机器人加入了模糊状态机,那么他倒垃圾的动作,将会变的更加自然,连贯,和一点点随意,比如倒完垃圾后,就开始向后移动,开始是20%的权重,移动速度比较慢,慢慢的变成100%移动状态,而倒垃圾的80%状态则慢慢变低,最后结束倒垃圾状态。


2.有限状态机不会犯错,而模糊状态机会和人类一样有时会犯错误!


有限状态机在条件一定的情况下,状态是必定切换的,百试不爽,例如我们的乐高倒垃圾机器人,在识别到红外线传感器返回的值在30以下的时候,立刻切换到移动状态。如果我们使用的是模糊状态机,那么传感器在30以下,有可能不会切换状态,但是有时候确又可以切换,其中的具体概率由你控制


模糊状态机在状态的切换条件上面有一定的概率性和集合。你可以在一个判断集合中加入两条以上的条件,来决定是否切到某状态,而且还可以给不同的状态以不同的权重值。例如机器人感知的红外线并不明显,比如小于40的情况,这时机器人不确定你是否真的伸手放上了垃圾,有可能是误操作,这时他有可能根据不同的值,分配不同的权重,比如小于40时,80%的待命状态,20%的移动状态,小于30的时候,30%待命状态,70%的移动状态,这时如果人喊“停”的话,那么还是可以补救的,因为没有移动多远,如果人类没有进行干预,那么机器人会慢慢的把移动状态加到100%,而待命状态慢慢的降为0%并结束。也就是我们的机器人有了一定的误识别补救措施。






模糊状态机的基本原理到此结束,下面是程序员进阶部分:

相关帖子

沙发
keer_zu|  楼主 | 2015-4-3 09:31 | 只看该作者
=================如果你没接触过编程,可以忽略此部分====================


UML 状态图中也为模糊状态机提供了部分功能,例如下面的并发区域。


并发区域,就是同时进入了两个或两个以上的状态,同时运行。以一个粗竖线加若干个分叉来表示。同时有限状态机中提到的Boost.statechart库也完美支持并发状态。



想深入学习UML状态图的朋友请点击:http://www.cnblogs.com/ywqu/archive/2009/12/17/1626043.html


想深入学习模糊状态机编程的朋友请点击:http://www.cnblogs.com/taoge/articles/1929169.html

使用特权

评论回复
板凳
keer_zu|  楼主 | 2015-4-3 09:31 | 只看该作者
(2)决策树(Decision Tree)


决策树在人工智能中的应用很多,离我们生活最近的,就是一款叫魔兽争霸3的游戏中电脑AI就使用的该技术,并在它的地图编程器中提供了编辑方法,这使我们很容易的就了解了决策树是干什么用的。




决策树其实就是上面模糊状态机的一种升级,可以把决策树上的每个子结点,想象成模糊状态机中的子状态。跟据不同的情况,切换不同的策略。




决策树和模糊状态机的区别主要在于,决策树可以静态化,数据化,和可编辑化。而模糊状态机是个较为动态的,状态可以随便切换,但是模糊状态机的结构不太好保存在硬盘中,不太好把他数据化,只能是个运行时的代码。




决策树在扩展性上面要好过模糊状态机,例如魔兽争霸3的电脑AI决策树就可以通过编辑器编辑,然后保存,分享给其它人使用。别人读取后,也会有相同的AI策略。缺点是决策树是一个阶段一个阶段递进的,前面已经走过的流程,就回不去了,是个树状延伸的过程,只能按照剧本前进,不能后退,而模糊状态机可以随意跳转到任意状态,灵活度好于决策树。

使用特权

评论回复
地板
keer_zu|  楼主 | 2015-4-3 09:32 | 只看该作者


这就是魔兽争霸3地图编辑器中的决策树编辑器,可以看到,电脑在英雄的选择上面,有六套分支概率都是17%,电脑有17%的概率从六个主要分支中选一个其中一个分支。例如第一个,首发圣骑士,次发大魔法师,三发山丘之山。召唤出这些英雄后,接下来就是考虑英雄如何升级技能,下面同样有三个分支,如果英雄是第一个被召出来的,那么就有1号加点方案,如果是第二个被召出来的,那么就用2号加点方案。。。。 这就是决策树的特点,分支嵌套分支。电脑AI的决策剧本,其实早已被人类编辑好,在游戏中只是照剧本演戏而已。

使用特权

评论回复
5
keer_zu|  楼主 | 2015-4-3 09:33 | 只看该作者
对于我们的EV3乐高机器人来说,官方自带的编程软件本身就是一个决策树系统,这个系统非常清晰和好用,缺点也很明显,对于细节上的编程和逻辑处理,决策树将会变的异常复杂,以至于整棵树过于庞大而难以编辑,这也是其它语言C/C++/C#/java语言等优势所在。


我们的乐高倒垃圾机器人官方编程软件中的程序:


这里不得不提一下专家系统,决策树的主要应用领域就是专家系统,由专家凭自己多年的经验给你编辑的一棵决策树,例如一个火灾救援预案启动后,专家系统就会告诉你现在这个阶段该干什么,比如问你火灾是几级,你输出1,那么专家系统会告诉你,首先要派出救援人员,然后向上级报告,做好之后,你发现伤员正在增加,对于不同的人数,专家系统会告诉你在一级火灾的情况下,多少伤员,需派出多少医疗车,二级火灾的情况下,多少伤员,需派多少车,这些都是一个树状结构。

使用特权

评论回复
6
keer_zu|  楼主 | 2015-4-3 09:33 | 只看该作者
(3)寻路技术(搜索算法)



搜索算法就是教机器人如何找东西的技术,找的东西是多样化的,可以找创意,找策略,找路径,找物品,找一切一切。它们是通用的,也就是搜索算法相同,但是找的东西不一样而以,最常见的,当然是教机器人如何找到目的地了,例如机器人走迷宫。


我们篇头的乐高自动倒垃圾机器人其实是不清楚垃圾桶在那里的,他的移动完全是固定死的,如果这个垃圾桶换了位置,那么他还将移动到原先的地方。这里就要用到我们的寻路技术,教机器人如何到达指定地点,而且是走最短捷径。


首先寻路技术的前提是要给机器人一张地图,告诉他那里有障碍物,那里是边界,能不能连地图都不给呢?能,只不过要运用到我们下一篇----3高端智能里的那些技术了,现在先让我们的机器人能够分析人类给它的地图。分析地图主要运用到了数学上的《图论》知识。





一、depth first search (DFS) 深度优先算法


视频演示:http://upload.wikimedia.org/wiki ... 0_DFS.ogv.480p.webm


可以看到机器人在分析这张地图,这张地图没有障碍物,但是机器人分析了好久,从起点开始,深度优先算法的特点就是一条道走到黑,不撞南墙不回头,只有到了不能走的地方,他才回过头来尝试其它路线。


深度优先算法非常的耗时,在超大地图往往很难走到终点,而且请注意,深度优先算法最终得到的路线,就算是能达到终点,也不一定是最短路径,通常是绕了很多冤枉路的。






二、breadth first search (BFS) 广度优先算法


这是一张带有障碍物的地图:



000000000000000000000000
00000000000#000000000000
000000000000000000000000
000000000XXXXX0000000000
000000000X0&0X0000000000
000000000X000X0000000000
000000000000000000000000


为了能展示机器人分析路线的过程,只能采用这种极为抽象的数字地图了,其中0代表可走路径(空地),X代表障碍物,#代表起点,&代表终点。


这时机器人站在#点,开始在地图上面搜索到达&点的最短行车路线。


我们用123456789,来代表AI搜索后留下的标记,数字代表机器人走过的步数,2就代表机器人从起点要走2步才能到达该位置。


000876543211123456780000
00087654321#123456780000
000876543211123456780000
000876544XXXXX4456780000
000876555X090X5556780000
000876666X808X6666780000
000877777780877777780000


这时我们找一下地图上那个唯一标识为数字9的就是终点,说明机器人已经在地图上搜索到了终点,这条路径需要从起点走9步才能到达,那么怎样才能得到这个路径呢?很简单,从终点反向查找到起点,就是9找8,8找7....一直找到起点,这条路径,就是该地图起点到终点的最短路线。分析完地图之后,机器人就可以按照这个路线移动到目的地了,当垃圾桶变换位置时,只要在地图中也把终点设置到相应的位置,然后重新计算路线就可以了。将地图等比缩放到现实场景中的大小,可以得出1格相当于现场的多少米,让机器人走相应的距离,跟据路线转向就可以了。



使用特权

评论回复
7
keer_zu|  楼主 | 2015-4-3 09:34 | 只看该作者
三、A* search algorithm (A星算法)

这张图是动画的,如果看不见,请点击图片直接看图。 可以说这是理解A星算法最直观的一张图,相信一些没有基础的朋友,也可以从该图中看出点什么。


A星算法其实就是我们上面讲的两种算法的结合版,是目前搜索速度最快的算法。深度优先会一条路走到黑,而广度优先又会磨磨机机每个方向都尝试走一小步。而两者结合的A星算法则最符合人类的思考方式,即然我已经知道终点在东北方向,那么我就先向东北方向一条道走到黑,当发现碰到南墙无法移动的时候,我再用广度优先每个方向都试着走那么一小步,如果发现那个格子已经绕过障碍物,那么再次用深度优先的方法向着终点进军。反复如此,快速到达终点。


原理说起来很简单,不过要真的把这个算法用程序的方式写出来是很复杂的,以下为程序员进阶部分:

使用特权

评论回复
8
keer_zu|  楼主 | 2015-4-3 09:35 | 只看该作者
====================如果你没接触过编程,可以忽略此部分===================



我们来看一看具体过程


A*算法之所以带*,是因为这个星代表着估价函数,A星算法可以看作是一种带有估价函数的广度优先算法。


估价函数如此重要,让我们来详细认识一下他:

上图每个格子中都有三个数字,他们是左上角的f,左下角的g 右下角的h,n代表这个格子结点。

f(n) = g(n) + h(n)

f(n)是节点n的总估价值

g(n)就是在地图中从初始点到该节点走过来的花费

h(n)就是从该节点到终点的估算代价。

其中g(n)是已知的。我们需要提供的是h(n)估价函数


常用估价函数有:

设当前点的坐标为(x,y),结束点的坐标为(xB,yB)

1)Manhattan distance(曼哈顿距离):


曼哈顿距离是标准的启发式函数,即:两点在南北方向上的距离加上在东西方向上的距离。之所以被称为曼哈顿,是因为它看起来像计算城市中从一个街道走到另外一个街道的步数,由于城市中是不可能沿对角线斜着穿过建筑物的,所以该方法很适合估算街道多的城镇地图。
公式:
  h(n) = abs(x-xB) + abs(y-yB );





2)对角线距离:

对角线距离比较适合寻路中允许对角运动的,该公式很适合野外,树林,障碍物较少而且零散的地图。

公式:
h(n)=max(abs(x-xB),abs(y-yB))


3)Euclid distance (欧几里德距离):
  如果寻路中单位可以沿着任意角度移动,那么可以使用直线距离。也就是我们俗话说的迷宫的道路可以斜着走。

公式:
  h(n) = sqrt((x-xB)^2 + (y-yB)^2); (南北的平方+东西的平方)开方

  该函数比较适合地图障碍物不均,有的地方多,有的地方少,有横平树直的街道,也有可斜走的野外地图。




我们现在已经知道估价函数是什么东西了,上图中运用的是曼哈顿距离估价函数,方便计算,曼哈顿只需将当前格与目标点的上下步数和南北步数相加即是估价值,这个h(n)值写在格子右下角,这个格已经走过的步数g(n)写在左下角,一步等于10分,斜着走一步等于14分,最后把f(n) = g(n)+h(n)两者的合写在左上角做为该格子的总估价值f(n),总估价值越低的格子,越有可能是到达终点的最短路径的必经之路。


我们来看A星算法的具体行动步骤:


我们要准备两张列表,开放,封闭列表(open表,close表),上图中绿色为开放列表,蓝色为封闭列表,蓝色中的金色是最终从蓝色列表中选择的最短路径。


准备好两个表之后:

1)将起点周围结点用估价函数f(n)计算预估值并放入Open表中,并将指针标志指向父节点也就是起点。起点本身放入close表中;

2)从Open表中取估价值最小的节点n , 判断如果是终点则结束寻路,否则继续下一条;

3)循环(n节点周围所有结点x)
{

如果( x结点在open表中)
{
如果(新G值 < x在open表中的旧G值)
{
1.更新open表中的x结点的父结点指针指向 n结点,并采用新G值计算x结点的f值
}
}
否则又如果 (x结点在close表)
{
如果(新G值 < x在close表中的旧G值)
{
1.更新close表中的x结点的父结点指针指向 n结点,并采用新G值计算x结点的f值;
2.把X结点取出放入open表;
}
}
否则
{
1.求X结点的估价值;
   2.将X结点放入OPEN表中;
}
}

4)把n结点从open表取出,放入close表中;

5)按照估价值将open表中的所有节点排序,使f值最低的节点排在最前面;

6) 返回重新执行步骤2),直到找到终点,或者open表为空说明在当前地图跟本没有路可以到达终点;







使用特权

评论回复
9
keer_zu|  楼主 | 2015-4-3 09:40 | 只看该作者
四、Dijkstra algorithm (迪杰斯特拉算法)

我们发现虽然A星算法速度很快,但是他用的地图是很简单的,这张地图中没有标明那些地方不好走,那些地方好走,而且都是方方块块的,而现实中,很多地形是很不规则的,例如上图,只有很少的路可以走,并且每条路的路况是不同的,例如有的地方是地毯,磨擦力较大,机器人移动会很吃力,那么这条路上面的权重就会很高,以标识这条路的难走程度。


Dijkstra算法就是在这样一张带有不同路况,且路线不规则的地图上分析的算法。其它部分和A星原理相同


仔细观察上图,就可以看出机器人通过Dijkstra算法的寻路详细过程

使用特权

评论回复
10
keer_zu|  楼主 | 2015-4-3 09:41 | 只看该作者
五、Dynamic A* Algorithm (D星算法)
D星算法,顾名思义,动态的A*算法,我们前面的迷宫是地球上的,我们现在换成火星上的迷宫,其实D星算法就来源于美国宇航局火星探测器上的寻路方法。


火星与地球不同,地势变化莫测,陨石,地震山体塌坊都是经常性的。你的探测器到火星上跟据A星算出最适合的一条路线后,很有可能过一会某处就被陨石把路给堵上了。你要跟据时时变化的地形来不断的重新计算A*算法,跟据地图的不断变化来到达目标,这就是D星算法。


还是回到我们简单的乐高机器人倒垃圾这个例子来说,如果加入D星算法,那么我们的机器人就增加了实时应变能力,例如你可以在他移动过程中,将某一路线堵死,然后机器人会重新选择其它路线来到达目标。D星算法应该是目前最先进的机器人寻路技术了。

使用特权

评论回复
11
keer_zu|  楼主 | 2015-4-3 09:44 | 只看该作者
@yyy71cj   转来的。

使用特权

评论回复
12
keer_zu|  楼主 | 2015-4-3 12:54 | 只看该作者

使用特权

评论回复
13
keer_zu|  楼主 | 2015-4-4 11:50 | 只看该作者
yyy71cj 发表于 2015-4-4 10:38
嗯嗯,这种博弈精彩

什么博弈?没明白

使用特权

评论回复
14
keer_zu|  楼主 | 2015-4-5 16:46 | 只看该作者
yyy71cj 发表于 2015-4-4 17:59
把人类的一些天性,用机器的逻辑来描述,这就是一种逻辑思想博弈

是啊,一直在模仿,只有上帝才是最牛的。

使用特权

评论回复
15
yuyo1992| | 2015-4-19 12:14 | 只看该作者
HAONIU

使用特权

评论回复
16
keer_zu|  楼主 | 2015-4-28 12:07 | 只看该作者

使用特权

评论回复
17
keer_zu|  楼主 | 2015-4-28 12:07 | 只看该作者

使用特权

评论回复
18
zghskh| | 2015-5-6 08:16 | 只看该作者
好帖,不明觉历!

使用特权

评论回复
19
keer_zu|  楼主 | 2015-5-6 09:57 | 只看该作者
zghskh 发表于 2015-5-6 08:16
好帖,不明觉历!

我也在学习中

使用特权

评论回复
20
gxwzq| | 2015-5-12 23:25 | 只看该作者
niuren

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1313

主题

12256

帖子

53

粉丝