Import jade.lang.acl.ACLMessage;
Import jade.lang.acl.MessageTemplate;
public class RequestPerformer extends Behaviour {
private AID bestSeller; //- ( )
private int bestPrice; //
private int repliesCnt = 0; //
private MessageTemplate mt;
private int step = 0;
public void action() {
switch (step) {
case 0:
//
ACLMessage cfp = new ACLMessage(ACLMessage.CFP);
for (int i = 0; i < sellerAgents.length; ++i) {
cfp.addReceiver(sellerAgents[i]);
}
cfp.setContent(targetBookTitle);
cfp.setConversationId("book-trade");
cfp.setReplyWith("cfp" + System.currentTimeMillis());
myAgent.send(cfp);
//
mt = MessageTemplate.and(MessageTemplate
.MatchConversationId("book-trade"), MessageTemplate
.MatchInReplyTo(cfp.getReplyWith()));
step = 1;
break;
case 1:
// , ,
ACLMessage reply = myAgent.receive(mt);
if (reply!= null) {
if (reply.getPerformative() == ACLMessage.PROPOSE) {
int price = Integer.parseInt(reply.getContent());
if (bestSeller == null || price < bestPrice) {
//
bestPrice = price;
bestSeller = reply.getSender();
}
}
repliesCnt++;
if (repliesCnt >= sellerAgents.length) {
//
step = 2;
}
} else {
block();
}
break;
case 2:
// ,
ACLMessage order = new ACLMes-sage(ACLMessage.ACCEPT_PROPOSAL);
Order.addReceiver(bestSeller);
Order.setContent(targetBookTitle);
order.setConversationId("book-trade");
order.setReplyWith("order" + System.currentTimeMillis());
MyAgent.send(order);
mt = MessageTemplate.and(MessageTemplate
.MatchConversationId("book-trade"), MessageTemplate
.MatchInReplyTo(order.getReplyWith()));
step = 3;
Break;
case 3:
reply = myAgent.receive(mt);
if (reply!= null) {
//
if (reply.getPerformative() == ACLMessage.INFORM) {
//
System.out.println(targetBookTitle + " successfully purchased.");
System.out.println("Price = " + bestPrice);
myAgent.doDelete();
}
step = 4;
} else {
block();
}
break;
}
}
public boolean done() {
return ((step == 2 && bestSeller == null) || step == 4);
}
}
, , (). JADE jade.proto. . receive() Agent blockingReceive(). , , ( , , ). , blockingReceive, , , .
|
|
3.2.
3.3.
, - (seller1 seller2) ( AID[] sellerAgents BookBuyerAgent , ( 3.2 й3) ). , , JADE, - -, .
DF
Directory Facilitator (DF) ( FIPA) (yellow pages), . DF , , .
DF, , . DF 4.3.
.3.3. .
JADE DF ( df). DF- ( , ), .
DF
DF , , ACL-, , FIPA, ( SLO) ( FIPA-agent-management). , JADE jade.domain.DFService, .
, ( ) , DF, AID , , , . ,
, , , , , . DFAgentDescription, ServiceDescription Property, jade.domain.FIPAAgentManagement, .
, , DFAgentDescription, register() DFService. setup(), - .
|
|
protected void setup() {
...
// Register the book-selling service in the yellow pages
DFAgentDescription dfd = new DFAgentDescription()
dfd.setName(getAID());
ServiceDescription sd = new ServiceDescription();
sd.setType(book-selling);
sd.setName(JADE-book-trading);
dfd.addServices(sd);
try {
DFService.register(this, dfd);
}
catch (FIPAException fe) {
fe.printStackTrace();
}
...
}
, , , , . , .
protected void takeDown() {
// Deregister from the yellow pages
try {
DFService.deregister(this);
}
catch (FIPAException fe) {
fe.printStackTrace();
}
// Close the GUI
myGui.dispose();
// Printout a dismissal message
System.out.println(Seller-agent +getAID().getName()+ terminating.);
}
, , DF . , .
, , , . search() DFService , -
, book-selling ( ).
public class BookBuyerAgent extends Agent {
private String targetBookTitle; // The title of the book to buy
private AID[] sellerAgents; // The list of known seller agents
// Put agent initializations here
protected void setup() {
// Printout a welcome message
System.out.println(Hello! Buyer-agent +getAID().getName()+ is ready.);
// Get the title of the book to buy as a start-up argument
Object[] args = getArguments();
if (args!= null && args.length > 0) {
targetBookTitle = (String) args[ 0];
System.out.println(Trying to buy +targetBookTitle);
// Add a TickerBehaviour that schedules a request to seller agents every minute
addBehaviour(new TickerBehaviour(this, 60000) {
protected void onTick() {
// Update the list of seller agents
DFAgentDescription template = new DFAgentDescription();
ServiceDescription sd = new ServiceDescription();
sd.setType(book-selling);
template.addServices(sd);
try {
DFAgentDescription[] result = DFService.search(myAgent, template);
sellerAgents = new AID[result.length];
for (int i = 0; i < result.length; ++i) {
sellerAgents[i] = result[i].getName();
}
catch (FIPAException fe) {
fe.printStackTrace();
}
// Perform the request
myAgent.addBehaviour(new RequestPerformer());
}
});
...
, - , .. - .
DFService DF , ( searchUntilFound() createSubscriptionMessage()).
й3
1. - .
2. , .
3. .
4. .
5. ( ).
: 3 3 .
.
1. :
1. - . , , . (). , . . , / . 2 3 .
|
|
Agent | Values |
Project Demand_1 | CargoWeight = 1000; Account = 1000 |
Project Demand_2 | CargoWeight = 2000; Account = 1500 |
Vessel Resource_1 | MaxWeight = 1000; CruiseTime = 5 |
Vessl Resource_2 | MaxWeight = 2000; CruiseTime = 6 |
Vessel Resource_3 | MaxWeight = 2500; CruiseTime = 10 |
2. . . - . -.
-
()