【问题标题】:Algorithm or code to print the binary tree of agents打印代理二叉树的算法或代码
【发布时间】:2020-10-13 22:40:33
【问题描述】:

我尝试在jade(Java代理开发框架)中编写代码来打印sma中代理的二叉树。我想用原点算法打印树中序遍历:

  1. 遍历左子树,即调用Inorder(left-subtree)
  2. 访问根目录。
  3. 遍历右子树,即调用Inorder(right-subtree)

我的节点代理是:

class Noeud {
    private Integer value = null;
    private AID gauche = null;
    private AID droit = null;
    private AID pere = null;
}

在我要打印的代理中,我使用CyclicBehaviour 作为扩展名。使用我的代码:

public class ReceiveAffichageBehaviour extends CyclicBehaviour{     
@Override
public void action() {
    MessValueGauche();
    MessValue();
    MessValueDroit();
}

private void MessValueGauche() {
    MessageTemplate messageTemplate = MessageTemplate.and(
            MessageTemplate.MatchOntology(Constants.AFFICHAGE_VALUE_GAUCHE),
            MessageTemplate.MatchPerformative(ACLMessage.REQUEST)
    );
    ACLMessage receiveMsg = myAgent.receive(messageTemplate);
    if (receiveMsg != null) {
        String contenu = receiveMsg.getContent() + "(";
        ACLMessage message = new ACLMessage(ACLMessage.REQUEST);

        if (noeud.getGauche() == null) {
            message.setOntology(Constants.AFFICHAGE_VALUE);
            message.addReceiver(myAgent.getAID());
        } else {
            message.setOntology(Constants.AFFICHAGE_VALUE_GAUCHE);
            message.addReceiver(noeud.getGauche());
        }

        message.setContent(contenu);
        myAgent.send(message);

    } else {
        block();
    }
}

private void MessValue() {
    MessageTemplate messageTemplate = MessageTemplate.and(
            MessageTemplate.MatchOntology(Constants.AFFICHAGE_VALUE),
            MessageTemplate.MatchPerformative(ACLMessage.REQUEST)
    );
    ACLMessage receiveMsg = myAgent.receive(messageTemplate);
    if (receiveMsg != null) {
        String contenu = receiveMsg.getContent() + (noeud.getValue() == null ? "" : noeud.getValue().toString());
        ACLMessage message = new ACLMessage(ACLMessage.REQUEST);

        if (noeud.getDroit() == null){
            message.setOntology(Constants.AFFICHAGE_VALUE_DROIT);
            message.addReceiver(myAgent.getAID());
        } else if (noeud.getDroit().equals(receiveMsg.getSender())){
            message.setOntology(Constants.AFFICHAGE_VALUE_DROIT);
            message.addReceiver(noeud.getPere());
        } else {
            message.setOntology(Constants.AFFICHAGE_VALUE_GAUCHE);
            message.addReceiver(noeud.getDroit());
        }
        message.setContent(contenu);
        myAgent.send(message);

    } else {
        block();
    }
}

private void MessValueDroit() {
    MessageTemplate messageTemplate = MessageTemplate.and(
            MessageTemplate.MatchOntology(Constants.AFFICHAGE_VALUE_DROIT),
            MessageTemplate.MatchPerformative(ACLMessage.REQUEST)
    );
    ACLMessage receiveMsg = myAgent.receive(messageTemplate);
    if (receiveMsg != null) {
        String contenu = receiveMsg.getContent() + ")";
        ACLMessage message = new ACLMessage(ACLMessage.REQUEST);
        message.setContent(contenu);

        if (noeud.getDroit() == null && noeud.getGauche() == null ){
            if (noeud.getPere().equals(Constants.AID_RACINE)){
                message.setPerformative(ACLMessage.CONFIRM);
            } else {
                message.setOntology(Constants.AFFICHAGE_VALUE_GAUCHE);
            }
            message.addReceiver(noeud.getPere());
        }

        myAgent.send(message);

    } else {
        block();
    }
}

我不知道在我的代码中修复无限循环。谁能帮我详细的算法而不是一般的?或者可以修复我的代码错误?谢谢!

【问题讨论】:

    标签: java agents-jade


    【解决方案1】:

    循环行为本质上是无限的。如果您希望行为停止,请不要使用循环。 当您想将其从代理中移除时,只需使用 simpleBehaviour 并将完成的布尔值设置为 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多