public override a_Fuzzy_System Generate(a_Fuzzy_System Approximate, Abstract_generator_conf config)
        {
            type_alg            = ((k_mean_rules_generator_conf)config).Алгоритм;
            count_rules         = ((k_mean_rules_generator_conf)config).Количество_правил;
            type_func           = ((k_mean_rules_generator_conf)config).Функция_принадлежности;
            nebulisation_factor = ((k_mean_rules_generator_conf)config).Экспоненциальный_вес_алгоритма;
            Max_iteration       = ((k_mean_rules_generator_conf)config).Итераций;
            need_precision      = ((k_mean_rules_generator_conf)config).Точность;


            k_mean_base K_Agl = null;

            switch (type_alg)
            {
            case Type_k_mean_algorithm.Gath_geva: K_Agl = new k_mean_Gath_Geva(Approximate.Learn_Samples_set, Max_iteration, need_precision, count_rules, nebulisation_factor); break;

            case Type_k_mean_algorithm.Gustafson_Kessel: K_Agl = new k_mean_Gustafson_kessel(Approximate.Learn_Samples_set, Max_iteration, need_precision, count_rules, nebulisation_factor); break;

            case Type_k_mean_algorithm.FCM: K_Agl = new k_mean_base(Approximate.Learn_Samples_set, Max_iteration, need_precision, count_rules, nebulisation_factor); break;
            }
            K_Agl.Calc();

            Knowlege_base_ARules New_Rules = new Knowlege_base_ARules();

            for (int i = 0; i < count_rules; i++)
            {
                int []      order_terms = new int [Approximate.Learn_Samples_set.Count_Vars];
                List <Term> term_set    = new List <Term>();
                for (int j = 0; j < Approximate.Learn_Samples_set.Count_Vars; j++)
                {
                    Term temp_term = Term.Make_Term(K_Agl.Centroid_cordinate_S[i][j], Math.Sqrt(Calc_distance_for_member_ship_function_for_Clust(i, j, K_Agl)) * 3, type_func, j);
                    term_set.Add(temp_term);
                }
                New_Rules.constuct__and_add_the_Rule(term_set, Approximate);
            }

            a_Fuzzy_System Result = Approximate;

            if (Result.Rulles_Database_Set.Count > 0)
            {
                Result.Rulles_Database_Set[0] = New_Rules;
            }
            else
            {
                Result.Rulles_Database_Set.Add(New_Rules);
            }
            Result.unlaid_protection_fix();
            GC.Collect();
            return(Result);
        }
Beispiel #2
0
        public void init_first(Knowlege_base_ARules base_rule, Random rand, Individ.Type_init prm_init)
        {
            bool the_first = true;

            int count_ready = 0;

            do
            {
                the_popualate.Add(new Individ(base_rule, Data, count_vars, the_first, rand, prm_init));

                count_ready++;
                the_first = false;
            } while (count_ready < size_populate);
        }
Beispiel #3
0
        private double[, ,] extract_Rules(Knowlege_base_ARules rules_Database)
        {
            int count_rules       = rules_Database.Rules_Database.Count;
            int count_vars        = rules_Database.Rules_Database[0].Term_of_Rule_Set.Count;
            int count_term_params = Member_Function.Count_Params_For_Term(rules_Database.Terms_Set[0].Term_Func_Type);

            double [,,] Result = new double[count_rules, count_vars, count_term_params];

            for (int i = 0; i < count_rules; i++)
            {
                for (int j = 0; j < count_vars; j++)
                {
                    Term temp_term = rules_Database.Rules_Database[i].Term_of_Rule_Set.First(x => x.Number_of_Input_Var == j);
                    for (int k = 0; k < count_term_params; k++)
                    {
                        Result[i, j, k] = temp_term.Parametrs[k];
                    }
                }
            }

            return(Result);
        }
Beispiel #4
0
        public Individ(Knowlege_base_ARules Source, a_samples_set data, int count_vars, bool the_first, Random rand, Type_init par_type_init)
        {
            hrom_vector       = new Hromosom(new Knowlege_base_ARules(Source));
            step_sko          = new List <double>(count_vars);
            step_rotate       = new List <double>(count_vars);
            count_step_sko    = count_vars;
            count_step_rotate = count_vars;
            Data = data;
            for (int i = 0; i < count_vars; i++)
            {
                step_sko.Add(0 + rand.NextDouble() * (data.Attribute_Scatter(i) * 0.05));
                step_rotate.Add(-1 * Math.PI + rand.NextDouble() * 2 * Math.PI);
            }
            if (!the_first)
            {
                switch (par_type_init)
                {
                case Type_init.Случайная: hrom_vector.init_random(rand, data); break;

                case Type_init.Ограниченная: hrom_vector.init_constrain(rand, data); break;
                }
            }
        }
Beispiel #5
0
        public override Fuzzy_system.Approx_Singletone.a_Fuzzy_System TuneUpFuzzySystem(Fuzzy_system.Approx_Singletone.a_Fuzzy_System Approximate, Abstract_learn_algorithm_conf conf)
        {
            count_iteration = ((Term_Config_PSO_Search_conf)conf).Количество_итераций;
            c1             = ((Term_Config_PSO_Search_conf)conf).Коэффициент_c1;
            c2             = ((Term_Config_PSO_Search_conf)conf).Коэффициент_c2;
            w              = 1;
            count_particle = ((Term_Config_PSO_Search_conf)conf).Особей_в_популяции;

            a_Fuzzy_System result = Approximate;

            Knowlege_base_ARules[] X  = new Knowlege_base_ARules[count_particle];
            Knowlege_base_ARules[] V  = new Knowlege_base_ARules[count_particle];
            Knowlege_base_ARules[] Pi = new Knowlege_base_ARules[count_particle];
            Knowlege_base_ARules   Pg = new Knowlege_base_ARules();

            double[] Errors    = new double[count_particle];
            double[] OldErrors = new double[count_particle];
            double   minError  = 0;
            Random   rnd       = new Random();

            for (int i = 0; i < count_particle; i++)
            {
                Knowlege_base_ARules temp_c_Rule = new Knowlege_base_ARules(result.Rulles_Database_Set[0]);
                X[i]         = temp_c_Rule;
                Errors[i]    = result.approx_Learn_Samples(0);
                OldErrors[i] = Errors[i];
                Pi[i]        = new Knowlege_base_ARules(X[i]);
                V[i]         = new Knowlege_base_ARules(X[i]);
                //
                for (int j = 0; j < V[i].Terms_Set.Count; j++)
                {
                    for (int k = 0; k < Member_Function.Count_Params_For_Term(V[i].Terms_Set[j].Term_Func_Type); k++)
                    {
                        if (i == 0)
                        {
                            V[i].Terms_Set[j].Parametrs[k] = 0;
                        }
                        else
                        {
                            V[i].Terms_Set[j].Parametrs[k] = rnd.NextDouble() - 0.5;
                        }
                    }
                    double[] bf = new double[V[i].all_conq_of_rules.Length];
                    for (int k = 0; k < V[i].all_conq_of_rules.Length; k++)
                    {
                        if (i == 0)
                        {
                            bf[k] = 1;
                        }
                        else
                        {
                            bf[k] = rnd.NextDouble() / 200;
                        }
                    }
                    V[i].all_conq_of_rules = bf;
                }
            }
            Pg       = new Knowlege_base_ARules(result.Rulles_Database_Set[0]);
            minError = Errors[0];
            for (int i = 0; i < count_iteration; i++)
            {
                for (int j = 0; j < count_particle; j++)
                {
                    w = 1 / (1 + Math.Exp(-(Errors[j] - OldErrors[j]) / 0.01));
                    for (int k = 0; k < X[j].Terms_Set.Count; k++)
                    {
                        for (int q = 0; q < Member_Function.Count_Params_For_Term(X[j].Terms_Set[k].Term_Func_Type); q++)
                        {
                            double bp = Pi[j].Terms_Set[k].Parametrs[q];
                            V[j].Terms_Set[k].Parametrs[q] = V[j].Terms_Set[k].Parametrs[q] * w + c1 * rnd.NextDouble() * (bp - X[j].Terms_Set[k].Parametrs[q]) +
                                                             c2 * rnd.NextDouble() * (Pg.Terms_Set[k].Parametrs[q] - X[j].Terms_Set[k].Parametrs[q]);
                            X[j].Terms_Set[k].Parametrs[q] += V[j].Terms_Set[k].Parametrs[q];
                        }
                    }
                    double[] bf  = new double[V[j].all_conq_of_rules.Length];
                    double[] bfw = new double[V[j].all_conq_of_rules.Length];
                    for (int k = 0; k < V[j].all_conq_of_rules.Length; k++)
                    {
                        bfw[k] = V[j].all_conq_of_rules[k] * w + c1 * rnd.NextDouble() * (Pi[j].all_conq_of_rules[k] - X[j].all_conq_of_rules[k]) +
                                 c2 * rnd.NextDouble() * (Pg.all_conq_of_rules[k] - X[j].all_conq_of_rules[k]);
                        double sw = X[j].all_conq_of_rules[k] + bfw[k];
                        if (sw > 0 && sw <= 2)
                        {
                            bf[k] = sw;
                        }
                        else
                        {
                            bf[k]  = X[j].all_conq_of_rules[k];
                            bfw[k] = V[j].all_conq_of_rules[k];
                        }
                    }
                    X[j].all_conq_of_rules = bf;
                    V[j].all_conq_of_rules = bfw;
                    double newError = 0;
                    result.Rulles_Database_Set.Add(X[j]);
                    int  temp_index = result.Rulles_Database_Set.Count - 1;
                    bool success    = true;
                    try
                    {
                        newError = result.approx_Learn_Samples(temp_index);
                    }
                    catch (Exception)
                    {
                        success = false;
                    }
                    result.Rulles_Database_Set.RemoveAt(temp_index);
                    if (success && (newError > Errors[j]))
                    {
                        OldErrors[j] = Errors[j];
                        Errors[j]    = newError;

                        Pi[j] = new Knowlege_base_ARules(X[j]);
                    }
                    if (minError < newError)
                    {
                        minError = newError;
                        Pg       = new Knowlege_base_ARules(X[j]);
                    }
                }
            }
            result.Rulles_Database_Set[0] = Pg;
            GC.Collect();
            return(result);
        }
Beispiel #6
0
        public static a_Fuzzy_System load_UFS(this a_Fuzzy_System Approx, string file_name)
        {
            a_Fuzzy_System result = Approx;

            Knowlege_base_ARules New_dataBase = new Knowlege_base_ARules();

            List <string> added_term = new List <string>();


            XmlDocument Source = new XmlDocument();

            Source.Load(file_name);

            XmlNode rulles_node = Source.DocumentElement.SelectSingleNode("descendant::Rules");

            if (rulles_node == null)
            {
                throw new System.FormatException("Нет базы правил в ufs файле");
            }
            int     count_rulles  = XmlConvert.ToInt32(rulles_node.Attributes.GetNamedItem("Count").Value);
            XmlNode varibles_node = Source.DocumentElement.SelectSingleNode("descendant::Variables");

            if (varibles_node == null)
            {
                throw new System.FormatException("Нет термов в базе правил, ошибка UFS");
            }
            for (int i = 0; i < count_rulles; i++)
            {
                XmlNode antecedent_node       = rulles_node.ChildNodes[i].SelectSingleNode("Antecedent");
                int     count_antecedent_term = XmlConvert.ToInt32(antecedent_node.Attributes.GetNamedItem("Count").Value);
                int []  Order_term            = new int[count_antecedent_term];
                for (int j = 0; j < count_antecedent_term; j++)
                {
                    double[]            Value_temp;
                    Type_Term_Func_Enum type_term = Type_Term_Func_Enum.Треугольник;
                    int    num_var   = Approx.Learn_Samples_set.Input_Attributes.IndexOf(Approx.Learn_Samples_set.Input_Attributes.Find(x => x.Name.Equals(antecedent_node.ChildNodes[j].Attributes.GetNamedItem("Variable").Value, StringComparison.OrdinalIgnoreCase)));
                    string name_term = antecedent_node.ChildNodes[j].Attributes.GetNamedItem("Term").Value;
                    if (added_term.Contains(name_term))
                    {
                        Order_term[j] = added_term.IndexOf(name_term);
                    }
                    else
                    {
                        XmlNode term_node = varibles_node.SelectSingleNode("descendant::Term[@Name='" + name_term + "']");
                        int     count_MB  = 0;
                        switch (term_node.Attributes.GetNamedItem("Type").Value)
                        {
                        case "Triangle": { count_MB = 3; type_term = Type_Term_Func_Enum.Треугольник; break; }

                        case "Gauss": { count_MB = 2; type_term = Type_Term_Func_Enum.Гауссоида; break; }

                        case "Parabolic": { count_MB = 2; type_term = Type_Term_Func_Enum.Парабола; break; }

                        case "Trapezoid": { count_MB = 4; type_term = Type_Term_Func_Enum.Трапеция; break; }
                        }
                        Value_temp = new double[count_MB];
                        term_node  = term_node.SelectSingleNode("Params");
                        for (int p = 0; p < count_MB; p++)
                        {
                            string tett         = term_node.ChildNodes[p].Attributes.GetNamedItem("Number").Value;
                            int    number_param = XmlConvert.ToInt32(term_node.ChildNodes[p].Attributes.GetNamedItem("Number").Value);
                            Value_temp[number_param] = XmlConvert.ToDouble(term_node.ChildNodes[p].Attributes.GetNamedItem("Value").Value);
                        }

                        Term temp_term = new Term(Value_temp, type_term, num_var);

                        New_dataBase.Terms_Set.Add(temp_term);
                        added_term.Add(name_term);
                        Order_term[j] = New_dataBase.Terms_Set.Count - 1;
                    }
                }

                XmlNode consequnt_node = rulles_node.ChildNodes[i].SelectSingleNode("Consequent");
                double  Approx_value   = XmlConvert.ToDouble(consequnt_node.Attributes.GetNamedItem("Value").Value);

                ARule temp_rule = new ARule(New_dataBase.Terms_Set, Order_term, Approx_value);
                New_dataBase.Rules_Database.Add(temp_rule);
            }
            result.Rulles_Database_Set.Clear();
            result.Rulles_Database_Set.Add(New_dataBase);

            GC.Collect();
            return(result);
        }
Beispiel #7
0
 public Hromosom(Hromosom the_Source)
 {
     core_check    = new Knowlege_base_ARules(the_Source.core_check);
     Fenotip_kons  = core_check.all_conq_of_rules.ToList();
     Fenotip_terms = core_check.Terms_Set;
 }
Beispiel #8
0
 public Hromosom(Knowlege_base_ARules Source)
 {
     core_check    = Source;
     Fenotip_kons  = core_check.all_conq_of_rules.ToList();
     Fenotip_terms = core_check.Terms_Set;
 }
Beispiel #9
0
        public override a_Fuzzy_System Generate(Fuzzy_system.Approx_Singletone.a_Fuzzy_System Approximate, Abstract_generator_conf config)
        {
            Random         rand   = new Random();
            a_Fuzzy_System result = Approximate;

            if (result.Count_Rulles_Databases == 0)
            {
                Knowlege_base_ARules temp_rules = new Knowlege_base_ARules();
                result.Rulles_Database_Set.Add(temp_rules);
            }



            type_term    = ((Generator_Rulles_simple_random_conf)config).Функция_принадлежности;
            stable_terms = (int)((Generator_Rulles_simple_random_conf)config).Тип_Термов;
            count_rules  = ((Generator_Rulles_simple_random_conf)config).Количество_правил;


            for (int j = 0; j < count_rules; j++)
            {
                int[] order = new int[result.Count_Vars];
                Type_Term_Func_Enum temp_type_term;
                if (stable_terms == 0)
                {
                    temp_type_term = type_term;
                }
                else
                {
                    temp_type_term = Generator_type_term();
                }

                List <Term> temp_term_list = new List <Term>();
                for (int k = 0; k < result.Count_Vars; k++)
                {
                    double[] parametrs = new double[Member_Function.Count_Params_For_Term(temp_type_term)];

                    switch (temp_type_term)
                    {
                    case Type_Term_Func_Enum.Треугольник:
                        parametrs[0] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));
                        parametrs[1] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));
                        parametrs[2] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));
                        Array.Sort(parametrs);
                        break;

                    case Type_Term_Func_Enum.Гауссоида: parametrs[0] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));
                        parametrs[1] = (rand.NextDouble() + 0.01) * 0.5 *
                                       (result.Learn_Samples_set.Attribute_Max(k) -
                                        result.Learn_Samples_set.Attribute_Min(k));
                        break;

                    case Type_Term_Func_Enum.Парабола: parametrs[0] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));
                        parametrs[1] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));
                        Array.Sort(parametrs);
                        break;

                    case Type_Term_Func_Enum.Трапеция: parametrs[0] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));
                        parametrs[1] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));
                        parametrs[2] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));
                        parametrs[3] = result.Learn_Samples_set.Attribute_Min(k) + rand.NextDouble() * (result.Learn_Samples_set.Attribute_Max(k) - result.Learn_Samples_set.Attribute_Min(k));

                        Array.Sort(parametrs);

                        break;
                    }
                    Term temp_term = new Term(parametrs, temp_type_term, k);
                    result.Rulles_Database_Set[0].Terms_Set.Add(temp_term);
                    temp_term_list.Add(temp_term);
                    order[k] = result.Rulles_Database_Set[0].Terms_Set.Count - 1;
                }
                double approx_Value = result.Nearest_Approx(temp_term_list);
                ARule  temp_Rule    = new ARule(result.Rulles_Database_Set[0].Terms_Set, order, approx_Value);
                result.Rulles_Database_Set[0].Rules_Database.Add(temp_Rule);
            }



            result.unlaid_protection_fix();
            GC.Collect();
            return(result);
        }