关键词:
2. jde.core.behaviours.CyclicBehaviour
这种类型的行为将循环执行。
3. Generic behaviours
一般行为包含一个状态位,并且由状态位决定执行不同的操作。当满足所给定条件时,行为结束。例如:
public class MyTwoStepBehaviour extends Behaviors { private int step=0; public void action() { switch(step) { case 0: //perform operation X step++; break; case 1: //perform operation Y step++; break; } } public Boolean done() { return step==2; } }
|
操作X和Y依次执行一次,然后行为结束。JADE也提供了把以上几种简单的行为组合成复杂行为的能力。例如:顺序行为SequentialBehaviour, 并发行为ParallelBehaviour和有限状态机行为FSMBehaviou。
智能体通信
JADE智能体提供的最重要的特征之一就是其通信能力。通信过程中所采用的通信模式为图5所示的异步消息传递。也就是说,每个智能体都有一个消息队列,如果其他智能体需要与其通信时,JADE runtime就把相应消息投递到其队列中。当消息队列中出现消息时,相应的智能体被通知。这时是否对消息做出响应那就是程序员的事了。
图5 
1. ACL语言
智能体是通过ACL(Agent Communication Language)语言进行通信的,而ACL是由FIPA制定的智能体互操作国际标准。ACL消息格式主要包括消息发送方﹑消息接收方﹑通信原语以及消息内容。在JADE中,消息是由jade.lang.acl.ACMessage类对象表示。
2. 发送消息
在JADE中发送消息非常简单,您只需使用Agent类的send方法即可。以下代码表明了如何向别名为Peter的智能体发出通知消息,告诉其今天下雨。
ACLMessage msg=new ACLMessage(ACLMessage.INFORM); Msg.addReceiver(new AID("Peter",AID.ISLOCALNAME)); Msg.setLanguage("English"); Msg.setContent("Today it's raining"); Send(msg);
|
3. 接收消息
智能体通过receive方法就可以从其消息队列中接收消息。这个方法返回消息队列中第一条消息。如果队列为空,则返回null。
构造PingAgent 通过以上的一系列介绍,我们就开始建立PingAgent,清单一给出了部分源代码。
package examples.PingAgent; public class PingAgent extends Agent {
class WaitPingAndReplyBehaviour extends SimpleBehaviour { private boolean finished = false; public WaitPingAndReplyBehaviour(Agent a) { super(a); } public void action() { ACLMessage msg = blockingReceive(); if(msg != null){ ACLMessage reply = msg.createReply(); if(msg.getPerformative()== ACLMessage.QUERY_REF){ String content = msg.getContent(); if ((content != null) && (content.indexOf("ping") != -1)){ reply.setPerformative(ACLMessage.INFORM); reply.setContent("pong"); } } send(reply); } }else{ System.out.println("No message received"); } } public boolean done() { return finished; } } protected void setup() { DFAgentDescription dfd = new DFAgentDescription(); ServiceDescription sd = new ServiceDescription(); sd.setType("AgentcitiesPingAgent"); sd.setName(getName()); sd.setOwnership("TILAB"); dfd.setName(getAID()); dfd.addServices(sd); try { DFService.register(this,dfd); } catch (FIPAException e) { System.err.println(getLocalName()+" registration with DF unsucceeded. Reason: "+e.getMessage()); doDelete(); } WaitPingAndReplyBehaviour PingBehaviour = new WaitPingAndReplyBehaviour(this); addBehaviour(PingBehaviour); } }
|
在清单1中,我们注意到PingAgent拥有一个WaitPingAndReplyBehaviour行为。这个行为的action方法很简单,它的逻辑主要是判断智能体是否收到了类型为QUERY_REF并且内容为"ping"的消息。在setup方法中,主要的操作是在DF中注册智能体。