Читайте также: |
|
package ExampleFIPAContractNet;
import jade.Boot;
import jade.core.Profile;
import jade.core.Runtime;
import jade.core.ProfileImpl;
import jade.wrapper.ContainerController;
import jade.wrapper.AgentController;
// Главная программа
public class Main
{
public Main() {}
// Запуск агентов получателя и отправителя
public static void main(String[] args)
{
// Загрузка JADE-системы
String arg[] = {"-gui"};
Boot boot=new Boot(arg);
// Создание агентного контейнера (для локального хоста)
Profile p = new ProfileImpl();
p.setParameter(Profile.MAIN_HOST, "1-fcd36d9673f14");
p.setParameter(Profile.MAIN_PORT, "1099");
p.setParameter(Profile.CONTAINER_NAME, "MyContainer");
Runtime rt = Runtime.instance();
ContainerController cc = rt.createAgentContainer(p);
// Создание и запуск агентов получателя и отправителя,
// которые содержатся в главном контейнере
try
{
Object args1[]={"ResponderAgent1","ResponderAgent2"};
AgentController agent1 = cc.createNewAgent("InitiatorAgent", "ExampleFIPAContractNet.ContractNetInitiatorAgent", args1);
agent1.start();
AgentController agent2 = cc.createNewAgent("ResponderAgent1", "ExampleFIPAContractNet.ContractNetResponderAgent", null);
agent2.start();
AgentController agent3 = cc.createNewAgent("ResponderAgent2", "ExampleFIPAContractNet.ContractNetResponderAgent", null);
agent3.start();
}
// Обработка исключительной ситуации
catch(Exception e) {e.printStackTrace();}
}}
package ExampleFIPAContractNet;
import jade.core.Agent;
import jade.core.AID;
import jade.lang.acl.ACLMessage;
import jade.proto.ContractNetInitiator;
import jade.domain.FIPANames;
import java.util.Date;
import java.util.Vector;
import java.util.Enumeration;
// агент-инициализатор
public class ContractNetInitiatorAgent extends Agent
{
private int nResponders;
// добавить поведение, связанное с
// протоколом FIPA-ContractNet, перед началом работы
protected void setup()
{
Object[] args = getArguments();
if (args!= null && args.length > 0)
{
nResponders = args.length;
System.out.println(
"Trying to delegate dummy-action to one out of "+nResponders+
" responders.");
// Подготовить сообщение Cfp
ACLMessage msg = new ACLMessage(ACLMessage.CFP);
for (int i = 0; i < args.length; ++i)
msg.addReceiver(new AID((String) args[i], AID.ISLOCALNAME));
msg.setProtocol(FIPANames.InteractionProtocol.FIPA_CONTRACT_NET);
msg.setReplyByDate(new Date(System.currentTimeMillis()+ 10000));
msg.setContent("dummy-action");
// создание поведения
addBehaviour(new ContractNetInitiator(this, msg)
{
// вызывается, если получено сообщение Propose
protected void handlePropose(ACLMessage propose, Vector v)
{
System.out.println("Agent "+ propose.getSender().getName()+" proposed "+propose.getContent());
}
// вызывается, если получено сообщение Refuse
protected void handleRefuse(ACLMessage refuse)
{
System.out.println("Agent "+ refuse.getSender().getName()+" refused");
}
// вызывается, если получено сообщение Failure
protected void handleFailure(ACLMessage failure)
{
if (failure.getSender().equals(myAgent.getAMS()))
System.out.println(
"Responder does not exist");
else
System.out.println("Agent "+ failure.getSender().getName()+" failed");
nResponders--;
}
// вызывается, если все ответы собраны
protected void handleAllResponses(Vector responses, Vector acceptances)
{
if (responses.size() < nResponders)
System.out.println(
"Timeout expired: missing "+(nResponders – responses.size())+
" responses");
int bestProposal = -1;
AID bestProposer = null;
ACLMessage accept = null;
Enumeration e = responses.elements();
while (e.hasMoreElements())
{
ACLMessage msg = (ACLMessage)e.nextElement();
if (msg.getPerformative() == ACLMessage.PROPOSE)
{
ACLMessage reply = msg.createReply();
reply.setPerformative(ACLMessage.REJECT_PROPOSAL);
acceptances.addElement(reply);
int proposal = Integer.parseInt(msg.getContent());
if (proposal > bestProposal)
{
bestProposal = proposal;
bestProposer = msg.getSender();
accept = reply;
}
}
}
if (accept!= null)
{
System.out.println("Accepting proposal "+ bestProposal+" from responder "+bestProposer.getName());
accept.setPerformative(ACLMessage.ACCEPT_PROPOSAL);
}
}
// вызывается, если получено сообщение Inform
protected void handleInform(ACLMessage inform)
{
System.out.println("Agent "+ inform.getSender().getName()+
" successfully performed the requested action");
}
});
}
else
System.out.println("No responder specified.");
}
}
package ExampleFIPAContractNet;
import jade.core.Agent;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.proto.ContractNetResponder;
import jade.domain.FIPANames;
// агент-участник
public class ContractNetResponderAgent extends Agent
{
// добавить поведение, связанное с
// протоколом FIPA-ContractNet, перед началом работы
protected void setup()
{
System.out.println("Agent "+getLocalName()+
" waiting for CFP...");
// Подготовить шаблон сообщения
MessageTemplate template = MessageTemplate.and(
MessageTemplate.MatchProtocol(FIPANames.InteractionProtocol.FIPA_CONTRACT_NET),
MessageTemplate.MatchPerformative(ACLMessage.CFP));
// создание поведения
addBehaviour(new ContractNetResponder(this, template)
{
// вызывается, если было послано сообщение Cfp
protected ACLMessage handleCfp(ACLMessage cfp)
{
System.out.println("Agent "+getLocalName()+
": CFP received from "+cfp.getSender().getName()+". Action is "+ cfp.getContent());
int proposal = evaluateAction();
if (proposal > 2)
{
System.out.println("Agent "+getLocalName()+
": Proposing "+proposal);
ACLMessage propose = cfp.createReply();
propose.setPerformative(ACLMessage.PROPOSE);
propose.setContent(String.valueOf(proposal));
return propose;
}
else
{
System.out.println("Agent "+getLocalName()+
": Refuse");
ACLMessage refuse = cfp.createReply();
refuse.setPerformative(ACLMessage.REFUSE);
return refuse;
}
}
// вызывается, если было послано
// сообщение Accept-Proposal
protected ACLMessage handleAcceptProposal(
ACLMessage cfp, ACLMessage propose,ACLMessage accept)
{
System.out.println("Agent "+getLocalName()+
": Proposal accepted");
if (performAction())
{
System.out.println("Agent "+getLocalName()+
": Action successfully performed");
ACLMessage inform = accept.createReply();
inform.setPerformative(ACLMessage.INFORM);
return inform;
}
else
{
System.out.println("Agent "+getLocalName()+
": Action execution failed");
ACLMessage failure = accept.createReply();
failure.setPerformative(ACLMessage.FAILURE);
return failure;
}
}
// вызывается, если было послано
// сообщение Reject-Proposal
protected void handleRejectProposal(ACLMessage cfp, ACLMessage propose, ACLMessage reject)
{
System.out.println("Agent "+getLocalName()+
": Proposal rejected");
}
});
}
// согласиться или отвергнуть с заданной вероятностью
private int evaluateAction() {return (int)(Math.random()*10);}
// выполнить действие с заданной вероятностью
private boolean performAction() {return (Math.random()>0.2);}
}
Дата добавления: 2015-11-14; просмотров: 68 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Пример реализации работы с протоколом FIPA-Request для мультиагентной системы в программной среде JADE | | | Пример реализации работы с протоколом FIPA-Subscribe для мультиагентной системы в программной среде JADE |