Beispiel #1
0
        static void Main(string[] args)
        {
            Console.WriteLine("-- TEACHING MATRIX -- " + DateTime.Now.ToLongTimeString() + " -");

            var teacher = new Teaching(100, 50, 1);

            teacher.Progress = DrawProgress;

            //умножение на 2 - работает до 7
            var inpValues = new byte[] { 1, 2, 3, 4, 5, 6 };
            var outValues = new byte[] { 2, 4, 6, 8, 10, 12 };

            var res = teacher.Teach(inpValues, outValues, 1000);

            Console.CursorTop += teacher.resList.Count > 0 ? teacher.resList[0].yHeight * 2 + 3 : 3;

            if (res == TeachingResult.TeachingComplete)
            {
                Console.WriteLine("Завершено. Всего матриц " + teacher.resList.Count);
                MatrixDraw.DrawMatrix(teacher.resList[0]);
            }
            else if (res == TeachingResult.MaxRowLimitReached)
            {
                Console.WriteLine("Превышен максимальный размер матрицы.");
                Console.ReadKey();
                return;
            }
            else if (res == TeachingResult.ContinueTeaching)
            {
                Console.WriteLine("Незавершено. Всего матриц: " + teacher.resList.Count);
                if (teacher.resList.Count == 0)
                {
                    Console.ReadKey();
                    return;
                }
            }

            Console.WriteLine();

            foreach (var m in teacher.resList)
            {
                Console.WriteLine("Тест на обучающей выборке");
                CheckFoundMatrix(m, inpValues, outValues);
            }

            while (true)
            {
                Console.WriteLine("Проверить значение: ");
                var read = Console.ReadLine();
                if (String.IsNullOrWhiteSpace(read))
                {
                    break;
                }

                byte intTemp = Convert.ToByte(read);
                var  matr    = new iMatrixSpc.iMatrixByte(teacher.resList[0]);
                var  mRes    = matr.Process(intTemp);
                Console.WriteLine(intTemp + " => " + mRes);
            }
        }
Beispiel #2
0
        private byte[] GetNextInputsAsOutputs(iMatrixByte m, byte[] teachingInput)
        {
            var nextOutputs = new List <byte>();

            for (int i = 0; i < teachingInput.Length; i++)
            {
                var nextOut = m.Process(teachingInput[i]);
                nextOutputs.Add(nextOut);
            }
            return(nextOutputs.ToArray());
        }
Beispiel #3
0
        private long ComputeCombinationMetrika(iMatrixByte m, byte[] teachingInput, byte[] teachingOutput, long localMetrika)
        {
            long combinationMetrika = 0;

            for (int i = 0; i < teachingInput.Length; i++)
            {
                combinationMetrika += Math.Abs(m.Process(teachingInput[i]) - teachingOutput[i]);
                if (combinationMetrika > localMetrika)
                {
                    return(combinationMetrika);
                }
            }
            return(combinationMetrika);
        }
Beispiel #4
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);
        }