【问题标题】:I need to access a value from one class using AID我需要使用 AID 从一个类中访问一个值
【发布时间】:2019-05-16 15:14:47
【问题描述】:

我遇到了 Jade-agent 问题,无法继续进行签名练习。

问题如下:

我有两个基本代理:卖家和买家。每个可能有不止一个。它们与 JADE 协议进行通信。卖家说出产品的价格,买家购买。所以,我决定在买家代理中实现一个HashMap,因为卖家有一个关联的价格,所以当买家想要搜索卖家代理时,他们存储在一个hashmap中。在 hashmap 中,key 是 agent 的 AID 和 value,他销售的产品的价格(它是一个 Seller 本地变量)。但是当我想访问产品的价格时,我不知道如何获取它。


卖方代理。

public class SellerAgent extends Agent {

    private ArrayList<String> messages;  // Messages between them are stored in ArrayList.
    int price;  // Price of the product.


    // setup() and takeDown().
    @Override
    protected void setup() {
        messages= new ArrayList();
        price = rnd.nextInt(50);

        // Agent registration
        ServiceDescription sd = new ServiceDescription();
        sd.setType("GUI");
        sd.setName("Seller");

        DFAgentDescription dfd = new DFAgentDescription();
        dfd.setName(getAID());
        dfd.addServices(sd);

        try {
            DFService.register(this, dfd);
        } catch (FIPAException fe) {
            fe.printStackTrace();
        }
    }

    @Override
    protected void takeDown() {
        try {
            DFService.deregister(this);
        } catch (FIPAException fe) {
            fe.printStackTrace();
        }

        System.out.println("END OF " + this.getName());
    }

    public Integer getPrice() { return price; }
}

买方代理。

public class BuyerAgent extends Agent {

    private HashMap<AID, Integer> sellers;  // Sellers.
    private ArrayList<String> messages;   // Messages between them are stored in ArrayList.


    @Override
    protected void setup() {
        sellers = new HashMap();
        messages = new ArrayList();

        // Agent registration
        ServiceDescription sd = new ServiceDescription();
        sd.setType("GUI");
        sd.setName("Buye");

        DFAgentDescription dfd = new DFAgentDescription();
        dfd.setName(getAID());
        dfd.addServices(sd);

        try {
                DFService.register(this, dfd);
        } catch (FIPAException fe) {
                fe.printStackTrace();
        }

        // SearchAgents Task.
        addBehaviour(new SearchAgents(this, 5000));           // Search Seller Agent.
    }

    @Override
    protected void takeDown() {
        try {
            DFService.deregister(this);
        } catch (FIPAException fe) {
            fe.printStackTrace();
        }

        System.out.println("END OF " + this.getName());
    }


    public class SearchAgents extends TickerBehaviour {

        public SearchAgents(Agent a, long period) {
            super(a, period);
        }

        @Override
        protected void onTick() {
            DFAgentDescription template;
            ServiceDescription sd;
            DFAgentDescription[] result;

            // We search Seller Agents.
            sd = new ServiceDescription();
            sd.setName("Seller");

            template = new DFAgentDescription();
            template.addServices(sd);

            try {
                result = DFService.search(myAgent, template);

                if (result.length > 0) {
                    agricultores.clear();
                    for (int i = 0; i < result.length; ++i) 
                        seller.put(result[i].getName(), i); /*HERE IS THE PROBLEM, value needs to be price of seller product, not i*/
                } else {
                    // No agents where found.
                    agricultores.clear();
                    System.out.println("Not found.");
                } 
            } catch (FIPAException fe) {
                fe.printStackTrace();
            }
        }
    }
}

【问题讨论】:

  • 您必须向卖家发送一条消息以了解其价格
  • 是的,我终于按照你说的做了,而且成功了!使用我编写的代码,我搜索 de AID Agent,当我找到一个时,我将它保存在一个数组中。所以,当我得到代理时,只需发送带有信息的 de ACLMessage 并保存。谢谢你的回答! ^^

标签: java agents-jade


【解决方案1】:

这不会给你卖家的任何价格。在这里,您只是获得所有可用卖家的列表。获取价格的方法是向每个卖家发送消息并询问价格,然后听取并获得他们的相应回复(价格)。

首先,向每个卖家发送消息。 在 BuyerAgent 类中:

ACLMessage msg = new ACLMessaage(ACLMessage.REQUEST);
msg.setContent("What's the price?");
for(DFAgentDescription df : results) {
    msg.addReceiver(df.getName());
}
myAgent.send(msg);
block();

SellerAgent 类中:

ACLMessage msg = myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.REQUEST));
if(msg != null) {
    ACLMessage reply = msg.createReply();
    reply.setPerformative(ACLMessage.PROPOSE);
    reply.setContent(**YOUR PRICE HERE**);
    myAgent.send(reply);
}
block();

同样,在 BuyerAgent 类中:

msg = myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.PROPOSE));
if(msg != null) {
    sellers.put(msg.getSender(), Integer.parseInt(msg.getContent());
    ...
}

注意: 我在这里使用的 ACLMessage 类型(REQUEST、PROPOSE)并不那么重要。您可以根据需要更改它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2013-01-08
    相关资源
    最近更新 更多