Árvore de Enum Java ID3
Eu estou tentando fazer uma árvore de aprendizagem não-binária que é uma versão simplificada do algoritmo ID3. Para fazer isso, tentei usar enums, porque há várias referências ensinando hierarquias de enum, mas estou tendo problemas com a transferência de enums para as funções necessárias para fazer a árvore. Eu configurei tudo o que eu preciso para a árvore o melhor que pude, mas estou tendo problemas com a construção inicial da árvore.
Primeiro, fiz seis enums, cada um com seu próprio arquivo, para não precisar escrever "main.enumname" em todos os lugares. Estas cinco primeiras enums representam o diagnóstico do carro.
<code>public enum fuelstats {notempty, empty} public enum lightstatus {Dim, Normal} public enum scents {normal, gas} public enum soundstatus {Normal, Howl, Screech, Click} public enum turn {no, yes} </code>
Em seguida, fiz mais duas enums. Um para os diferentes resultados de diagnóstico, e um para os diferentes "tópicos" do diagnóstico do carro.
<code>public enum problems {battery, starter, solenoid, outofgas, flooding} public enum features {lightstatus, soundstatus, fuelstats, scents, turn, problems} </code>
Fiz então cinco exemplos de dados de diagnósticos de carro diferentes para serem classificados na árvore.
<code>Example example1 = new Example(lightstatus.Dim, soundstatus.Howl, turn.yes, fuelstats.notempty, scents.normal, problems.battery); Example example2 = new Example(lightstatus.Normal, soundstatus.Screech, turn.no, fuelstats.notempty, scents.normal, problems.starter); Example example3 = new Example(lightstatus.Normal, soundstatus.Click, turn.no, fuelstats.notempty, scents.normal, problems.solenoid); Example example4 = new Example(lightstatus.Normal, soundstatus.Normal, turn.yes, fuelstats.empty, scents.normal, problems.outofgas); Example example5 = new Example(lightstatus.Normal, soundstatus.Normal, turn.yes, fuelstats.notempty, scents.gas, problems.flooding); //make an array list of Examples. ArrayList<Example> Examples = new ArrayList<Example>(); Examples.add(example1); Examples.add(example2); Examples.add(example3); Examples.add(example4); Examples.add(example5); </code>
Eu coloquei os vários diagnósticos do carro, chamados de Features, em uma ArrayList para fins de shuffling, porque eles serão usados aleatoriamente para construir a árvore.
<code>//This ArrayList holds the Enums for shuffling purposes. ArrayList<features> Features = new ArrayList<features>(); Features.add(features.soundstatus); Features.add(features.lightstatus); Features.add(features.turn); Features.add(features.scents); Features.add(features.fuelstats); // Shuffle the elements in the list Collections.shuffle(Features); //The Features Array List is now a shuffled tree. //We will do a single loop that will serve as our stack. //First we take the top of the list and assign it to the root. Tree id3 = new Tree(Features.get(0),Examples); </code>
Mas como eu escrevo uma árvore que: Utiliza um enum de recurso que faz o sujeito da raiz corresponder ao enum e todos os diferentes status do enum aos filhos? Por exemplo, se soundstatus for a raiz, ela deverá criar quatro filhos Normal, Howl, Screech e Click. Dessa forma eu posso combinar os sons do exemplo com os sons das crianças. Este é o meu nó até agora.
<code>public class Node { ArrayList<Node> children; /* Constructor*/ public Node(ArrayList<Node> ExampleList) { this.ExampleList = ExampleList; this.parent = parent; this.children = children; } public ArrayList<Node> getChildren() { return children; } public void addChild(Node n) { children.add(n); } private ArrayList<Node> children; Enum phrase; private boolean isUsed; Node parent; public void setUsed(boolean isUsed) { this.isUsed = isUsed; } public boolean isUsed() { return isUsed; } //This method states if the node is a leaf public boolean isLeaf() { if (this.getChildren() == null) return true; else return false; } } </code>