当前位置: 首页 > 知识库问答 >
问题:

打印代理二叉树的算法或代码

谯灿
2023-03-14

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

  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;
}

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

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();
    }
}

我不知道如何修复代码中的infini循环。谁能帮助我的详细算法而不是一般的?或者可以在代码中修复我的bug?谢谢!

共有1个答案

蓟辰沛
2023-03-14

周期性行为本质上是无限的。如果你想停止这种行为,不要使用循环。只需使用一个SimpleBehavior并将完成的布尔值设置为true,当您想从代理中删除它时。

 类似资料:
  • 我一直在尝试从Node切换到Java,我想知道的一件事是如何以类似于Node显示的格式打印对象,例如二叉树。例如,我的二叉树初始化代码如下: 在节点中,此二叉树将显示如下: 然而在Java,当我做system.out.println(树); 输出->BinaryTree@4554617c 什么是打印我的BinaryTree的正确方法?什么是好方法?有没有一种方法可以用JSON格式打印树?

  • 我有二叉查找树 我想打印 没有保存每个节点的深度。我尝试了: 我应该如何更改此代码? 哦。很抱歉没有提供每个节点的深度。我应该创建一个新函数来获取每个节点的深度吗??

  • 问题内容: 如何在Java中打印二进制树,使输出类似于: 我的节点: 问题答案: 我已经创建了简单的二叉树打印机。你可以根据需要使用和修改它,但是仍然没有对其进行优化。我认为很多事情可以在这里得到改善;) 输出1: 输出2:

  • 这总是使只有一个out的循环: 为了返回二叉树的正确高度,您还有其他想法(或想法如何更改此代码)吗? len是树中所有节点的数目,self。Queue是具有方法高度的类的子类。

  • 本文向大家介绍javascript实现二叉树的代码,包括了javascript实现二叉树的代码的使用技巧和注意事项,需要的朋友参考一下 前言: 二叉树的特点(例图只是二叉树的一种情况,不要尝试用例图推理以下结论) 除了最下面一层,每个节点都是父节点,每个节点都有且最多有两个子节点; 除了嘴上面一层,每个节点是子节点,每个节点都会有一个父节点; 最上面一层的节点(即例图中的节点50)为根节点; 最下

  • 我需要打印一个具有深度和从高到低的二叉搜索树,根据深度,在打印节点之前增加破折号的数量。树根用0破折号,她的树梢用1破折号……我可以打印没有破折号的树,但我不知道如何用破折号打印。我用的是C.对不起我的英语不好