Jason/AgentSpeak 正在尝试同步代理

Jason/AgentSpeak trying to synchronize agents

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

以下是代理商:

treeSort.mas2j

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").

agent.asl

!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) <- +myNum(math.round(math.random(100)));
    ?myNum(X);
    +iam(leaf);
    .my_name(Y);
    .send(manager, tell, recievedNum(Y,X)).

@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).

.concat 生成一个字符串(因此 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").

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

treeSort.mas2j

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).

agent.asl

!hi.

+!hi <- .send(manager, tell, hi).

@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) <- +myNum(math.round(math.random(100)));
    ?myNum(X);
    +iam(leaf);
    .my_name(Y);
    .send(manager, tell, recievedNum(Y,X)).

@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).

为了同步代理,执行性 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").

和代理代码:

!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).