云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 学习agent必备!最全的JADE程序员指南

学习agent必备!最全的JADE程序员指南

  • 62 次阅读
  • 3 次下载
  • 2025/5/6 11:57:43

规模是无限制的,但是,有限资源的事情下,可以通过setQueueSize()方法改变缺省值。 可以通过若干中访问模式从这个私有队列中得到消息:

—可以以控制(使用blockingReceive()方法)或非控制方式(用receive()方法)访问消息队列。必须慎用控制方式,因为它会引起所有agent活动挂起,尤其是它所有的行为。当队列中没有请求消息时,非控制方式立刻返回null。

—两种方法都可以通过pattern-matching能力扩展,传入一个描述请求的ACLMessage的方式的参数。3.3.4描述的MessageTemplate类。

—控制访问可以有一个时间间隔参数。它是长整型的,用来描述为请求消息agent活动应该保持控制等待状态的最大毫秒数。如果消息到达前超过了间隔时间,该方法返回null。 —两个行为ReceiverBehaviour和SenderBehaviour可以用来安排请求接收或发送消息的agent任务。

3.2.3 图形交互界面agent

一个构建多agent系统的应用程序仍然需要与用户交互。所以,有必要提供GUI,至少是为程序中的一些agents提供。这一需要仍引发了一些问题,是由agent的自治属性和普通 GUI的反作用属性之间的不匹配引发的。这些是JADE需要提高一些问题。当JADE被使用,JADE agents的thread-per-agent并行模型必须和Swing并行模型一起工作。 3.2.3.1 Java GUI并行模型

在一个JAVA虚拟机上有一个单一线程,成为Event Dispatcher Thread,它的任务是从System Event Queue(它是java.awt.EventQueue类的一个实例)中连续选择事件对象(比如:java.awt.AWTEvent类的实例)。然后其它事情中的事件调度线程,调用各种注册到事件资源的监听者。重要观察的是所有的事件监听者都在一个单一的控制线程(the event dispatcher)中执行;因为这遵循已知的规则,所以每个事件监听者的执行时间应该缩短(小于0.1s)以确保界面响应。一个重要的Swing特征是Model/View系统来管理GUI更新。Swing控制器有某种状态(JCheckBox有checked标识,JList持有元素,等等),这状态保存在Model对象(DefaultButtonModel类,ListModel类,等)中。model类提供修改状态的命令(比如,检测或不检测checkbox,list中添加或去除元素,等),并且Swing建立了告知机制,更新可见的GUI的外观以反映状态的改变。所以JCheckBox对象可以在两种情况下改变它的外观:

? 从用户接收到事件(如,一个MouseClick事件)

? 程序中的其它部分改变了和JChecBox相关的model对象

正如在JAVA指南(JFC/Swing trail、Threads和Swing部分)里指出的一样,Swing框架不是线程安全的,因此任何更新GUI元素的代码必须在事件调度线程之内执行;因为改变一个model对象会引发GUI的更新,所以按照上面所说的,model对象也必须由事件调度线程来控制。Swing框架提供了一个简单但通用的方式将一些用户定义的代码传给Event Dispatcher thread:SwingUtilities类包含了两个静态方法,接受Runnable对象,用RunnableEvent将其封装,并把它放到System Event Queue中。invokeLater()方法把Runnable放入System Event Queue中,并立即返回(此行为类似于异步交互线程调用),而invokeAndWait()方法把Runnable放入System Event Queue中,就休眠直到Event Dispatcher thread处理了RunnableEvent(此行为类似于同步交互线程调用)。而且,invokeAndWait()方法可以捕获由Runnable对象抛出的异常。

3.2.3.2为响应一个GUI事件做一次ACL信息交换

当一个agent被给一个GUI时,则因为用户的动作,要求该agent发送一个消息(例如,用

户点击了pushbutton)。ActionListener按钮将在事件调度线程之内运行,而Agent.send()方法应当在agent线程之内调用。 所以:

在事件监听者中,给agent添加一个新的行为,以执行必须的通信。

如果做的通讯是一个简单的信息传送操作,可以使用SenderBehaviour类,事件管理者将包括一行代码如下:

myAgent.addBehaviour(new SenderBehaviour(msgToSend ));

如果通讯操作是一个信息接收操作,同样地可以用ReceiverBehaviour类: myAgent.addBehaviour(new ReceiverBehaviour(msgToRecv ));

更一般地说,当用户在GUI上操作时,一些复杂的会话(例如,遵循交互协议的整个交互过程)就会启动。在一次,这个方法给agent添加一个新的行为;这个行为将为交互协议扩展预先定义的JADE behaviours类,或将是一个定制的复杂行为。

下面的代码是从JADE RMA management agent中抽取出来的。当用户要创建一个新的agent的时候,他/她就在RMA GUI上操作(通过菜单栏,工具栏或弹出菜单)执行StartNewAgentAction对象,该对象调用rma类的newAgent()方法。这一方法代码如下:

AMSClientBehaviour类是ram类的一个私有内部类,它扩展自FipaRequestInitiatorBehaviour,与AMS agent间使用fipa-request交互协议。在这种情况下,addBehaviour()调用和特定行为类的添加都被完全封装到rma类内。RMA GUI(主要是action类)的各种类都参考RMA agent,并用它来调用方法,如newAgent()。注意:像newAgent()之类的方法并不是真正属于该agent的,因为它们不以任何方式访问该agent。所以,它们是为了从外部(不同的执行线程)调用而设计的:接下来,这些方法将称为external methods。

一般来说,一个外部软件组件维持关于agent的直接对象不是件好事,因为这个组件可以直接调用该agent的任何公共方法(而不仅仅是外部的方法),跳过异步消息传输层,把自治agent转换为服务对象,从属于它的调用者。更好的方法是将所有的外部方法集中到一个接口,再由agent类使用。这样涉及到该接口的对象将被传送到GUI,这样只有外部方法可以从事件管理者那里调用。下面的代码将解释这个方法;

上面的例子,GUI智能调用RMA agent的外部方法。 3.2.3.3收到ACL消息时修改GUI

Anget可以通过ACL消息从其它agents获取消息:FIPA通信原语inform就是用于此目的。如果该gent有一个GUI,它会想经常通过改变可视的GUI外观和它的用户交流新的信息。根据Model/View模式,新消息应该用于修改一些model对象,Swing会自动更新GUI。用于读取消息的Agent.receive()操作在agent线程中执行,但是对Swing model对象的修改必须从Event Dispathcer线程中执行。 所以:

在agent行为中,将所有对GUI model对象的访问封装成一个Runnable对象,用SwingUtilities.invokeXXX()将Runnable提交给Event Dispathcer线程。 例如,当一个新的agent在JADE平台诞生,AMS就会发送inform消息给所有的活动的RMA agents;它们当中的每个agent都要更新它的AgentTree,添加代表新agent的节点。rma类掌管着(内部的和私有的)AMSListerner类的行为,它不断从AMS接收inform消息,并将消息发送给合适的内部事件管理者(它基本上是一个简单地分布式的ACL消息上的事件系统)。与agent-born事件相对应的管理者有下面的代码:

正如从上面代码中看到的,对agent树的所有访问都被封装到Runnable中,用SwingUtilities.invokeLater()方法提交到Event Dispatcher线程执行。整个Runnable创建和提交过程都包含在MainWindow类的addAgent()方法中,这样rma agent不直接处理Swing调用(它甚至不必引用Swing相关类)。

如果我们将整个MainWindow作为一个活动对象,它的线程是Event Dispatcher线程,addAgent()方法明显的是一个外部方法,这个方法准确反映了上面部分中用到的技术。但是,因为GUI没有被看做自治软件组件,所以是否选择使用外部方法只是一个软件结构问题,没有特殊的概念意义。

3.2.3.4在JADE上构建GUI可用的agents

使agents拥有GUI是件很普通的事情, JADE包含jade.gui.GuiAgent类以达到这个目的。这个类是jade.core.Agent类的简单扩展:在启动(setup()方法执行的时候)的时候,它建立ad-hoc behaviour的实例,管理jade.gui.GuiEvent事件对象的队,该队列可以被其它线程接收。当然,这个行为对程序员是隐藏的,他们只需要实现和每个事件相关的应用程序代码。详细地说,必须执行下面的操作。

一个线程(尤其是GUI)希望通知一个事件给一个agent,它就应该创建一个新的jade.gui.GuiEvent类型的对象,并将它作为参数传给jade.gui.GuiAgent对象的postGuieEvent方法的调用。postGuiEvent()方法调用后,agent通过唤醒所有它的活动行为作为反应,尤其是上面提到使agent线程执行onGuiEvent()方法的行为。注意:GuiEvent对象有两个必须的属性(the source of the event和an integer identifying the type of event)和一个可以添加到event对象的可选参数列表。

作为结果,希望从另一线程(尤其是它的GUI)接收事件的agent应该定义它想接收的事件的类型,然后执行onGuiEvent()方法。一般来说,这个方法是一个大的循环,每种情况对应一种事件类型。JADE发布的mobile例子就是一个很好的例子。

为了进一步解释前面的概念,下面给出一些关于MobileAgent例子的有趣的代码段:

搜索更多关于: 学习agent必备!最全的JADE程序员指南 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

规模是无限制的,但是,有限资源的事情下,可以通过setQueueSize()方法改变缺省值。 可以通过若干中访问模式从这个私有队列中得到消息: —可以以控制(使用blockingReceive()方法)或非控制方式(用receive()方法)访问消息队列。必须慎用控制方式,因为它会引起所有agent活动挂起,尤其是它所有的行为。当队列中没有请求消息时,非控制方式立刻返回null。 —两种方法都可以通过pattern-matching能力扩展,传入一个描述请求的ACLMessage的方式的参数。3.3.4描述的MessageTemplate类。 —控制访问可以有一个时间间隔参数。它是长整型的,用来描述为请求消息agent活动应该保持控制等待状态的最大毫秒数。如果消息到达前超过了间隔时间,该方法返回null。 —两个行为ReceiverBehav

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com