Artificial intelligence Jason/AgentSpeak正在尝试同步代理

Artificial intelligence Jason/AgentSpeak正在尝试同步代理,artificial-intelligence,agent,Artificial Intelligence,Agent,您好,我正在尝试实现8个数字的树排序。我创建了15个树节点代理和一个管理器代理。我试图实现的是同步树中的叶子,并将它们生成的编号发送到manager节点。我的问题是,在for循环中,叶未同步,因此管理器正在等待下一个叶,但该叶可能已经发送了它的编号。是否有一种方法可以同步这些叶子,以便经理等待每个叶子,然后打印出收到的号码 以下是代理: 特雷索尔酒店 MAS treeSort { infrastructure: Centralised agents: manage

您好,我正在尝试实现8个数字的树排序。我创建了15个树节点代理和一个管理器代理。我试图实现的是同步树中的叶子,并将它们生成的编号发送到manager节点。我的问题是,在for循环中,叶未同步,因此管理器正在等待下一个叶,但该叶可能已经发送了它的编号。是否有一种方法可以同步这些叶子,以便经理等待每个叶子,然后打印出收到的号码

以下是代理:

特雷索尔酒店

MAS treeSort {
    infrastructure: Centralised
    agents:
        manager;
        agent#15;
}
MAS treeSort {
    infrastructure: Centralised
    agents:
        manager;
        agent#15;
}
manager.asl:

!start.
+!start : true <-
    for ( .range(I,8,15) ) {
        .concat("agent",I,TempAgent);
        .print("waiting from ",TempAgent);
        .wait(recievedNum(Y,X) & Y=TempAgent);
        .print("from ",Y," recvd ",X);    
    };
    .println(" done").
!开始

+!start:trueconcat生成一个字符串(TempAgent因此是一个字符串),但是receivedNum的第一个参数是一个原子,两者都不统一。解决方案:

!start.
+!start : true <-
    for ( .range(I,8,15) ) {
        .concat("agent",I,TempAgent);
        .print("waiting from ",TempAgent);
        .term2string(YT,TempAgent);
        .wait(recievedNum(YT,X));
        .print("from ",YT," recvd ",X);    
    };
    .println(" done").
!开始

+!开始:真的这真的很棘手!我使用的是Jason2.1,我遇到了一些不稳定的结果。从Jason 2.2a和2.3快照中,实际上,您最初的想法是修复一些打字错误,包括“.term2string(YT,TempAgent);”和删除Jomi建议的“&Y=TempAgent”。但是,为了确保所有代理都已准备就绪,并且随机数的创建也按正确的顺序进行,我建议使用以下代码:

特雷索尔酒店

MAS treeSort {
    infrastructure: Centralised
    agents:
        manager;
        agent#15;
}
MAS treeSort {
    infrastructure: Centralised
    agents:
        manager;
        agent#15;
}
manager.asl

!start.

+!start : .count(hi[_],N) & N >= 15 <- //wait for all agents
    for ( .range(I,8,15) ) {
        .concat("agent",I,TempAgent);
        .print("waiting from ",TempAgent);
        .term2string(YT,TempAgent);
        .send(TempAgent,achieve,start);
        .wait({+newMsg(YT,X)},5000);
        .print("from ",YT," recvd ",X); 
    };
    .println(" done"). 

+!start <-
    .wait(100);
    !start.

+hi.

+recievedNum(YT,X) <-
    -+newMsg(YT,X).
!开始

+!开始:.count(hi[\u],N)&N>=15要同步代理,执行的askOne更好:它停止意图的执行,直到收到响应。例如,经理:

!start.
+!start : true <-
    .wait(500); // **** waits a bit for agents to start
    for ( .range(I,8,15) ) {
        .concat("agent",I,TempAgent);
        .print("waiting from ",TempAgent);
        .term2string(YT,TempAgent);
        .send(YT,askOne,num(_),num(X)); // **** waits for the answer
        .print("from ",YT," recvd ",X);
    };
    .println(" done").
!开始

+!开始:真的嗨,你确定经理在某些情况下会永远等待吗。wait()等待直到条件为真,但是,如果它已经为真,它就不会等待。这是一个错误,但它并不能解决问题,不知何故,
。wait()
是非阻塞的,因此管理器已经在数据库中拥有所有的数字,但仍在等待第一个代理。这很奇怪,我在我的machie中测试了上面的代码,它运行正常!(注意,代理中有一个bug。asl:在我的名字(agent15)之前缺少一个“.”。你能上传你的程序输出截图吗,因为我的截图是这样的:。正如我所说,经理已经在他的数据库中有了代理的所有数字:。缺少了“.”粘贴代码是一个错误。编辑:这是输出的新屏幕-正如您所看到的,他已经收到了所有号码,但仍在等待代理9的号码,但因为他在等待代理8时已经收到了他的号码,所以他永远不会停止等待。此解决方案也适用于我。从原始代码中,除了使用.term关于.my_name函数,我使用了rec-E-I-ved而不是rec-I-E-ved。
!start.

@p1 +!start : .my_name(agent8) | .my_name(agent9)| .my_name(agent10)|.my_name(agent11)
        | .my_name(agent12) | .my_name(agent13) | .my_name(agent14) | .my_name(agent15)
<- +num(math.round(math.random(100))); // *** just add the belief (the askOne protocol will look for it)
   +iam(leaf).

@p2 +!start : .my_name(agent7) | .my_name(agent6)|  .my_name(agent5) |.my_name(agent4)
        | .my_name(agent3) | .my_name(agent2) 
<- +iam(node).

@p3 +!start : .my_name(agent1) <- +iam(root).