转自人工智能贴吧 http://tieba.baidu.com/p/2707182053?see_lz=1 我觉得讲的非常的通俗。
-------------------------------------------------------------------------------------------------------------
本文尽量用简单的例子,易懂的语言来综述一些人工智能的主流技术,其实很多看似高深复杂的技术原理,都是可以用一句话直接点透核心原理。
请注意:本文有的技术被分为两个部分,第一部分为面向初学者的原理介绍,第二部分为面向程序员的进阶编程内容,非程序员请忽略第二个部分。
为了能直观简单的领略人工智能技术从低到高的过程,我们从最简单的乐高机器人自动倒垃圾开始。其实楼主写这篇文章也是自我学习的过程,开发了很多年的游戏,人工智能技术运用了不少,但是都是在虚拟游戏世界中的,但是这回买了一台真正的机器人,很想将这些技术运用在现实中,于是整理了这篇文章
http://www.tudou.com/programs/view/jzkkUHmMSbM
一、入门技术
(1)自动流水线技术
这是最为简单的人工智能技术了,程序中可能连IF ELSE 都不需要,以这个乐高机器人倒垃圾的程序来说,他的步骤很简单:
1.启动 2.电机后退10圈 3.左电机转3圈(转身) 4.电机前进5圈 5.翻转垃圾桶,倒垃圾 6.等待2秒后,翻转还原垃圾桶 7.原路返回
这项技术的缺点也很明显,由于简单,可以说应付不了任何突发情况,而且只要把他放在别人家里,或者更换起点,他就找不到垃圾桶的位置了。
---------------------------------------------------------------------------------------------------------------
(2)布尔逻辑 IF ELSE
这个技术就是我们程序员最喜欢的 if else了,如果...那么... 否则...
比如这台倒垃圾机器人,我们可以利用头上的红外线传感器,做if else判断,如果红外线传感器返回的值小于XXX,那么就开始倒垃圾,这样就比流水线机器人智能一些,他可以通过红外线传感器,感知到你在伸手在他面前放垃圾,然后他会自动开启1中所示的程序。
--------------------------------------------------------------------------------------------------------------- (3)有限状态机(FSM)
可以说,从现在开始,才真正的进入了人工智能的领域,上面的只是最基本的程序概念。
有限状态机,其实就是由更多的IF ELSE来实现的,简单的理解就是IF ELSE的多层嵌套。
例如,这个倒垃圾机器人,就可以有三个状态:
1.待命状态
2.移动状态
3.倒垃圾状态
【状态机第一个重要功能:就是可以自定义状态切换的顺序】
例如这三个状态的切换是这样的 1.待命 2.移动 3.倒垃圾 4.移动 5.待命
他比IF ELSE的优势在于,状态机可以随意跳转到任意状态,反复执行,而不是固定死的流程。
【状态机第二个重要功能,就是可以赋予每个状态,不同的响应】
例如,我们可以只在待命状态下,加入IF ELSE ,如果红外线传感器值<XXX(感知到前方有人手在放垃圾) ,那么跳转到移动状态。 这样,这段IF ELSE 只会在待命状态下生效,而移动过程中,则不受干绕。
【状态机第三个重要功能,就是历史记录功能】
例如在移动状态中我们写了一个IF ELSE,如果声音传感器收到了“停”这个声音,那么跳转回待命状态,并记录当前已经走过的步骤,比如已经后退了10圈,并转身2.5圈。那么在待命状态下,我们又给机器人放上额外的垃圾,触发机器人的移动状态,这时机器人不会从移动状态的开始进行,而是从我们刚刚停止的那个位置进行,机器人会知道他已经后退了10圈,并转了一半的身,这时他们继续转完剩下的一半,然后前进5圈,跳转到倒垃圾状态。
有限状态机的基本原理到此结束,下面是程序员进阶部分:
====================如果你没接触过编程,可以忽略此部分===================
对于有限状态机,在程序中有个通用的图纸表达方式,那就是UML图中的状态图(Statechart Diagram)
图中展示的,就是一张状态机图:
箭头:代表我们说的第一个功能,状态切换.
方框:代表我们说的第二个功能,自定义状态功能,大的方框代表大状态,里面可以包含多个子状态,子状态里面还可以包括更小的子状态。每个状态的功能都是不同的。
(圆圈H)图标:代表我们说的第三个功能,历史记录,例如关闭电源状态Power Off,会记录当前其它状态的运行情况,然后再次开机时,继续原有的进程运行。
想深度学习UML状态图的朋友请点击:http://www.cnblogs.com/ywqu/archive/2009/12/17/1626043.html
这里推荐一个C++状态机程序库,Boost库中的statechart库。
Boost是大名鼎鼎的C++准标准库,相信C++程序员都不陌生,但是其中statechart库确很少有人使用,Boost.statechart库完美的支持UML状态图,跟据图纸,你可以轻松的用boost.statechart库搭建你需要的有限状态机组。
想深度学习C++ Boost.statechart库的请点击:http://blog.csdn.net/521/article/details/5565144
--------------------------------------------------------------------------------------------------------------- 工作比较忙,中级部分内容待续中......(模糊状态机FUSM,决策树,博弈论,A星D星寻路算法,空间搜索算法)