ID3 Java Enum Tree
Я пытаюсь создать недвоичное дерево обучения, которое является упрощенной версией алгоритма ID3. Для этого я попытался использовать перечисления, потому что есть несколько ссылок, обучающих иерархии перечислений, но у меня возникают проблемы с передачей перечислений функциям, которые мне нужны для создания дерева. Я установил для дерева все, что мне нужно, как мог, но у меня возникли проблемы с первоначальным построением дерева.
Во-первых, я создал шесть перечислений, каждое со своим файлом, поэтому мне не нужно было писать «main.enumname». везде. Эти первые пять перечислений представляют диагностику автомобиля.
<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>
Затем я сделал еще два перечисления. Один для разных результатов диагностики и один для разных «тем» диагностику автомобиля.
<code>public enum problems {battery, starter, solenoid, outofgas, flooding} public enum features {lightstatus, soundstatus, fuelstats, scents, turn, problems} </code>
Затем я сделал пять примеров данных диагностики различных автомобилей для сортировки в дереве.
<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>
Я поместил в ArrayList различные средства диагностики автомобилей, называемые «Возможности», для перемешивания, поскольку они будут случайным образом использоваться для построения дерева.
<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>
Но как мне написать дерево, которое: Принимает в качестве признака перечисление, которое делает субъект корня совпадающим с перечислением, и все различные состояния перечисления дочерние элементы? Например, если soundstatus является корнем, он должен иметь четырех дочерних элементов: Normal, Howl, Screech и Click. Таким образом, я могу сопоставить звуки Примера со звуками детей. Это мой узел до сих пор.
<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>