/// <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(); } }
/// <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); } }