人工智能发展现状及应用
导读:人工智能(ArtificialIntelligence),英文缩写为AI。人工智能被认为是第四次科技革命的核心驱动力,目前许多领域都在探索AI技术的应用,可谓方兴未艾。那么什么是人工智能,它经历了怎样的发展历程,现阶段发展状况如何,它有哪些应用。本篇文章就为大家做个简单分享。同时也会为大家详细介绍一下百度的AI技术体系。
本文主要内容:
1.人工智能概念
①智能
②人工智能
2.人工智能的发展
①人工智能的发展历程
②AI是中国的机遇
3.AI与百度
①百度AI的发展历程
②百度AI的技术体系
③百度AI的场景化应用
1.人工智能概念
1.1智能
谈到人工智能,需要首先理解“智能”一词的具体含义。智能是指人类才具有的一些技能。人在进行各种活动的过程中,从感觉到记忆再到思维产生了智慧,智慧产生了人类本身的行为和语言,行为和语言统称为能力;智慧和能力结合在一起就是人工智能中的智能一词。
比如,人类的语言表达能力就是一种智能(语言智能);人类进行复杂数学运算的能力也是一种智能(数字逻辑智能);人类的交往能力也是一种智能(人际智能),人们对音调、旋律、节奏、音色的感知能力,也是一种智能(音乐智能)。他们都属于智能的范畴。
1.2人工智能
把智能的概念与人的逻辑理解相结合,并应用到机器中,让机器能更好的模拟人的相关职能,这就是人工智能。人工智能就是要让机器的行为看起来就像是人所表现出的智能行为一样。
人工智能概念,最早可以追溯到上世纪90年代初,这个时候需要提到一位科学家:图灵。
艾伦·麦席森·图灵(英语:AlanMathisonTuring,1912年6月23日—1954年6月7日),英国数学家、逻辑学家,被称为计算机科学之父,人工智能之父。
图灵最早定义了什么是人工智能,怎样去界定一个机器(或一个设备)是否具备智能。他最早提出了图灵测试(即:一个人在不接触对方的情况下,经过某种特殊的方式和对方进行一系列的问答,如果在某些时间之内,他无法根据这些问题判断对方是人还是计算机,那么我们就认为这台机器具备智能化的思维)。直到2000年左右,才真正有计算机通过了图灵测试,才实现了一个突破。在2014年图灵测试大会上,出现了一个通过图灵测试的机器(或者称为智能聊天的机器人)。这两年人工智能的高速发展,也印证了最早的图灵测试,这也让我们反向看到了图灵在人工智能定义方面做出的突出贡献。
现今,在做图灵测试时,判断这个设备是否具备人工智能,更多的还是从模拟人的角度来考量。但在当前科技背景下,人工智能需要涵盖更广的内容,它不仅仅要模拟人本身的职能,还需要具备一些扩展、替代甚至延伸的职能。
举个例子,在医疗领域,需要经常在实验室进行病毒化验,人处这样的实验环境下会比较危险,经常会出现一些事故,如果能够用机器替代人来做这些实验,这些事故就可以避免。此时,这台机器就不仅仅是在模拟人,而是在替代人,机器本身就具备了替代人的能力。
当前,很多人在担忧:人工智能的发展会不会对人类造成威胁。其实,目前人工智能还处于早期的阶段(或者称之为婴幼儿阶段),我们还处于弱人工智能时代。
当然,随着时间的推移,将来我们可能会把弱人工智能时代推进到强人工智能,甚至再往前推进到超人工智能和智能爆炸时代。但至少目前,我们离这样的时代还有非常远的距离,要实现这样的目标,需要非常多的时间积累,可能要通过几代人甚至十几代人的努力。所以大家不要有过多的担心,人工智能现在更多的还是用于服务人类,用来提高人们的工作效率。
上图引自MIT大学一位教授。
针对人工智能所覆盖的领域,这位教授提出一个观点:“我们要尽可能避免做这些容易“进水”的工作,以免被日后所淘汰掉”。
这张图水平面以下的工作,如存储,计算、甚至象棋活动等,已经被海平面淹没。在海平面边缘的工作,如翻译、驾驶、视觉和音频等,很有可能在未来的一段时间,随着技术的进步也会被淹没。再来看图上高海拔地区的工作,如艺术创新、科学研究,文学创作等,让人工智能替代人类去做这些工作,在现阶段是比较困难的。要让人工智能实现像人一样具备主观能动性,还需要比较长的时间。我们在选择工作,或者在做技术探索的时候,应该从更高的层面布局,而把那些可以被人工智能替代的工作交给计算机去做,这样我们就可以从一些重复性、冗余性的工作中抽离出来,去专门从事创造性的工作(比如艺术创作等)。
2.人工智能的发展2.1人工智能的发展历程我们回顾一下人工智能发展的历程。
人工智能并不是特别新鲜的词,在计算机出现后不久,大家就已经开始探索人工智能的发展了。
1943到1956年这段时间,为人工智能的诞生期,期间有很多人尝试用计算机进行智能化的应用,当然此时不能称为人工智能,只是有类似的概念。
人工智能的分水岭是1956年达特茅斯会议,在本次会议上正式提出了AI这个词。
1956到1974年这段时间,是人工智能发展的黄金时代,是人工智能的第1个高速发展期,通常把这段时间称之为人工智能大发现时代。
1974到1980年这6年的时间里,进入了人工智能发展的第1个低谷,在这个低谷期,出现了非常多的问题,比如计算上的问题、存储上的问题、数据量的问题,这些问题限制了人工智能的发展。
1980到1987年这段时间是人工智能的第2个繁荣期。期间诞生了大量的算法,推动了神经网络的高速发展,同时出现了许多专业的科研人员,发表了许多创造性的论文。
1987到1993年这段时间是人工智能的第2个低谷期,期间有个词叫“AI之冬”。有大量的资本从AI领域撤出,整个AI科研遇到了非常大的财政问题,这是导致”AI之冬”的主要原因。
1993年之后,人工智能又进入到高速发展期,期间出现了许多经典案例,比如1997年IBM公司的深蓝案例,2001年IBM的沃森案例,2016年谷歌AlphaGo案例。这些案例是人工智能在应用层面的体现。
上图概括了人工智能的发展历程。
可以看到,从1956年达特茅斯会议AI这个词诞生,一直发展到现在,人工智能共经历了60多年的跌宕起伏,并不是仅在2016、2017这两年间才出现了人工智能这个概念。
从宏观上看,AI的发展历程经历了三次比较大的起伏。
第1次起伏是从1943年到1956年,首次出现了神经网络这个词,把人工智能推到一个高峰,期间出现了许多大发现。而第1次低谷使人工智能进入到了反思的阶段,人们开始探讨人工智能的应用。
第2次起伏是在上世纪80年代,期间BP算法的出现,神经网络新概念的普及,推动了人工智能又进入第2次高峰和发展。然而从1987年到1993年又进入到了了第2次低谷,这主要因为一些财政原因导致。
第3次起伏从2006年开始,由辛顿提出了深度学习的概念,把神经网络往前推动了一大步,也把人工智能推到了高速发展阶段,尤其是近几年在非结构化领域取得了许多突破(例如在语音与视觉方面),给人工智能进入商业化应用带来许多的基础性技术沉淀。
人工智能为什么会在前面的发展过程里遇到了那么多的坎坷?为什么在最近这几年会进入一个高速发展期?
我们归结了近几年人工智能高速发展的三点原因:
①算力飞跃
人工智能(尤其是深度学习),对底层计算能力的要求非常高。早期的计算受到了极大限制,从CPU发展到了GPU,使得算力几乎能达到几倍甚至十几倍量级的增长。再从GPU到TPU,计算速度能达到15~30倍的增长,使得在算力层面不断取得突破。此外,大量云资源的出现将我们计算的成本压到了最低,我们在处理海量计算的同时,也可以享受比较低的成本。再者,芯片技术的发展,使得端处理能力持续提高,这些都帮助我们在算力层面取得了很大的突破。
②数据井喷
从PC互联网时代到移动互联网时代,再到可穿戴设备的应用,都产生了大量的数据。这两年,每年产生的数据量可以达到50%左右的增长。2017年到2018年,这段时间内基本上每个月产生的数据量可以达到几十个亿的量级,数据量已经非常高。物联网的连接,能帮助我们把更多的数据采集回来,帮助我们在数据层面做更多的积累,这是数据井喷带来的积极影响。
③算法突破
近几年来,从机器学习到深度学习,算法不断取得突破。使得我们可以处理更多的大规模、无监督、多层次等复杂业务。
算法、算力、数据是人工智能的三要素,算力是骨骼,数据是血液和食物,算法就是大脑,三者不断取得突破,才能促进人工智能高速发展。
2.3AI是中国的机遇
人工智能技术的发展也促进了很多产业的发展。中国目前有非常好的历史机遇,不仅仅是在技术上有大量的积累,同时,国家也为人工智能的发展提供了非常好的政策环境。此外,市场空间、资金支持、人才储备,也都为人工智能的发展提供了非常好的条件。
通过上图可以看到,人工智能的研发人才目前还比较短缺。图上数据来源于领英在2017年所做的全球AI人才报告。以2017年的数据来看,全球人工智能专业的人才数量超过190万,在这190万人才中,美国处于第一梯队,有85万+;而中国在人工智能领域的人才积累比较少,从数据上来看,目前国内人工智能方面的专业技术人才可能只有5万+,当然这是2017年的数据,现在可能会有一些增长,但是量级也没有达到我们想象的那么大。
所以从国内目前来看,这约5-10万的AI技术人才,对比AI产业的高速发展需求,两者之间有巨大矛盾。那怎样更好的用这些人才作为突破,把人工智能方面的技术人才储备提高到百万级别。这正是整个百度(包括百度的教育合作与共建,包括百度所有对外输出的体系,包括我们今天所做的课程)所努力的方向,我们期望通过百度的技术赋能,真正的帮助人工智能取得更好的人才积累,真正培养一些在未来对人工智能行业有巨大贡献的专业人才,这是百度现在的定位目标。
AI浪潮已然到来,行业人工智能时代已经到来。目前,人工智能已经大量应用在2c和2b领域,怎么让人工智能跟具体行业有更好的接触,产生更多的积累,是我们正在重点探索的方向。
比如百度的搜索引擎,已经融入了很多AI元素。模糊匹配、拍照识图、深度挖掘检索等都应用到了大量的人工智能技术。
再如推荐系统,他会基于个人的一些喜好和历史阅读习惯来给用户做一些内容的推荐和匹配,这是很典型的结合大数据做的精准应用,实际上也属于人工智能的范畴。
再如人脸识别技术、语音技术、智慧交通和无人驾驶等,都是AI技术与行业应用的融合,并且这些技术正在不断取得突破。百度现在L4级别的无人驾驶车已经初步实现了一些小规模的量产,未来会有更多的人将真正的体会到无人驾驶给生活带来的便利。
3.AI与百度3.1百度AI的发展历程
上图为百度在人工智能领域的发展轨迹,早在2009年,百度就开始尝试探索人工智能相关技术,直到2019年,百度用了近十年的时间布局人工智能。
2009年尝试性布局人工智能,2013年发布IDL,2014年成立硅谷实验室以及百度研究院,2015年首次发布DuerOS,2016年发布百度大脑1.0版本,同年,百度的自动驾驶技术进入试运营状态,2017年是百度人工智能技术高速发展的一年,不仅成立了深度学习国家实验室,同时也成立了硅谷第二实验室以及西雅图实验室,并且Apollo平台开始运行并对外推广,在2018年到2019年,DuerOS和Apollo平台发展到3.0版本,百度大脑发展到5.0版本。经过近十年的发展和积累,百度的人工智能技术目前处于相对领先的位置。
百度在人工智能领域领域取得的进展有目共睹,比如,百度成立了首个国家级AI实验室;2016年被美国《财富》杂志评选为深度学习领域四大巨头之一;百度的刷脸支付、强化学习、自动驾驶等技术入选MIT2017年全球十大突破性技术;在AI领域,百度的中国专利申请超过2000项。
3.2百度AI的技术体系
百度的技术体系非常全面,覆盖了计算体系、大数据技术体系以及人工智能技术体系等,在机器学习、深度学习、区块链、知识图谱、自然语言处理、量子计算等领域均有雄厚的技术积累。这些技术可以按内容划分成三个板块,第一是A板块(即AI技术板块),第二是B板块(即大数据板块),第三是C板块(即云计算板块)。这就是百度在2016年提出的ABC概念。从一开始的1.0版本,发展到如今的3.0版本,代表着百度在人工智能领域的整体布局。在人工智能领域的布局中,百度的探索不仅停留在最核心的技术上,也同时将核心技术与更多的领域相结合,如边缘计算、物联网(InternetofThings,IoT)和区块链等,得到了如ABC+区块链、ABC+DuerOS、ABC+Apollo等对外输出模式,向各行各业提供解决方案。
在A板块中,将百度大脑分成了不同的层次。最底层是算法层,包含机器学习和深度学习算法,使用百度的PaddlePaddle深度学习框架提供算法层的基础支撑;算法层之上为感知层,感知层可分为对声音的感知和对光的感知,其中,对声音的感知主要是语音技术板块,对光的感知主要是图像技术、视频技术、AR/VR等技术板块;在感知层之上是认知层,认知层更多的是处理人类听到和看到的内容,对其进行深度理解,深度理解需要自然语言处理(NLP/NLU)、知识图谱等技术作为支撑,同时也需要积累大量用户画像数据,这些技术能帮助人们快速的理解和分析人类听到和看到的内容,并对内容进行有效的反馈,这是认知层面的技术;在认知层之上是平台层,平台层将底层的内容进行融合、封装,对外提供开放、完整的AI技术,并引入大量的生态合作伙伴,共同探讨人工智能产业的布局。
百度人工智能整体技术体系,最底层是深度学习框架飞桨PaddlePaddle,作为底层计算框架,飞桨PaddlePaddle支撑着上层场景化能力与平台中的全部板块。在场景化能力与平台中,包含了诸多场景大板块,每个大板块下又细分为多个技术板块,比如语音板块包含了语音合成以及语音唤醒等技术板块;计算机视觉技术中的OCR技术,包括传统通用OCR识别,以及垂直领域OCR的识别,可以对30多个OCR识别领域进行精准识别,比如票据识别、证件识别以及文字识别等;在人脸/人体识别板块,同时也会引入图像审核以及图像识别方面的技术;在视频板块,有视频比对技术,视频分类和标注技术,以及视频审核技术;在自然语言处理板块,有机器翻译技术;知识图谱板块,有AR/VR技术。这些板块构成了人工智能体系的技术蓝图。
近两年来,人工智能技术在各行各业中的应用不断加深,实践证明,单一的技术在落地时会受到诸多限制,所以现在人工智能在落地时可能不仅仅用到某一个单独的技术板块,而是需要先把这些板块进行融合,然后再进行实际应用,比如在拍照翻译的应用场景下,既需要用到OCR技术,同时也用到NLP技术。因此在实际应用中,需要综合各个板块的技术,把不同的技术体系和技术内容有机地融合起来,再去解决行业中面临的痛点。
3.3百度AI的场景化应用
2014年到2015年期间,在计算机视觉领域的部分场景下,计算机视觉识别准确率已经超过了人眼识别。而利用深度学习技术的计算机听觉识别,在2017年左右也已经超过人耳听力极限。
人工智能业务场景化不仅依赖底层的硬件资源,也需要超大规模的标注数据,这是监督学习的特点,所以在人工智能早期研究中,有评论说“有多少人工就有多少智能”,这句话在特定角度来看是具有一定意义的。在监督学习中,训练模型需要庞大的标注数据,再结合GPU强大的数据处理能力去训练特定模型,也就是从算法的层面去做更多的工作,在训练模型的过程中需要发挥人的主观能动性,更好的解决在行业应用中出现的一些痛点,构建出行业专属的模型。
比如,将人体分析技术应用到实际行业场景中时,需要结合人脸识别技术和人体识别技术。可以通过基础手势识别,识别一个人在开车时有没有系安全带、是不是在打电话等。
利用人体分析技术,可以做到行为识别,首先设定特定区域,然后对区域内的人员行为进行识别,比如人群过密、区域越界、人员逆行、徘徊以及吸烟等,在特定场景下,行为识别能够帮助用户避免安全隐患。
自然语言处理有很多相关技术,比如说词法分析、词向量表示、语义相似度、短文本相似度、情感相似度分析等。这些技术用在不同的应用场景下。
在公检法系统应用中,为了避免出现非常严重的问题,如同案不同判,具体解决方案是当诉讼呈递给法官时,根据当前诉讼内容在公检法系统中寻找历史上类似的案件,参考历史类似案件的判决,给法官提供判案依据。
在媒体领域应用中,对基础的财经类新闻,可以由机器进行新闻文章的编写,即机器写作。这些技术都是基于NLP在相应领域做的智能化应用,可以让编辑或记者从重复性的工作中解脱出来。
人工智能从广义上来看,也包括大数据及云计算相关技术,这些技术也都涵盖在百度AI技术体系中。在大数据领域,主要包括数据采集、数据存储、数据分析以及数据可视化等,利用这些技术,我们在进行模型训练的时候,对数据进行科学的管理可以帮助我们提高模型训练效率。
百度AI技术体系也提供算力层面的支持,通过GPU服务器以及FPGA服务器提供的算力,更好的解决应用层面的问题。
百度AI就是这样一个从基础层,到感知层、认知层的完整体系,为多行业、多场景提供“一站式解决方案”,力求实现“多行业、多场景全面赋能”。
回顾本篇文章,我们和大家分享了人工智能的相关概念,人工智能的发展历程,从中也可以看出AI是我们的历史机遇。同时本文也为大家详细介绍了百度的AI技术体系,经过10余年的努力,百度AI已经形成从基础层,到感知层、认知层的完整技术体系,为多行业、多场景提供“一站式解决方案”,力求实现“多行业、多场景全面赋能”。
人工智能经典案例
图6-21火星探矿机器人案例的环境示意图
“火星探矿机器人”的设计目标是要采集火星矿产,并将其带到预定的区域。
为此,该机器人具有以下一组基本能力。
移动。它能够在火星表面移动,能够从一个单元格移动到其上、下、左、右的相邻单元格。
探测。它配备了多种传感器,具有一定程度的环境感知能力,具体包括探测周围一定区间(如相邻多少个单元格)的矿产分布情况以及障碍物情况。
采集。它能够采集所在单元格中的火星矿产。
卸载。它能够卸载其采集的、放置在其体内的矿产。
交互。它能够与其他的机器人进行交互和协同,以更高效地采集矿产。例如,一个机器人探测到大面积的矿产,它可以将该矿产信息告知其他机器人,以便他们能够来该区域采集矿产。
为了充分反应探矿机器人的实际情况,我们对机器人作了以下假设:
①每个机器人存储矿产的容量都有一定的限度,即机器人内部只有有限的空间存放矿产,一旦机器人采集的矿产超出其存储容量,它必须将这些矿产卸载到特定的位置区域,以便能够再次采集矿产。
②每个机器人的能量都有一定的限度,机器人在移动、探测、采集、卸载等过程中会消耗能量,为此机器人必须在其能量消耗殆尽之前补充能量(如充电)。
③每个机器人的感知能力都是有限度的,它只能够感知其周围一定范围内的环境状况,如邻近两个单位的单元格。
下面通过多个场景描述机器人如何在上述火星环境下采集火星矿产,这些场景分别描述了机器人采矿的不同工作模式,反映了实现这些自主机器人的不同难易程度。
场景一:独立采集矿产。
在该场景中,有多个自主机器人参与到火星矿产的采集工作中,每个机器人都有移动、探测、采集、卸载的能力,它们在火星表面随机移动,根据其所在位置探测到的矿产信息和障碍物等环境信息自主地实施行为。
但是,这些机器人都是单独工作,它们之间没有任何交互与合作。
因此,可以将本场景中的每个机器人都抽象和设计为自主的Agent。
场景二:合作采集矿产。
在该场景中,有多个自主机器人参与到火星矿产的采集工作中,每个机器人都有移动、探测、采集、卸载的能力,它们在完成各自矿产采集任务的同时,相互之间还进行交互和合作,以更高效地开展工作。
例如,某个机器人探测到大片的矿产信息,那么它可以将该信息告诉给其他机器人,或者请求其他机器人来该区域采矿。
因此,可以将本场景中的机器人抽象和设计为由多个自主Agent所构成的多Agent系统。
该系统的设计和实现不仅要考虑到各个自主Agent,还要考虑到这些Agent之间的交互和协同。
场景三:多角色合作采集矿产。
在该场景中,有多个具有不同职责、扮演不同角色的机器人参与到火星矿产的采集工作中,每类机器人承担矿产采集中的某项工作(如探测、采集),它们之间通过交互和合作共同完成矿产采集任务,即该场景有多种类型的机器人,包括:
①采矿机器人,采集矿产并将其运送到指定区域;
②探测机器人,负责探测矿产并将其探测到的矿产信息通知给采矿机器人。
因此,可以将本场景中的机器人抽象和设计为由多个自主Agent所构成的多Agent系统。
该系统的设计和实现不仅要考虑到各个自主Agent,还要考虑到这些Agent之间的交互和协同。
显然,该场景比前一个场景更复杂,它涉及的Agent类型和数量、交互和合作关系等更多。
02
设计与实现
下面介绍如何基于多Agent系统的开发框架JADE开发“火星探矿机器人”案例。
为了简化设计,聚焦于Agent的构造和实现,“火星探矿机器人”案例中的环境被设计为一个M×M的网格,每个网格单元代表了一个地理位置,不同网格单元具有不同的地形信息,可能存在影响机器人移动的障碍物,火星矿产非均匀地分布在网格单元格中。
机器人驻留在网格环境中,可以在不同的网格中移动,感知网格周围的环境信息,如矿产、障碍物等,如果它发现所在的网格中存在矿产,那么它就挖掘矿产。
整个应用的界面如图6-22所示。
界面左部显示了机器人所在的环境(用网格来表示),它提供了多样化的图符以及数字信息表示环境中的机器人、矿产、障碍物等及其在环境中的分布情况。
机器人运行在网格中,因而任何时刻机器人都有其所处单元格的位置。
界面的右部显示了各种图符信息的说明以及系统和环境中机器人、矿产等数量的变化。
界面的下部提供整个系统运行过程中的各种动态信息,如某个机器人探测到矿产、机器人从一个位置移动到另一个位置等。
图6-22火星探矿多Agent系统的运行界面
系统在初始化时将自动生成机器人的运行环境,包括矿产、障碍物等的分布。
用户可以根据需要配置系统运行时的机器人信息,包括机器人的类型、数目等,设置机器人的基本属性,如机器人的观测范围、机器人的初始能量值等。
在实际开发中,我们具有以下的基本假设:Agent从初始位置出发在地图上随机单步移动,遇到障碍能够自动避开,能自动探测到其周边是否有矿产,一次只能采集一个矿产并将其运送到指定的矿产仓库。
1
●
环境的设计与实现
我们设计了一个环境类(对应于environment.java文件)表示和处理应用中的环境。
该类封装了以下一组属性和行为。
环境中的矿产,定义一个一维动态数组存放矿产的位置ArrayListMinePositions,其中Coordinate是一个类,定义了网格的坐标。
环境中的障碍物,定义一个一维动态数组存放障碍物的位置ArrayListObstaclePositions。
环境中的机器人,ArrayListrobots,该属性定义了处于环境中的一组机器人。
InitEnv方法,该方法生成网格环境并随机产生环境中的矿产和障碍物。
2
●
系统中的Agent和行为
根据应用案例描述,我们设计了如图6-23所示的一组Agent和行为,以支持场景一至场景三的实现。
图6-23系统中的Agent及其行为示意图
BasicRobot是一个基本的Agent机器人,它能够在环境中行走,具有随机行走RandomWalkBev的行为。
在本案例中,BasicRobot无须生成具体的Agent实例,而是被其他Agent所继承。
ExploreRobot是一个专门为场景一设计的Agent机器人,它继承了“BasicRobot”Agent的属性、方法和行为,具有探测矿产DetectMineBev、采集矿产DigMineBev、转存矿产DumpMineBev3个行为。
也就是说,该Agent可以独立完成探矿、采矿和存矿的功能。
但是,ExploreRobot不具有与其他Agent交互和协同的能力。
在场景一,系统可能会产生一个或者多个“ExploreRobot”Agent机器人。
ExploreCoopRobot是一个专门为场景二设计的Agent机器人,它继承了“ExploreRobot”Agent的属性、方法和行为,同时具有交互协同CooperationBev行为,能够与其他Agent机器人进行协同,以告知所探测的矿产信息。
在场景二中,系统可能会产生一个或者多个“ExploreCoopRobot”Agent机器人。
场景三包含两类不同的Agent机器人:
一类是专门探矿的机器人DetectMineRobot,它具有探测矿产DetectMineBev、交互协同CooperationBev两个行为,可以实现探矿并将所探测到的矿产信息告诉给其他的Agent机器人;
另一类是DigMineRobot,它具有采集矿产DigMineBev、转存矿产DumpMineBev、交互协同CooperationBev3个行为,能够实施采矿、存矿等功能,处理其他Agent发送过来的消息,并将采矿信息告诉给环境中的其他
3
●
Agent类的设计与实现。
Agent类的设计与实现需要注意以下几点:
①继承Agent类或者其子类;
②在构造函数中初始化Agent的基本属性;
③在Setup方法中通过addBehaviour语句给Agent增加相应的行为,以便Agent创建后就可执行这些行为。
下面以“ExploreRobot”Agent为例介绍如何设计和实现Agent。
任何Agent类都要继承JADE的Agent类或者其子类,如BasicRobot继承了Agent类,其代码框架如下所示。
importjade.core.Agent;
publicclassBasicRobotextendsAgent{
…
}
“ExploreRobot”Agent则继承了“BasicRobot”Agent,而“BasicRobot”Agent是Agent类的子类,该部分的代码框架如下所示。
importjade.core.Agent;
publicclassExploreRobotextendsBasicRobot{
…
}
在每个Agent的构造函数部分,程序员需要针对Agent的一些属性完成初始化工作。
例如,对于每一个“ExploreRobot”Agent而言,当其实例化之后,需要为其随机生成该Agent机器人在环境(即网格)中的位置,同时需要初始化该机器人所获得环境中矿产的信息。
该部分的代码框架描述如下。
importjade.core.Agent;
publicclassExploreRobotextendsBasicRobot{
Coordinateposition;
ArrayListFoundMine;
…
publicExploreRobot{
…;
position=env.CreateRandomPosition;
FoundMine=newArrayList;
}
…
}
其中,position是一个类型为Coordinate的属性,它定义了Agent机器人在网格中的坐标;FoundMine是一个类型为Coordinate的动态数组,定义了Agent机器人探测到的矿产位置信息。
在上述语句中,CreateRandomPosition是一个产生随机环境位置的方法,FoundMine=newArrayList语句则产生一个类型为Coordinate的动态数组。
Agent类的设计通常需要实例化setup方法。
针对本案例,我们需要在该方法中增加一组行为,以便让ExploreRobot在创建之后就可执行这些行为,其代码框架描述如下。
importjade.core.Agent;
publicclassExploreRobotextendsBasicRobot{
…
publicvoidsetup{
addBehaviour(newDetectMineBehaviour(this));
addBehaviour(newDigMineBehaviour(this));
addBehaviour(newDumpMineBev(this));
}
…
}
其中,语句addBehaviour(newDetectMineBehaviour(this));旨在增加一个探测矿产的行为,语句addBehaviour(newDigMineBehaviour(this));旨在增加一个挖矿的行为,语句addBehaviour(newDumpMineBev(this));旨在增加一个卸载矿产到矿产仓库的行为。
4
●
行为类的设计与实现
行为类的设计与实现需要注意以下几点:
①分析待实现行为的特点,确定该行为类应继承什么样的基类行为;
②在publicvoidaction方法中编写具体的行为代码。
下面以DetectMineBehaviour行为为例介绍如何设计和实现行为。
首先,DetectMineBehaviour行为旨在探测Agent周边是否存在矿产,这种探测需要不断地进行,因而该行为属于一类周期性行为,需要继承JADE中的CyclicBehaviour类,其代码框架如下所示。
importjade.core.Agent;
importjade.core.behaviours.CyclicBehaviour;
…
publicclassDetectMineBevextendsCyclicBehaviour{
…
publicDetectMineBev(BasicRobotrobot){
…
}
publicvoidaction{
…
}
}
其中,DetectMineBev是构造函数,可以完成一些初始化的工作;publicvoidaction定义了行为体。
其次,需要在publicvoidaction方法中定义行为的程序代码。
对于DetectMineBev行为而言,其行为部分主要是要获得其当前所在位置的周围是否存在矿产,如果存在,则将这些矿产信息(即矿产所在的坐标)加入到Agent机器人的FoundMine动态数组中。
5
●
Agent间交互的设计与实现
场景二和场景三都涉及Agent机器人之间的交互和协同。
下面以场景三中的DetectRobot为例,介绍如何实现Agent之间基于FIPAACL的交互和协同。
一旦某个DetectRobot探测到某些矿产,它需要将它所探测到的矿产信息通知给环境中的“DigRobot”Agent机器人。
下面的程序代码描述了Agent机器人在DetectMineBehaviour行为中如何给其他的Agent发送所探测到的矿产信息。
首先,通过newACLMessage(ACLMessage.INFORM)语句产生一个“通知”类型的ACL消息,其次将矿产坐标作为该消息的内容,然后将其他Agent加入到消息的接收者列表中,最后发送该ACL消息。
publicclassDetectMineBehaviourextendsCyclicBehaviour{
…
//行为体
publicvoidaction(){
Coordinatetarget=RandomWalkBev.RandomNextpoint(ui.myGrid);
intRobotNum=en.getrobotArryList.size;
…
//生成消息类型
ACLMessagemsg=newACLMessage(ACLMessage.INFORM);
//生成消息内容
for(inti=0;i