我开发了一个基于合约网协议的多代理系统,用于代理之间的通信。
我的系统由一个主管代理和n个机器代理组成。 主管代理启动 CFP 来查找执行给定任务的适当机器。 每个机器代理都会对 CFP 做出答复,并且如果其建议被主管代理接受,则将任务添加到其队列中。同时,每个机器代理向其他机器代理启动 CFP,其目的是交换其队列中的任务(已接受的任务)。
我在主管代理上实现了 ContractNetInitiator 行为。 我在机器代理上实现了 ContractNetreponder 行为。
现在,我必须如何在机器代理之间实现 CNP。我认为在行为方面应做到以下几点:
ParallelBehaviour PB = new ParallelBehaviour();
PB.addSubBehaviour(new Responder(this, null)); //ContractNetresponder behaviour
PB.addSubBehaviour(new initiator(this,60000)); //ContractNetinitiator behaviour
addBehaviour(PB);
我的问题:在响应者行为中,机器代理从主管代理和其他机器代理接收 CFP。我可以使用一个 ContractNetresponder 并稍后过滤传入消息吗?或者我必须创建两个 ContractNetresponder 行为来单独处理 CFP。
是的,您可以使用消息功能(如发件人、执行性、内容)来过滤传入消息。
关于并行行为的使用,看来你做得不错。您可以重现一些案例来尝试弄清楚您的代码发生了什么。 Jean Vaucher 和 Ambroise Ncho 展示的示例可能是一种方法:
Acheteur2.java
int bestPrice = 9999;
ACLMessage bestOffer = null;
protected void setup()
{
ACLMessage msg = newMsg( ACLMessage.QUERY_REF );
MessageTemplate template = MessageTemplate.and(
MessageTemplate.MatchPerformative( ACLMessage.INFORM ),
MessageTemplate.MatchConversationId( msg.getConversationId() ));
SequentialBehaviour seq = new SequentialBehaviour();
addBehaviour( seq );
ParallelBehaviour par = new ParallelBehaviour( ParallelBehaviour.WHEN_ALL );
seq.addSubBehaviour( par );
for (int i = 1; i<=3; i++)
{
msg.addReceiver( new AID( "s" + i, AID.ISLOCALNAME ));
par.addSubBehaviour( new myReceiver( this, 1000, template)
{
public void handle( ACLMessage msg)
{
if (msg != null) {
int offer = Integer.parseInt( msg.getContent());
if (offer < bestPrice) {
bestPrice = offer;
bestOffer = msg;
} } }
});
}
seq.addSubBehaviour( new OneShotBehaviour()
{
public void action()
{
if (bestOffer != null)
System.out.println("Best Price $" + bestPrice );
else
System.out.println("Got no quotes");
}
});
send ( msg );