Jason / AgentSpeak试图同步代理

时间:2018-04-18 09:39:01

标签: artificial-intelligence agent

您好我正在尝试为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).

3 个答案:

答案 0 :(得分:4)

.concat生成一个字符串(TempAgent因此是一个字符串),但receiveNum的第一个参数是一个原子,两者都没有统一。解决方案:

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

答案 1 :(得分:4)

为了同步代理,表演性的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).

答案 2 :(得分:3)

真的很棘手!我使用的是Jason 2.1,我遇到了一些不稳定的结果。实际上,从Jason 2.2a和2.3 SNAPSHOT开始,你最初的想法只是修复一些错别字并包括&#34; .term2string(YT,TempAgent);&#34;并删除&#34;&amp; Y = TempAgent&#34;正如Jomi所提出的那样。但是,为了确保所有代理都准备就绪,并且还以正确的顺序创建随机数,我建议使用以下代码:

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