/// <summary> /// Расчет выбранной комбинации каналов/помех /// </summary> /// <param name="testCase"></param> /// <returns>Результирующий блок данных</returns> public RawDataMatrix PerformCombination(string testCase) { //Console.WriteLine("Тестовый вариант:" + testCase); resultMatrixes = new List <RawDataMatrix>(); //Console.WriteLine("Имена матриц для обобщенного массива:"); for (int i = 0; i < testCase.Length; i++) { string m_name = $"m{i + 1}_{testCase[i]}"; // Console.WriteLine(m_name); resultMatrixes.Add(matrixes.FirstOrDefault(x => x.Name == m_name)); } //Console.WriteLine(resultMatrixes.Count); //Вывод несоответствий базовой матрице //foreach (RawDataMatrix m in resultMatrixes) //{ // Console.WriteLine($"Matrix {m.Name}. Mismathces: {m.GetMismatches(mBase).Count()}"); //} //начало основного алгоритма MatrixProcessor processor = new MatrixProcessor(resultMatrixes, mW, mBase); RawDataMatrix result = processor.GetResult(); Gamma = processor.GetGamma(); return(result); }
/// <summary> /// Инициализирует 30/24/18 матриц (в зависимости от количества каналов) /// </summary> public void InitializeMatrixes() { matrixes = new List <RawDataMatrix>(); for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 6; j++) { RawDataMatrix m = new RawDataMatrix(path, i, j); if (m.IsInitialized) { matrixes.Add(m); } } } channelCount = matrixes.Count / 6; //кол-во помеховых обстановок -6, а каналов 5,4 или 3 switch (channelCount) { case 5: mW = new Matrix(path, $"mW{channelCount}"); break; case 4: mW = new Matrix(path, $"mW{channelCount}"); break; case 3: mW = new Matrix(path, $"mW{channelCount}"); break; default: throw new Exception($"Не определены исходные матрицы. Количество исходных матриц:{channelCount}"); } if (!mW.IsInitialized) { throw new Exception($"Матрица весов mW{channelCount} не обнаружена. Завершение приложения"); } mBase = new Matrix(path, "mBase"); if (!mBase.IsInitialized) { throw new Exception($"Эталонная матрица mBase не обнаружена. Завершение приложения"); } }
/// <summary> /// Основная функция рассчета достоверности. w - текущий весовой коэффициент /// </summary> /// <param name="w"></param> private void CalculateReliability(int w) { RawDataMatrix matrix = new RawDataMatrix(mBase.GetXSize(), mBase.GetYSize()); for (int i = 0; i < mBase.GetXSize(); i++) { for (int j = 0; j < mBase.GetYSize(); j++) { int mCount = matrixes.Count(); int[] cur_cell = new int[mCount]; try { int counter = 0; foreach (var m in matrixes) { cur_cell[counter] = m[i, j]; counter++; } } catch (Exception ex) { throw; } matrix[i, j] = GetResultCell(cur_cell, w); } } int N_tmp = matrix.GetMismatches(mBase).N; //CheckReliability(matrix); if (w == mW.GetXSize() - 1) { nm = N_tmp; Console.WriteLine("NM:===>" + nm); } // Console.WriteLine($">>>Текущая достоверность: {N_tmp }<<<"); if (N == -1 || N_tmp < N) { N = N_tmp; k = w + 1; //нумерация с 1 Console.WriteLine($"K:====>{k}. N={N}"); mResult = matrix; } }