Esempio n. 1
0
        private No montarArvoreInterna(DataTable amostras, string rotulo, Atributo[] atributos)
        {
            if (verificaSeTodosPertecemAMesmaClasse(amostras, rotulo).Count == 1)
            {
                return(new No(new Atributo(amostras.Rows[0])));
            }

            if (atributos.Length == 0)
            {
                return(new No(new Atributo(getValorMaisComum(amostras, rotulo))));
            }

            this.Total          = amostras.Rows.Count;
            this.RotuloAtributo = rotulo;
            this.TotalAltos     = totalRisco(amostras, "alto");
            this.TotalBaixos    = totalRisco(amostras, "baixo");
            this.TotalModerados = totalRisco(amostras, "moderado");

            this.Entropia = calcularEntropia(this.TotalAltos, this.TotalBaixos, this.TotalModerados);
            Atributo melhorAtributo = getMelhorAtributo(amostras, atributos);

            No raiz = new No(melhorAtributo);

            DataTable amostra = amostras.Clone();

            foreach (var item in melhorAtributo.Valores)
            {
                #region Seleciona todas os elementos com o valor deste atributo
                amostra.Rows.Clear();
                DataRow[] rows = amostras.Select(melhorAtributo.Nome + " = " + "'" + item.ToString() + "'");

                foreach (DataRow row in rows)
                {
                    amostra.Rows.Add(row.ItemArray);
                }
                #endregion

                #region Cria uma nova lista de atributos menos o atributo corrente que é o melhor atributo
                ArrayList atrbts = new ArrayList(atributos.Length - 1);
                for (int i = 0; i < atributos.Length; i++)
                {
                    if (atributos[i].Nome != melhorAtributo.Nome)
                    {
                        atrbts.Add(atributos[i]);
                    }
                }
                #endregion

                if (amostra.Rows.Count == 0)
                {
                    return(new No(new Atributo(getValorMaisComum(amostra, rotulo))));
                }
                else
                {
                    ArvoreDecisao id3     = new ArvoreDecisao();
                    No            noFilho = id3.montarArvore(amostra, rotulo, (Atributo[])atrbts.ToArray(typeof(Atributo)));
                    raiz.AdicionarNo(noFilho, item.ToString());
                }
            }

            return(raiz);
        }