Example #1
0
        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");
            }
        }
Example #2
0
 /// <summary>
 /// Объект матрицы клонируется внутри, параметр m можно потом изменять
 /// </summary>
 /// <param name="m"></param>
 public iMatrixByte(iMatrix m)
 {
     if (m.xWidth != 8)
     {
         throw new Exception("Ширина матрицы не равна 8.");
     }
     matrix = m.Clone();
 }
Example #3
0
        /// <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);
        }
Example #4
0
 public iMatrixByte()
 {
     matrix = new iMatrix(8);
 }
Example #5
0
        /// <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);
        }