【问题标题】:Jason/AgentSpeak trying to synchronize agentsJason/AgentSpeak 尝试同步代理
【发布时间】:2018-09-28 11:51:17
【问题描述】:

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

【问题讨论】:

  • 嗨,您确定经理在某些情况下一直在等待吗? .wait() 等待条件为真,但是,如果它已经为真,则不等待。

标签: artificial-intelligence agent


【解决方案1】:

这真的很棘手!我使用的是 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).

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是一个错误,但它并没有解决问题,不知何故 .wait() 是非阻塞的,所以经理已经拥有数据库中的所有号码,但仍在等待第一个代理跨度>
    • 这很奇怪,我在我的机器上测试了上面的代码,它可以工作! (请注意,agent.asl 中有一个错误:它在 my_name(agent15) 之前缺少一个“.”。
    • 能否请您上传您的程序输出截图,因为我的看起来像这样:imgur.com/a/5bI2N5N。正如我所说,经理已经在他的数据库中拥有来自代理的所有号码:imgur.com/a/ZZ35pD9。那个缺失的“。”是粘贴代码的错误。
    • 编辑:这是输出的新屏幕 - imgur.com/a/ewOAuxv 如您所见,他已经收到了所有号码但仍在等待代理 9 的号码,但是因为他已经收到了他的号码等待代理 8,他永远不会停止等待
    • 这个解决方案也对我有用。从原始代码来看,除了使用 .term2string 和 agent.asl 上关于 .my_name 函数的错字之外,我使用了 rec-E-I-ved 而不是 rec-I-E-ved。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2018-11-11
      • 2015-09-15
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      相关资源
      最近更新 更多