我遇到了 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/