示例#1
0
        public void BuildDecisionTree(DataTable table, List<Attrib> attributes, Svazn relation)
        {
            //проходим по колонкам данных
            for (int i = 0; i < table.Columns.Count - 1; i++)
            {

                foreach (Attrib attribute in attributes)//
                {
                    //находим атрибут соответствующей колонки
                    if (table.Columns[i].Caption == attribute.attributeName)
                    {

                        //подсчитываем да, нет в каждой строке
                        for (int j = 0; j < table.Rows.Count; j++)
                        {
                            foreach (Dannue option in attribute.options)
                            {
                                if (table.Rows[j][i].ToString() == option.optionName)
                                {
                                    if (table.Rows[j].Field<string>("Play") == Const.Yes)
                                    {
                                        option.yesAmount++;
                                    }
                                    else if (table.Rows[j].Field<string>("Play") == Const.No)
                                    {
                                        option.noAmount++;
                                    }
                                }
                            }
                        }

                        /////////////

                        foreach (Dannue option in attribute.options)
                        {
                            //вызывается метод вычисление веса информации
                            option.setInformationValue();
                            //если хоть да или нет = 0, то общий вес тоже = 0
                            if (Double.IsNaN(option.informationValue))
                            {
                                option.informationValue = 0;
                            }

                            Console.WriteLine(option.informationValue);
                        }

                        //вычисляем среднее значение веса информации для всего атрибута
                        attribute.setAverageInfVal();

                        Console.WriteLine("      " + attribute.averageInformationValue);
                    }
                }
            }

            Attrib choosenAttribute = attributes[0];

            //выбираем атрибут с максимальной весом информации
            for (int i = 1; i < attributes.Count; i++)
            {
                if (attributes[i].averageInformationValue > choosenAttribute.averageInformationValue)
                {
                    choosenAttribute = attributes[i];
                }
            }

            Console.WriteLine("         " + choosenAttribute.averageInformationValue);
            Console.WriteLine(Environment.NewLine + Environment.NewLine);

            List<Svazn> relations = new List<Svazn>();

            DataTable dataTable;

            foreach (Dannue option in choosenAttribute.options)
            {
                if (option.informationValue != 0)
                {
                    dataTable = table.Copy();
                    //проходим по строкам таблицы
                    for (int i = 0; i < dataTable.Rows.Count; i++)
                    {
                        //выбираем одну опцию, удаляя строки, которые ее не содержат
                        //оставляем строки содержащие требуемое значение (опцию) колонки (аттрибута)
                        if (dataTable.Rows[i].Field<string>(choosenAttribute.attributeName) != option.optionName)
                        {
                            dataTable.Rows.Remove(dataTable.Rows[i]);
                            i--;
                        }
                    }

                    //добавляем ветки к дереву
                    relations.Add(new Svazn(null, option.optionName, dataTable));
                }
                else
                {
                    string nodeData = "";

                    if (option.yesAmount == 0)
                    {
                        nodeData = Const.No;
                    }
                    else if (option.noAmount == 0)
                    {
                        nodeData = Const.Yes;
                    }

                    relations.Add(new Svazn(new TreeUzel(nodeData, null, null), option.optionName, null));
                }
            }

            List<Attrib> tempAttributes = new List<Attrib>();

            //выбираем все атрибуты, кроме максимального
            foreach (Attrib attribute in attributes)
            {
                if (attribute != choosenAttribute)
                {
                    tempAttributes.Add(attribute);
                }
            }

            TreeUzel tempTreeNode = new TreeUzel(choosenAttribute.attributeName, relations, tempAttributes);

            //добавляем ветку в список веток дерева
            this.treeNodes.Add(tempTreeNode);

            if (relation != null)
            {
                relation.childNode = tempTreeNode;
            }

            foreach (Attrib attribute in attributes)
            {
                foreach (Dannue option in attribute.options)
                {
                    option.yesAmount = 0;
                    option.noAmount = 0;
                }

                attribute.averageInformationValue = 0;
            }

            //перебераем все все ветки и строим рекурсивно Decision tree для каждой зависимости
            foreach (Svazn newRelation in relations)
            {
                if (newRelation.childNode == null)
                {
                    //рекурсия
                    BuildDecisionTree(newRelation.dataTable, tempTreeNode.attributes, newRelation);
                }
                else
                {
                    continue;
                }
            }
        }
示例#2
0
        public void PrintDecisionTree(TreeUzel treeNode)
        {
            if (treeNode.nodeData != Const.Yes && treeNode.nodeData != Const.No)
            {
                Console.WriteLine(treeNode.nodeData);
            }
            else
            {
                Console.WriteLine("                      " + treeNode.nodeData);
            }

            if (treeNode.relations != null)
            {
                foreach (Svazn relation in treeNode.relations)
                {
                    Console.WriteLine("           " + relation.childEdge);

                    PrintDecisionTree(relation.childNode);
                }
            }
        }
示例#3
0
        public Svazn(TreeUzel childNode, string childEdge, DataTable dataTable)
        {
            this.childNode = childNode;
            this.childEdge = childEdge;

            this.dataTable = dataTable;
        }