Java 如何使用JADE在另一个代理中添加来自多个代理的消息(整数值)

Java 如何使用JADE在另一个代理中添加来自多个代理的消息(整数值),java,agents-jade,multi-agent,Java,Agents Jade,Multi Agent,我对玉有以下要求。 我必须创建多个代理,其任务是生成随机数。另一个接收代理收集生成的所有随机数,并将它们相加以做出决定。 这是sender代理类扩展了tickerbehaviour,其tick-onTick方法如下 protected void onTick() { ACLMessage msg_LoadDetails = new ACLMessage(ACLMessage.INFORM); msg_

我对玉有以下要求。 我必须创建多个代理,其任务是生成随机数。另一个接收代理收集生成的所有随机数,并将它们相加以做出决定。 这是sender代理类扩展了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();
    }
接收器类扩展循环行为及其作用方法如下

    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,请有人帮我编写代码好吗?

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

我有一些问题和意见:

  • 发件人代理应多久发送一次他们的号码?在给定的时间后,只进行一次或循环

  • 您的接收方代理不会对收到的值求和,他总是比较上次收到的值

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

    if (msg_IncomingLoadDetails != null) {
        // your logic
    } else {
        block();            
    }
    
    它可以帮助防止一些问题,如NullPointerException


  • 勾选行为每5s执行一次勾选方法。我知道这不是价值的总和。我想知道如何从所有代理接收值,然后求和代理。receive()方法接收代理队列中最早的消息。我创建了2个发送方代理,每个代理每5秒发送一个随机整数。接收方从两个发送方接收消息,下面是我的控制台的日志:这是这样工作的:发送方和接收方代理启动,接收方尝试获取消息,但队列为空。所以他的行为阻碍了他,并在等待信号。然后两个发送者都发送他们的号码。接收者收到新消息的信号并触发其行为。它在队列中找到消息,获取并显示它。然后,再次触发行为,在队列中找到第二条消息,获取并显示它。