JADE平台学习笔记(二)

二.Jade行为类和agent通讯

在前面的例子中,agent所作的工作都定义在了setup中,实际上它具有的行为和执行的动作都应该定义在behavious类中,我们可以对生成behavios类的实例,然后将任务或者动作代码放在对behavious类中的action方法中,action方法是必须要有的。Behavious类还有很多子类,分别对应着不同类型的behavious,包括SimpleBehaviour,sequences behaviors ,parallel behaviors,cyclic behaviors等。

 三.ACL(agent communication language)

Jade的agent之间进行通信使用的acl语言遵循fipa acl规范。一个acl消息通常包含这些参数:sende:消息的发送者,用agent标志AID表示; receivers,接受agent消息的agent可以是多个;Reply-to,应受到回应的接受者;Performative:标志该消息的目的,即发送者想要通过发送消息获取什么,通常有这样一些常值:REQUEST, INFORM, ACCEPT_PROPOSAL, REJECT_PROPOSAL, PROPOSE;Content,消息的内容;语言,比如内容的编码格式;ontology,双方都能够理解的消息内容的概念说明和语义描述。

实例:

在netbeans中创建常规项目:其代码文件有两个,分别为

package ips;

import java.io.InterruptedIOException;

 

import java.io.IOException;

import jade.core.*;

import jade.core.behaviours.*;

import jade.lang.acl.*;

import jade.domain.FIPANames.InteractionProtocol;

import jade.proto.SimpleAchieveREInitiator;

import java.util.Vector;

import java.util.Enumeration;  

public class SimpleRequestInitiator extends Agent{

    static class MarriageProposer extends SimpleAchieveREInitiator{

        protected MarriageProposer(Agent agent, ACLMessage msg){

            super(agent, msg);

        }

        protected void handleAgree(ACLMessage msg) {

            System.out.println(myAgent.getLocalName() + ": 吼吼! " +

            msg.getSender().getLocalName() +" 已经同意嫁给我了, I'm so excited!");

        }

        protected void handleRefuse(ACLMessage msg) {

            System.out.println(myAgent.getLocalName() + ": Oh no! " +

            msg.getSender().getLocalName() +" 拒绝了我, i feel sad.");

        }

        protected void handleInform(ACLMessage msg) {

            System.out.println(myAgent.getLocalName() + ":" +

            msg.getSender().getLocalName() +" has informed me of the status of my request." +

            " They said : " + msg.getContent());

        }

        protected void handleNotUnderstood(ACLMessage msg){

            System.out.println(myAgent.getLocalName() + ":"

                + msg.getSender().getLocalName() +

                " has indicated that they didn't understand.");

        } 

        protected void handleOutOfSequence(ACLMessage msg) {

            System.out.println(myAgent.getLocalName() + ":"

                + msg.getSender().getLocalName() +

                "has sent me a message which I wasn't" +

                " expecting in this conversation");

        }

    }

    protected void setup() {

        System.out.println(getLocalName() +": about to propose marriage to bob ");

        doWait(5000); //wait for bob to be started.

        ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);

        AID to = new AID();        

        to.setLocalName("bob");

        msg.setSender(getAID());

        msg.addReceiver(to);

        msg.setContent("Marry Me!");

        msg.setProtocol(InteractionProtocol.FIPA_REQUEST);

        addBehaviour(new MarriageProposer(this, msg));

    }

 

还有:

package ips; 

import java.io.InterruptedIOException;

import java.io.IOException;

import jade.core.*;

import jade.core.behaviours.*;

import jade.lang.acl.*;

import jade.domain.FIPANames.InteractionProtocol;

import jade.proto.SimpleAchieveREResponder;

import java.util.Vector;

import java.util.Enumeration;

public class SimpleRequestResponder extends Agent {

    static class MarriageResponder extends SimpleAchieveREResponder{

        public MarriageResponder(Agent agent){

            super(agent,createMessageTemplate(InteractionProtocol.FIPA_REQUEST));

        }

        protected ACLMessage prepareResponse(ACLMessage msg) {

            ACLMessage response = msg.createReply();

            if(msg.getContent()!=null && msg.getContent().equals("Marry Me!")){

                System.out.println(myAgent.getLocalName() + ":" +

                        msg.getSender().getLocalName() +

                        " has asked me to marry him!");

            AID sender;

            sender = msg.getSender();

            if(sender.getLocalName().equals("baz")){

                response.setPerformative(ACLMessage.AGREE);

                System.out.println(myAgent.getLocalName() +

                    ":I'm going to agree.");

            }else{

                response.setPerformative(ACLMessage.REFUSE);

                System.out.println(myAgent.getLocalName() +

                    ":I'm going to turn him down.");

            }

            }else{

                response.setPerformative(ACLMessage.NOT_UNDERSTOOD);

                System.out.println(myAgent.getLocalName() +

                    ":I didn't understand what " +

                msg.getSender().getLocalName() +

                    " just said to me.");

            }

            return response;

        }

        protected ACLMessage prepareResultNotification(ACLMessage inmsg,

                                                            ACLMessage outmsg) {

 

 

        //what they have asked is now complete (or if it failed)

            ACLMessage msg = inmsg.createReply();

            msg.setPerformative(ACLMessage.INFORM);

            msg.setContent("I Do!");

            return msg;

        }

 

    }

    protected void setup() {

        System.out.println(getLocalName() +

                ": I wonder if anybody wants to marry me?");

        addBehaviour(new MarriageResponder(this));

     }//

}

按照以前blog中记载,在netbeans属性中加入库,然后再运行参数中,设置,主类依然为jade.Boot,参数为baz:ips.SimpleRequestInitiator bob:ips.SimpleRequestResponder,运行成功后,以下是输出结果:

baz: about to propose marriage to bob

bob: I wonder if anybody wants to marry me?

bob:baz has asked me to marry him!

bob:I'm going to agree.

baz: 吼吼! bob 已经同意嫁给我了, I'm so excited!

baz:bob has informed me of the status of my request. They said : I Do! 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值