Ejemplo n.º 1
0
        string chooseTerm(double X, LingVar lingVar)
        {
            string termName = "";
            double _t1 = 0, _t2 = 0;

            for (int i = 0; i < lingVar.terms.Length; i++)
            {
                _t1 = lingVar.lv.GetLabelMembership(lingVar.terms[i].Name, (float)X);
                if (_t1 > _t2)
                {
                    _t2      = _t1;
                    termName = lingVar.terms[i].Name;
                }
            }

            return(termName);
        }
Ejemplo n.º 2
0
        void InitCuckoo()
        {
            openFileDialog1.InitialDirectory = @"D:\YandexDisk\Программирование\GestureRecognize\GestureRecognize\bin\Debug";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                BinaryFormatter bf = new BinaryFormatter();
                using (FileStream fs = File.OpenRead(openFileDialog1.FileName))
                {
                    scopes = (Scope[])bf.Deserialize(fs);
                }
            }

            deltaRMS = new LingVar(0, "deltarms", -4f, 23, scopes, nums);
            Turns0   = new LingVar(1, "turns0", 0, 175, scopes, nums);
            Zeros0   = new LingVar(2, "zeros0", 14, 80, scopes, nums);
            Turns1   = new LingVar(3, "turns1", 0, 175, scopes, nums);
            Zeros1   = new LingVar(4, "zeros1", 14, 80, scopes, nums);

            const int numOutTerms = 10;

            output = new LingVar("out", numOutTerms, 1, numOutTerms, 1f);

            fuzzyDB = new Database();

            fuzzyDB.AddVariable(deltaRMS.lv);
            fuzzyDB.AddVariable(Turns0.lv);
            fuzzyDB.AddVariable(Turns1.lv);
            fuzzyDB.AddVariable(Zeros0.lv);
            fuzzyDB.AddVariable(Zeros1.lv);
            fuzzyDB.AddVariable(output.lv);

            loadDataOnly();

            IS = new InferenceSystem(fuzzyDB, new CentroidDefuzzifier(CentrDefu));

            string rule = "";

            for (int i = 0; i < nums.Length; i++)
            {
                rule  = "IF deltarms IS " + deltaRMS.terms[i].Name;
                rule += " AND turns0 IS " + Turns0.terms[i].Name;
                rule += " AND turns1 IS " + Turns1.terms[i].Name;
                rule += " AND zeros0 IS " + Zeros0.terms[i].Name;
                rule += " AND zeros1 IS " + Zeros1.terms[i].Name;

                rule += " THEN out IS " + output.terms[i].Name;

                IS.NewRule(i.ToString(), rule);
            }


            //chart.RangeX = new AForge.Range(14, 80);
            //chart.AddDataSeries("0", Color.Black, AForge.Controls.Chart.SeriesType.Line, 3, true);
            //chart.AddDataSeries("1", Color.Red, AForge.Controls.Chart.SeriesType.Line, 3, true);
            //chart.AddDataSeries("2", Color.Blue, AForge.Controls.Chart.SeriesType.Line, 3, true);
            //chart.AddDataSeries("3", Color.Green, AForge.Controls.Chart.SeriesType.Line, 3, true);
            //chart.AddDataSeries("4", Color.Pink, AForge.Controls.Chart.SeriesType.Line, 3, true);
            //chart.AddDataSeries("5", Color.Purple, AForge.Controls.Chart.SeriesType.Line, 3, true);
            //chart.AddDataSeries("6", Color.Orange, AForge.Controls.Chart.SeriesType.Line, 3, true);
            //chart.AddDataSeries("7", Color.Yellow, AForge.Controls.Chart.SeriesType.Line, 3, true);
            //chart.AddDataSeries("8", Color.Lime, AForge.Controls.Chart.SeriesType.Line, 3, true);
            //chart.AddDataSeries("9", Color.Coral, AForge.Controls.Chart.SeriesType.Line, 3, true);



            //// get membership of some points to the cool fuzzy set
            //double[][,] chartValues = new double[10][,];
            //for (int i = 0; i < 10; i++)
            //    chartValues[i] = new double[140, 2];

            //// showing the shape of the linguistic variable - the shape of its labels memberships from start to end
            //int j = 0;
            //for (float x = 14; x < 80; x += 0.5f, j++)
            //{
            //    double[] ys = new double[10];

            //    for (int m = 0; m < 10; m++)
            //    {
            //        //ys[m] = deltaRMS.lv.GetLabelMembership("deltarms" + (m*6).ToString(), x);
            //        ys[m] = Zeros0.lv.GetLabelMembership("zeros0" + (m * 6).ToString(), x);

            //    }

            //    for (int m = 0; m < 10; m++)
            //    {
            //        chartValues[m][j, 0] = x;
            //        chartValues[m][j, 1] = ys[m];
            //    }
            //}

            //// plot membership to a chart
            //for (int m = 0; m < 10; m++)
            //{
            //    chart.UpdateDataSeries(m.ToString(), chartValues[m]);
            //}
        }
Ejemplo n.º 3
0
        void InitEvenly()
        {
            const int   numTerms = 10;
            const float cross    = 1.8f;

            RMS0       = new LingVar("rms0", numTerms, 0.4f / 10000f, 23f / 10000f, cross);
            RMS1       = new LingVar("rms1", numTerms, 0.4f / 10000f, 23f / 10000f, cross);
            Deviation0 = new LingVar("deviation0", numTerms, 0.5f / 10000f, 34.26f / 10000f, cross);
            Deviation1 = new LingVar("deviation1", numTerms, 0.5f / 10000f, 34.26f / 10000f, cross);
            Turns0     = new LingVar("turns0", numTerms, 0, 175, cross);
            Turns1     = new LingVar("turns1", numTerms, 0, 175, cross);
            Zeros0     = new LingVar("zeros0", numTerms, 14, 80, cross);
            Zeros1     = new LingVar("zeros1", numTerms, 14, 80, cross);
            deltaRMS   = new LingVar("deltarms", numTerms, -12.5f, 20.8f, cross);

            const int numOutTerms = 10;

            output = new LingVar("out", numOutTerms, 1, numOutTerms, 1.3f);

            fuzzyDB = new Database();
            //fuzzyDB.AddVariable(RMS1.lv);
            //fuzzyDB.AddVariable(RMS2.lv);
            //fuzzyDB.AddVariable(Deviation1.lv);
            //fuzzyDB.AddVariable(Deviation2.lv);
            fuzzyDB.AddVariable(Turns0.lv);
            fuzzyDB.AddVariable(Turns1.lv);
            fuzzyDB.AddVariable(Zeros0.lv);
            fuzzyDB.AddVariable(Zeros1.lv);
            fuzzyDB.AddVariable(deltaRMS.lv);
            fuzzyDB.AddVariable(output.lv);

            RulesCalc = new List <float> [numTerms, numTerms, numTerms, numTerms, numTerms][];
            Rules     = new int[numTerms, numTerms, numTerms, numTerms, numTerms];

            for (int q = 0; q < numTerms; q++)
            {
                for (int w = 0; w < numTerms; w++)
                {
                    for (int e = 0; e < numTerms; e++)
                    {
                        for (int r = 0; r < numTerms; r++)
                        {
                            for (int t = 0; t < numTerms; t++)
                            {
                                RulesCalc[q, w, e, r, t] = new List <float>[numOutTerms] {
                                    new List <float>(), new List <float>(), new List <float>(), new List <float>(), new List <float>(), new List <float>(), new List <float>(), new List <float>(), new List <float>(), new List <float>()
                                };
                                Rules[q, w, e, r, t] = 0;
                            }
                        }
                    }
                }
            }

            loadData();

            for (int q = 0; q < numTerms; q++)
            {
                for (int w = 0; w < numTerms; w++)
                {
                    for (int e = 0; e < numTerms; e++)
                    {
                        for (int r = 0; r < numTerms; r++)
                        {
                            for (int t = 0; t < numTerms; t++)
                            {
                                float[] average = new float[numOutTerms];          // среднее арифметическое

                                for (int i = 0; i < numOutTerms; i++)              // количество листов (столбцов с цифрами) / количество выходных термов
                                {
                                    int count = RulesCalc[q, w, e, r, t][i].Count; // количество цифр в столбце

                                    if (count == 0)                                // если столбец пуст
                                    {
                                        average[i] = 0;
                                    }

                                    else // если в столбце что-то есть
                                    {
                                        average[i] = RulesCalc[q, w, e, r, t][i].Average();
                                    }
                                }

                                // посчитали среднее для всех столбцов, можно выбирать правило
                                float _t = average.Max();
                                if (_t != 0)
                                {
                                    Rules[q, w, e, r, t] = Array.IndexOf(average, _t) + 1;
                                }
                                else
                                {
                                    Rules[q, w, e, r, t] = 0;
                                }
                            }
                        }
                    }
                }
            }

            #region Заполнение нулевых ячеек таблицы правил

            //bool zers = true, zer = false;
            //double countenv = (Math.Pow(3, 5) - 1);
            //float div = 2f;

            //int ZEROSAAAAA1 = 0;
            //int ZEROSAAAAA2 = 0;

            //while (zers)
            //{
            //    ZEROSAAAAA1 = 0;
            //    for (int q = 0; q < numTerms; q++)
            //        for (int w = 0; w < numTerms; w++)
            //            for (int e = 0; e < numTerms; e++)
            //                for (int r = 0; r < numTerms; r++)
            //                    for (int t = 0; t < numTerms; t++)
            //                    {
            //                        if (Rules[q, w, e, r, t] == 0)
            //                        {
            //                            ZEROSAAAAA1++;
            //                            int[] environs = new int[numOutTerms];
            //                            int notclass = 0, inclass = 0;
            //                            int outofrange = 0;
            //                            zer = true;
            //                            int fuu = 0;

            //                            for (int a = -1; a <= 1; a++)
            //                                for (int s = -1; s <= 1; s++)
            //                                    for (int d = -1; d <= 1; d++)
            //                                        for (int f = -1; f <= 1; f++)
            //                                            for (int g = -1; g <= 1; g++)
            //                                            {
            //                                                if ((q + a >= 0 && w + s >= 0 && e + d >= 0 && r + f >= 0 && t + g >= 0) &&
            //                                                        (q + a < numTerms && w + s < numTerms && e + d < numTerms && r + f < numTerms && t + g < numTerms))
            //                                                {
            //                                                    if (!(q == a && w == s && e == d && r == f && t == g))
            //                                                    {
            //                                                        if (Rules[q + a, w + s, e + d, r + f, t + g] == 0)
            //                                                            notclass++;
            //                                                        else
            //                                                        {
            //                                                            environs[Rules[q + a, w + s, e + d, r + f, t + g] - 1]++;
            //                                                            inclass++;
            //                                                        }
            //                                                    }
            //                                                }
            //                                                else
            //                                                {
            //                                                    int fu = 0;
            //                                                    if ((q + a < 0) || (q + a >= numTerms))
            //                                                    {
            //                                                        fu++;
            //                                                    }
            //                                                    if ((w + s < 0) || (w + s >= numTerms))
            //                                                    {
            //                                                        fu++;
            //                                                    }
            //                                                    if ((e + d < 0) || (e + d >= numTerms))
            //                                                    {
            //                                                        fu++;
            //                                                    }
            //                                                    if ((r + f < 0) || (r + f >= numTerms))
            //                                                    {
            //                                                        fu++;
            //                                                    }
            //                                                    if ((t + g < 0) || (t + g >= numTerms))
            //                                                    {
            //                                                        fu++;
            //                                                    }

            //                                                    if (fu > fuu) fuu = fu;

            //                                                    outofrange++;
            //                                                }


            //                                            }

            //                            int max = environs.Max();

            //                            if ((fuu == 0) && (max != 0))
            //                            {
            //                                if (inclass > 242f / div)
            //                                {
            //                                    Rules[q, w, e, r, t] = Array.IndexOf(environs, max) + 1;
            //                                }
            //                            }
            //                            else if (fuu == 1)
            //                            {
            //                                if (inclass > 161f / div)
            //                                {
            //                                    Rules[q, w, e, r, t] = Array.IndexOf(environs, max) + 1;
            //                                }
            //                            }
            //                            else if (fuu == 2)
            //                            {
            //                                if (notclass > 107f / div)
            //                                {
            //                                    Rules[q, w, e, r, t] = Array.IndexOf(environs, max) + 1;
            //                                }
            //                            }
            //                            else if (fuu == 3)
            //                            {
            //                                if (notclass > 71f / div)
            //                                {
            //                                    Rules[q, w, e, r, t] = Array.IndexOf(environs, max) + 1;
            //                                }
            //                            }
            //                            else if (fuu == 4)
            //                            {
            //                                if (notclass > 47f / div)
            //                                {
            //                                    Rules[q, w, e, r, t] = Array.IndexOf(environs, max) + 1;
            //                                }
            //                            }
            //                            else if (fuu == 5)
            //                            {
            //                                if (notclass > 31f / div)
            //                                {
            //                                    Rules[q, w, e, r, t] = Array.IndexOf(environs, max) + 1;
            //                                }
            //                            }


            //                        }
            //                    }

            //    if (!zer) zers = false;
            //    zer = false;
            //    if (ZEROSAAAAA1 == ZEROSAAAAA2)
            //        zers = false;
            //    else
            //        ZEROSAAAAA2 = ZEROSAAAAA1;

            //    Console.WriteLine(ZEROSAAAAA1);
            //}
            #endregion


            #region Оптимизация правил
            //RulesOptimizer[] rulOpt = new RulesOptimizer[numOutTerms];
            //for (int i = 0; i < rulOpt.Length; i++)
            //{
            //    rulOpt[i] = new RulesOptimizer();
            //}

            //for (int q = 0; q < numTerms; q++)
            //    for (int w = 0; w < numTerms; w++)
            //        for (int e = 0; e < numTerms; e++)
            //            for (int r = 0; r < numTerms; r++)
            //                for (int t = 0; t < numTerms; t++)
            //                {
            //                    if (Rules[q, w, e, r, t] != 0)
            //                    {
            //                        rulOpt[Rules[q, w, e, r, t] - 1].addRule(q, w, e, r, t);
            //                    }
            //                }

            //foreach (var item in rulOpt)
            //{
            //    item.optimize();
            //}
            #endregion

            /* Формат правил
             *
             *            лист
             *             \/
             * Прi = | 1 | 1 | 1 | 2 | 1 | <- массив листов
             *       | 5 | 3 |   | 4 |   |
             *       |   | 6 |   |   |   |
             *
             * rules[i]       - List<int>[]
             * rules[i][k]    - List<int>
             * rules[i][k][n] - int
             */

            IS = new InferenceSystem(fuzzyDB, new CentroidDefuzzifier(CentrDefu));

            string rule;
            for (int q = 0; q < numTerms; q++)
            {
                for (int w = 0; w < numTerms; w++)
                {
                    for (int e = 0; e < numTerms; e++)
                    {
                        for (int r = 0; r < numTerms; r++)
                        {
                            for (int t = 0; t < numTerms; t++)
                            {
                                if (Rules[q, w, e, r, t] != 0)
                                {
                                    rule  = "";
                                    rule += "IF turns0 IS " + Turns0.terms[q].Name;
                                    rule += " AND turns1 IS " + Turns1.terms[w].Name;
                                    rule += " AND zeros0 IS " + Zeros0.terms[e].Name;
                                    rule += " AND zeros1 IS " + Zeros1.terms[r].Name;
                                    rule += " AND deltarms IS " + deltaRMS.terms[t].Name;
                                    rule += " THEN out IS " + output.terms[Rules[q, w, e, r, t] - 1].Name;

                                    IS.NewRule(q.ToString() + w.ToString() + e.ToString() + r.ToString() + t.ToString(), rule);
                                }
                            }
                        }
                    }
                }
            }


            #region Тестирование для оптимизации
            //string rule = "";

            //for (int q = 0; q < rulOpt.Length; q++) // перечисляет выходы от 0 до 9
            //{
            //    for (int w = 0; w < rulOpt[q].Rules.Count; w++) // перебирает правила для каждого выхода
            //    {
            //        Clause[][] clauses = new Clause[rulOpt[q].Rules[w].Length][]; // размерность 5 х N

            //        for (int e = 0; e < rulOpt[q].Rules[w].Length; e++) // от 0 до 4 перебирает лингвистические переменные
            //        {
            //            clauses[e] = new Clause[rulOpt[q].Rules[w][e].Count]; // кол-во клауз = кол-ву вариантов значений лингвистических переменных

            //            for (int r = 0; r < clauses[e].Length; r++)
            //            {
            //                int itemp = rulOpt[q].Rules[w][e][r];

            //                switch (e)
            //                {
            //                    case 0:
            //                        clauses[e][r] = new Clause(Turns0.lv, Turns0.terms[itemp]);
            //                        break;
            //                    case 1:
            //                        clauses[e][r] = new Clause(Turns1.lv, Turns1.terms[itemp]);
            //                        break;
            //                    case 2:
            //                        clauses[e][r] = new Clause(Zeros0.lv, Zeros0.terms[itemp]);
            //                        break;
            //                    case 3:
            //                        clauses[e][r] = new Clause(Zeros1.lv, Zeros1.terms[itemp]);
            //                        break;
            //                    case 4:
            //                        clauses[e][r] = new Clause(deltaRMS.lv, deltaRMS.terms[itemp]);
            //                        break;
            //                }
            //            }
            //        }

            //        rule = "IF ";

            //        string temp;
            //        for (int e = 0; e < clauses.Length; e++)
            //        {
            //            temp = "(";
            //            for (int r = 0; r < clauses[e].Length - 1; r++)
            //            {
            //                temp += clauses[e][r] + " OR ";
            //            }
            //            temp += clauses[e][clauses[e].Length - 1] + ")";

            //            if (e == clauses.Length - 1)
            //                rule += temp;
            //            else
            //                rule += temp + " AND ";
            //        }

            //        rule += " THEN out IS " + output.terms[q].Name;

            //        //rule += "IF turns0 IS " + Turns0.terms[q].Name;
            //        //rule += " AND turns1 IS " + Turns1.terms[w].Name;
            //        //rule += " AND zeros0 IS " + Zeros0.terms[e].Name;
            //        //rule += " AND zeros1 IS " + Zeros1.terms[r].Name;
            //        //rule += " AND deltarms IS " + deltaRMS.terms[t].Name;
            //        //rule += " THEN out IS " + output.terms[Rules[q, w, e, r, t] - 1].Name;

            //        IS.NewRule(q.ToString() + w.ToString(), rule);

            //    }

            //}
            #endregion
        }