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