/// <summary>
        /// Построение эталонов для набора объектов
        /// </summary>
        /// <param name="details">Список объектов и их признаков</param>
        /// <param name="resultPath">Путь для сохранения результатов</param>
        public static void Build(IList <IDetail> details, string resultPath)
        {
            var random = new Random();

            for (int i = 0; i < details.Count; i++)
            {
                var currentKMas = details[i].Standarts;

                var index           = random.Next(currentKMas.Count);
                var currentStandart = currentKMas[index];
                currentKMas.RemoveAt(index);

                var resultMas = new List <Value>();
                var resultK   = new List <double[]>();

                Console.Write($"Создание эталонов для объекта {details[i].Name}: ");

                var count    = (double)currentKMas.Count;
                var countMas = currentKMas.Count;


                while (currentKMas.Count > 0)
                {
                    for (int j = 0; j < details.Count; j++)
                    {
                        var value = MinValueDetail.GetMinValue(i == j ? currentKMas : details[j].Standarts, currentStandart);
                        resultMas.Add(value);
                    }

                    var tmp = resultMas.Select(v => v.MinValue).ToList();

                    var indexMin = tmp.IndexOf(tmp.Min());
                    index = random.Next(currentKMas.Count);

                    if (indexMin != i)
                    {
                        resultK.Add(currentStandart);
                        currentStandart = currentKMas[index];
                        currentKMas.RemoveAt(index);
                    }
                    else
                    {
                        currentKMas.RemoveAt(resultMas[indexMin].Index);
                    }

                    resultMas.Clear();
                }


                Console.WriteLine("Выполнено!");

                WriteResult(resultK, resultPath, details[i].Name);
                resultK.Clear();
            }
        }
Beispiel #2
0
        /// <summary>
        /// Тестирование распознания объекта
        /// </summary>
        /// <param name="details">Объекты для распознания</param>
        /// <param name="standarts">Набор эталонов</param>
        public static void Testing(IList <IDetailError> details, IList <IDetail> standarts)
        {
            for (int i = 0; i < details.Count; i++)
            {
                var dt = details[i].Standarts;

                var results    = new List <double>();
                var countError = 0;

                Console.Write($"Тестирование объекта {details[i].Name}: ");

                var count = dt.Count;

                for (int j = 0; j < count; j++)
                {
                    foreach (var standart in standarts)
                    {
                        var value = (IValue)MinValueDetail.GetMinValue(standart.Standarts, dt[j]);
                        results.Add(value.MinValue);
                    }

                    var index = results.IndexOf(results.Min());

                    if (index != i)
                    {
                        countError++;
                    }

                    results.Clear();
                }


                Console.WriteLine($"кол-во ошибок {countError}/{dt.Count} | точность вычислений {(double)(dt.Count - countError) / dt.Count}");

                details[i].SetError(countError);
            }
        }