java - 我需要使用 AID 从一个类访问一个值

标签 java agents-jade

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

问题如下:

我有两个基本代理:卖家和买家。每一种可能都有不止一个。它们使用 JADE 协议(protocol)进行通信。卖家说出产品的价格,买家购买。所以,我决定在买家代理中实现一个HashMap,因为卖家有一个关联的价格,所以当买家想要搜索卖家代理时,它们被存储在一个hashmap中。在 HashMap 中,键是代理的 AID 和值,即他销售的产品的价格(它是 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();
            }
        }
    }
}

最佳答案

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

首先,向每个卖家发送一条消息。 在 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());
    ...
}

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

关于java - 我需要使用 AID 从一个类访问一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56171755/

相关文章:

java - 在 Amazon EC2 上运行 JADE 并面临 IP 问题

java - 在 jade 中构建具有集成 GUI 的代理

java - 使用 Java JADE 创建多个代理

java - Spark : Named_struct requires at least one argument

java - 您如何通过 Java SDK 确定您在 AWS S3 中的权限?

java - 无法使用 Heroku postgres 将数据添加到 Spring Boot 上的数据库

linux - JADE 在代理调用时在 64 位 Linux 上执行时挂起

java - Java 示例在 Mac OSX 上的位置

java - 有什么方法可以在 Java 中返回多态 this 吗?

java - 启动 JadeGateway 代理时指定代理名称