开发了一个基于合同网协议的多智能体系统,实现了智能体之间的通信。我的系统由一个主管agent和n个机器agent组成。主管座席启动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。
感谢您的回复或指导。诚挚的问候
发布于 2018-05-06 02:08:17
是的,您可以使用消息功能(如发送者、执行者、内容)来过滤传入的消息。
关于并行行为的使用,看起来你做得很好。你可能会重现一些案例,试图弄清楚你的代码到底出了什么问题。Jean Vaucher and 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 );https://stackoverflow.com/questions/50068832
复制相似问题