Impressão de Árvores
Após o início dos desenvolvimentos do algoritmo ID3, comecei a pesquisar algum método pronto para a impressão de árvores, tanto em arquivo quanto na saída padrão, em Java com a restrição de cada ramo poderia ter N filhos, para que o tempo de desenvolvimento diminuísse. Porém, todas as implementações que encontrei eram desenvolvidas visando árvores binárias e na sua grande maioria, formadas por códigos confusos e desnecessariamente complexos.
Por isso decidi deixar aqui, em um post a parte, a minha versão para impressão de árvores em arquivo, independente do número de folhas ou do número de níveis que a árvore possuí. Segue abaixo o esquema no qual a árvore será impressa:
Folha-Nível1
Folha1-Nível2
Folha2-Nível2
Folha1-Nível3
Folha2-Nível3
Folha1-Nível4
Folha2-Nível4
Folha3-Nível3
Folha4-Nível3
Folha3-Nível2
Folha5-Nível3
Folha4-Nível2
(i) Notar que o nível em que a folha se encontra é determinado pela tabulação.
Dessa forma ficou fácil analisar as saídas do algoritmo, sem ter que ficar utilizando a funcionalidade de debug do Eclipse. Segue abaixo o código implementado:
public class FileWriter { /** * Função recursiva para impressão da árvore resultante dos algoritmos de * árvore de decisão. * * @param root - Nó que será impresso * @param writer - Arquivo onde será impresso * @param treeLevel - Nível em que a árvore se encontra */ public static void writeTree(Node root, PrintWriter writer, int treeLevel) { String line = ""; //Verifica se existe apenas o resultado ou se existe um outro campo a ser avaliado if(root.getTestAttribute().getName().isEmpty()) { line = root.getTestAttribute().getValue(); } else { line = root.getValue() + " -> " + root.getTestAttribute().getName(); } //Imprime o nível do nó for(int i = 0; i < treeLevel * 2; i++){ writer.print("\t"); } //Aumenta em 1 o nível da árvore treeLevel++; writer.print(line + "\n"); //Imprime de forma recursiva as folhas desse nó if(root.getChildren() != null) { for(Node child : root.getChildren()) { writeTree(child, writer, treeLevel); } } return; } }
Nenhum comentário :
Postar um comentário