public static void Compare(iMatrix m1, iMatrix m2) { bool res = true; if (m1.xWidth != m2.xWidth || m1.yHeight != m2.yHeight) { Debug.WriteLine("Размеры не совпадают"); res = false; } for (int y = 0; y < m1.yHeight; y++) { for (int x = 0; x < m1.xWidth; x++) { if (m1[x, y].h != m2[x, y].h || m1[x, y].v != m2[x, y].v) { Debug.WriteLine(String.Format("Перегородки нейронов [{0},{1}] не совпадают.", x, y)); res = false; } } } if (res == true) { Debug.WriteLine("Проверка: Матрицы совпадают - Ok"); } }
/// <summary> /// Объект матрицы клонируется внутри, параметр m можно потом изменять /// </summary> /// <param name="m"></param> public iMatrixByte(iMatrix m) { if (m.xWidth != 8) { throw new Exception("Ширина матрицы не равна 8."); } matrix = m.Clone(); }
/// <summary> /// Присоединяет строку однострочной матрицы к матрице-получателю /// </summary> /// <param name="matrReceiver"></param> /// <param name="oneRowMatr"></param> /// <returns></returns> private iMatrix ConcatRowToMatrix(iMatrix matrReceiver, iMatrix oneRowMatr) { iMatrix resMatr; if (matrReceiver != null) { resMatr = matrReceiver.Clone(); resMatr.AppendRow(oneRowMatr.Rows[0]); } else { resMatr = oneRowMatr.Clone(); } return(resMatr); }
public iMatrixByte() { matrix = new iMatrix(8); }
/// <summary> /// /// </summary> /// <param name="teachingInput"></param> /// <param name="teachingOutput"></param> /// <param name="matr"></param> /// <param name="metrika"></param> /// <param name="level">Высота матрицы (номер добавляемой строки)</param> /// <param name="levelCount">Номер варианта матрицы на текущем уровне</param> /// <param name="levelTotal">Всего вариантов матриц на уровне</param> /// <returns></returns> private TeachingResult TeachMatrixRow( byte[] teachingInput, byte[] teachingOutput, iMatrix matr, long metrika, int level = 1, int levelCount = 0, int levelTotal = 1) { Debug.WriteLine(String.Format("Метрика {0}", metrika)); long localMetrika = metrika; iMatrixByte m = new iMatrixByte(); List <iMatrix> localOptimizedList = new List <iMatrix>(); while (m.matrix.NextWallCombinationOnLastRow() != MatrixIncrement.LimitReached) { //вычисляем метрику для текущей комбинации long combinationMetrika = ComputeCombinationMetrika(m, teachingInput, teachingOutput, localMetrika); Progress?.Invoke(m.matrix, null, null, new DrawData { currentMetrika = (ulong)localMetrika, level = level, levelCount = levelCount + 1, levelTotal = levelTotal }); if (combinationMetrika > localMetrika) { continue; } if (combinationMetrika == 0) //найден результат { localOptimizedList.Clear(); var resMatr = ConcatRowToMatrix(matr, m.matrix); resList.Add(resMatr); localMetrika = 0; Debug.WriteLine(String.Format("Метрика {0}", localMetrika)); if (resList.Count >= this.MaxMatrixFoundLimit) { Debug.WriteLine(String.Format("Достинут предел количества обученных матриц ({0}). Процесс завершен.", this.MaxMatrixFoundLimit)); return(TeachingResult.TeachingComplete); } } else if (combinationMetrika < localMetrika) //найдена матрица с лучшей метрикой { //сбрасываем список лучших и включаем текущую (из одной строки) в него localOptimizedList.Clear(); localOptimizedList.Add(m.matrix.Clone()); localMetrika = combinationMetrika; Debug.WriteLine(String.Format("Метрика {0}", localMetrika)); } else if (combinationMetrika == localMetrika) //найдена матрица для варианта оптимизации { if (localOptimizedList.Count < this.VariantsCountLimit) { localOptimizedList.Add(m.matrix.Clone()); //Debug.WriteLine(String.Format("Добавлена матрица. Метрика {0}", localMetrika)); } } } if (level >= this.MaxRowLimit) { return(TeachingResult.MaxRowLimitReached); } var counter = 0; var optMatrArray = GetLocalOptimizedArray(localOptimizedList); //если нашли не все матрицы и есть оптимизированные, то продолжаем поиск while (resList.Count < this.MaxMatrixFoundLimit && (counter < optMatrArray.Length)) { var nextMatr = ConcatRowToMatrix(matr, optMatrArray[counter]); var nextInputs = GetNextInputsAsOutputs(new iMatrixByte(optMatrArray[counter]), teachingInput); var res = TeachMatrixRow(nextInputs, teachingOutput, nextMatr, localMetrika - 1, level + 1, counter, optMatrArray.Length); if (res != TeachingResult.ContinueTeaching) { return(res); } else { counter++; } } return(TeachingResult.ContinueTeaching); }