如何在所有Jade容器上获取代理?

8

嗨,我正在使用Jade撰写我的论文。

我使用ams来发现主容器中的所有jade代理,但是当我尝试创建一些代理容器时,我无法搜索所有容器以获取它们上面的所有代理。

请帮助我修复我的代码,使其可以发现当前容器的ams代理。

以下是我用于在容器下创建代理的代码。

  Runtime rt= Runtime.instance();

    Profile p=new ProfileImpl();


    AgentContainer AgentContainere = rt.createMainContainer(p);


    AgentController[] tab=new AgentController[N];

    try {


        int k=0;
        for (int i = 0; i < N; i++) {

            if (i % 100 == 0) {
                p=new ProfileImpl();
                AgentContainere = rt.createMainContainer(p);
            }

            if ((i+1)%(N/NbrC)==0) {
                tab[i] = AgentContainere.createNewAgent(psoeudo+" - "+i, "Agents.KmeanAgent", new Object[]{K,NbrC,true,k});
                k++;
            }else
            tab[i] = AgentContainere.createNewAgent(psoeudo+" - "+i, "Agents.KmeanAgent", new Object[]{K,NbrC,false,N});    
        }


        for (AgentController tab1 : tab) {
            tab1.start();

        }

我的代理需要广播一个ACL消息:

     try {
            currentCluster = new Point(p.getX(), p.getY());
            tableOfCenters[index] = currentCluster;
            AMSAgentDescription[] agents = null;
            boolean notstable = true;
            int found = 0;
            long sleeptime=7000;
            while (notstable) {
                try {
                    sleep(sleeptime);

                    SearchConstraints c = new SearchConstraints();
                    c.setMaxResults(new Long(-1));

                    agents = AMSService.search(this, new AMSAgentDescription(), c);
                    if (agents.length > found) {
                        found = agents.length;
                        sleeptime+=5000;

                    } else {
                        notstable = false;
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            System.out.println(found + "the found agent");
            AID myId = getAID();
            ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
            int sendloop=0;
            msg.setContent(getName() + currentCluster + " index = " + index);
            for (AMSAgentDescription agent : agents) {

                AID sendTo = agent.getName();
                if (!sendTo.equals(myId) && !sendTo.getName().toLowerCase().contains("ams") && !sendTo.getName().toLowerCase().contains("df")) {
                    msg.addReceiver(sendTo);
                    sendloop++;
                    if (sendloop%10==0) {
                       send(msg);
                       System.out.println(msg);
                       msg.clearAllReceiver();
                    }
                }

            }
            if (sendloop%10!=0) {
                       send(msg);
                       System.out.println(msg);
                       msg.clearAllReceiver();
                    }




            System.out.println("********************");
            System.out.println(msg);
            System.out.println("********************");
        } catch (Exception e) {
            e.printStackTrace();
        }
2个回答

8
你只需要向AMS代理发送请求,然后在Jade中间件中以代理列表的形式打印或进行其他操作:
步骤1:向AMS发送请求:
    // Required imports

    import jade.domain.AMSService;
    import jade.domain.FIPAAgentManagement.*;

    ...
    AMSAgentDescription [] agents = null;

    try {
        SearchConstraints c = new SearchConstraints();
        c.setMaxResults ( new Long(-1) );
        agents = AMSService.search( this, new AMSAgentDescription (), c );
    }
    catch (Exception e) { ... }

第二步:显示请求结果:

for (int i=0; i<agents.length;i++){
     AID agentID = agents[i].getName();
     System.out.println(agentID.getLocalName());
}

我已经在我的代码中完成了它,但当我启动多个容器时,它们不起作用。 - Mohammed Housseyn Taleb
好的,这段代码最近进行了测试,即使有多个容器,它也运行得非常好,请再次检查。 - steevn
1
有时候它会随机挂起!! - Mahmoud Fayez

4
import jade.core.Agent;
import jade.core.AID;

import jade.domain.AMSService;
import jade.domain.FIPAAgentManagement.*;

public class SearchC extends Agent 
{
    protected void setup() 
    {
        AMSAgentDescription [] agents = null;
        try {
            SearchConstraints c = new SearchConstraints();// object to searh                    //the container exist on the System
            c.setMaxResults (new Long(-1));//define infinity result to C
            agents = AMSService.search( this, new AMSAgentDescription (), c );//putt all agent found on the system to the agents list
        }
        catch (Exception e) {
            System.out.println( "Problem searching AMS: " + e );
            e.printStackTrace();
        }

        AID myID = getAID();// this methode to get the idesntification of //agents such as (Name , adress , host ....etc)
        for (int i=0; i<agents.length;i++)
        {
            AID agentID = agents[i].getName();
            System.out.println(
                ( agentID.equals( myID ) ? "*** " : "    ")
                + i + ": " + agentID.getName() 
            );
        }
        doDelete();// kill agent
        System.exit(0); // exit System
    }

1
请添加代码说明,以便其他用户在未来能够理解您的答案。 - Brody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接