2

我在 JADE 中有以下要求。我必须创建多个代理,其任务是生成随机数。另一个接收器代理收集所有生成的随机数并将它们相加以做出决定。这是sender agent类扩展了tickerbehaviour,其tick onTick方法如下

    protected void onTick()
            {
                ACLMessage msg_LoadDetails = new ACLMessage(ACLMessage.INFORM);
                msg_LoadDetails.addReceiver(new AID("LoadCoordinator", AID.ISLOCALNAME));
                msg_LoadDetails.setContent(String.valueOf(getLoad()));
                LoadConv.send(msg_LoadDetails);
                //load = (int)(Math.random()*1000+1);
            }

接收器类扩展循环行为,其动作方法如下

public void action()
    {
        ACLMessage msg_IncomingLoadDetails = LoadCoordinator.receive();
        if(msg_IncomingLoadDetails!=null)
        totalLoad = Integer.parseInt(msg_IncomingLoadDetails.getContent());

        if(totalLoad>500)
        {actioncommand = "off";}
        else
        {actioncommand = "on";}

        System.out.println("The current load is:" +totalLoad+ "; the load will be switched " +actioncommand);
        block();
    }

这里的问题是接收到的值仅适用于我创建的一个代理(从控制台)。我想接收所有创建的代理的值。这是否需要我创建一组代理?如何从许多代理消息中读取值?由于我是 JAVA 和 JADE 的新手,有人可以帮忙提供代码吗?

4

1 回答 1

3

我测试了您的代码,接收代理从所有发送代理获取消息。

我有一些问题和意见:

  1. 发件人代理应该多久发送一次他们的号码?只有一次,还是周期性地,在给定的时间之后?

  2. 您的接收代理不会对收到的值求和,他总是比较最后收到的值。

  3. 收到消息后,最好将此结构用于逻辑:

    if (msg_IncomingLoadDetails != null) {
        // your logic
    } else {
        block();            
    }
    

    它可以帮助防止一些问题,如 NullPointerException

于 2016-05-09T19:54:59.407 回答