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); }
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]); //} }
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 }