private void buttonApply_Click(object sender, EventArgs e) { if (MessageBox.Show("Сохранить кластеры?", "Анализ временных рядов", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { var logic = new FuzzyLabelService(); for (int i = 0; i < dataGridView.Rows.Count; ++i) { try { logic.InsertElement(new FuzzyLabelBindingModel { SeriesId = _seriesId, FuzzyLabelType = FuzzyLabelType.ClustFCM, FuzzyLabelName = dataGridView.Rows[i].Cells[0].Value.ToString(), Weigth = Convert.ToInt32( dataGridView.Rows[i].Cells[1].Value), MinVal = Convert.ToDouble(dataGridView.Rows[i].Cells[2].Value), Center = Convert.ToDouble(dataGridView.Rows[i].Cells[3].Value), MaxVal = Convert.ToDouble(dataGridView.Rows[i].Cells[4].Value) }); } catch (Exception ex) { MessageBox.Show("Ошибка при добавлении: " + ex.Message, "Анализ временных рядов", MessageBoxButtons.OK, MessageBoxIcon.Error); } } DialogResult = DialogResult.OK; Close(); } }
/// <summary> /// Генерируем правила определения тенденции по нечетким меткам /// </summary> /// <param name="seriesId"></param> /// <returns></returns> public static List <RuleTrendViewModel> GenerateRuleTrends(int seriesId) { var logicFL = new FuzzyLabelService(); var logicFT = new FuzzyTrendService(); var labels = logicFL.GetElements(seriesId); var trends = logicFT.GetElements(seriesId); // формируем правила нечетких тенденций List <RuleTrendViewModel> rules = new List <RuleTrendViewModel>(); // проходимся по всем нечетким меткам ряда foreach (var labFrom in labels) { foreach (var labTo in labels) { rules.Add(new RuleTrendViewModel { SeriesDiscriptionId = seriesId, FuzzyTrendName = FuzzyTrendLabel.Неопределено.ToString(), FuzzyTrendWeight = labTo.FuzzyLabelWeight - labFrom.FuzzyLabelWeight, FuzzyLabelFromId = labFrom.Id, FuzzyLabelFromName = labFrom.FuzzyLabelName, FuzzyLabelToId = labTo.Id, FuzzyLabelToName = labTo.FuzzyLabelName }); } } // сортируем правила по весам rules = rules.OrderBy(r => r.FuzzyTrendWeight).ToList(); DistributePointTrendsByTrends(rules, trends); return(rules); }
private bool CreateFuzzyLabel(string fileName, int seriesId) { lock (createFuzzyLabels) { try { int _countClasters = countCenters; while (true) { var clust = new ModelClustering(fileName, 1, _countClasters); if (clust.Calc()) { var points = clust.Points; var logic = new FuzzyLabelService(); List <FuzzyLabelBindingModel> fuzzyPoints = new List <FuzzyLabelBindingModel>(); for (int i = 0; i < countCenters; ++i) { if (points.Count > 0) { var point = points.First(r => r.X == points.Min(rex => rex.X)); var clustPoints = points.Where(r => r.ClusterIndex == point.ClusterIndex); fuzzyPoints.Add(new FuzzyLabelBindingModel { SeriesId = seriesId, FuzzyLabelType = FuzzyLabelType.ClustFCM, FuzzyLabelName = "Кластер " + (i + 1), Weigth = i + 1, MinVal = clustPoints.Min(rex => rex.X), Center = clust.Centers[(int)point.ClusterIndex].X, MaxVal = clustPoints.Max(rex => rex.X) }); points.RemoveAll(r => r.ClusterIndex == point.ClusterIndex); } else { fuzzyPoints.Add(new FuzzyLabelBindingModel { SeriesId = seriesId, FuzzyLabelType = FuzzyLabelType.ClustFCM, FuzzyLabelName = "Кластер " + (i + 1), Weigth = i + 1, MinVal = 0, Center = 0, MaxVal = 0 }); } } double delta = 5; fuzzyPoints[fuzzyPoints.Count - 1].MaxVal += delta; for (int i = 0; i < fuzzyPoints.Count - 1; ++i) { fuzzyPoints[i].MinVal -= delta; delta = (fuzzyPoints[i + 1].MinVal - fuzzyPoints[i].MaxVal) / 2 + 5; fuzzyPoints[i].MaxVal += delta; logic.InsertElement(fuzzyPoints[i]); } fuzzyPoints[fuzzyPoints.Count - 1].MinVal -= delta; logic.InsertElement(fuzzyPoints[fuzzyPoints.Count - 1]); return(true); } _countClasters--; if (_countClasters < 0) { throw new Exception("Кластеризация не прошла"); } } } catch (Exception ex) { throw new Exception(string.Format("CreateFuzzyLabel {0}: {1}", fileName, ex.Message)); } } }