Ejemplo n.º 1
0
 /// <summary>
 /// Получение веса нечеткой тенденции по названию
 /// </summary>
 /// <param name="trendName"></param>
 /// <returns></returns>
 public static int ToFuzzyTrendLabelWeight(FuzzyTrendLabel trendName)
 {
     if (FuzzyTrendWeight.TrendWeights.ContainsKey(trendName))
     {
         return(FuzzyTrendWeight.TrendWeights[trendName]);
     }
     else
     {
         return(TrendWeightNotFound);
     }
 }
        public static int GetPoint(FuzzyTrendLabel lastPointFTN, FuzzyTrendLabel beforeLastPointFTN)
        {
            var xNow = Converter.ToFuzzyTrendLabelWeight(lastPointFTN);

            if (xNow == Converter.TrendWeightNotFound)
            {
                throw new Exception(string.Format("Не найден вес для тенденции {0}", lastPointFTN));
            }
            var xLast = Converter.ToFuzzyTrendLabelWeight(beforeLastPointFTN);

            if (xLast == Converter.TrendWeightNotFound)
            {
                throw new Exception(string.Format("Не найден вес для тенденции {0}", beforeLastPointFTN));
            }
            // точка на фазовой плоскости для текущей точки ряда
            return(CalcPointOnPhasePlane(lastPointFTN, xLast - xNow));
        }
        /// <summary>
        /// Вычисляется точка по значении меры энтропии по нечеткой тенденции и точке фазовой плоскости по предыдущей тенденции (для прогнозирования)
        /// </summary>
        /// <param name="lastPointFTN"></param>
        /// <param name="beforeLastPointFTN"></param>
        /// <param name="tempStateEntropy"></param>
        /// <returns></returns>
        public static int CalcPointFromFFT(FuzzyTrendLabel lastPointFTN, FuzzyTrendLabel beforeLastPointFTN, StatisticsByEntropy tempStateEntropy, int seriesId)
        {
            var xLast = Converter.ToFuzzyTrendLabelWeight(lastPointFTN);

            if (xLast == Converter.TrendWeightNotFound)
            {
                throw new Exception("Не найден вес для тенденции " + lastPointFTN);
            }
            var xLastLast = Converter.ToFuzzyTrendLabelWeight(beforeLastPointFTN);

            if (xLastLast == Converter.TrendWeightNotFound)
            {
                throw new Exception("Не найден вес для тенденции " + beforeLastPointFTN);
            }
            var speedTrendLast = xLastLast - xLast;

            return(CalcPointFromFFT(Converter.ToEntropyByFT(tempStateEntropy.EndStateLingvistFT),
                                    CalcPointOnPhasePlane(lastPointFTN, speedTrendLast), seriesId));
        }
 /// <summary>
 /// Расчет точки на фазовой плоскости
 /// </summary>
 /// <param name="trend">вес тенденции</param>
 /// <param name="speedTrend">скорость тенденции</param>
 /// <returns></returns>
 public static int CalcPointOnPhasePlane(FuzzyTrendLabel trend, int speedTrend)
 {
     if (trend == FuzzyTrendLabel.СтабильностьСредняя && speedTrend == 0)
     {
         return(0);
     }
     else if (trend.ToString().Contains("Рост") && speedTrend > 0)
     {
         return(1);
     }
     else if (trend.ToString().Contains("Падение") && speedTrend > 0)
     {
         return(2);
     }
     else if (trend.ToString().Contains("Падение") && speedTrend < 0)
     {
         return(3);
     }
     else if (trend.ToString().Contains("Рост") && speedTrend < 0)
     {
         return(4);
     }
     else if (trend == FuzzyTrendLabel.СтабильностьСредняя && speedTrend > 0)
     {
         return(5);
     }
     else if (trend == FuzzyTrendLabel.СтабильностьСредняя && speedTrend < 0)
     {
         return(6);
     }
     else if (trend.ToString().Contains("Рост") && speedTrend == 0)
     {
         return(7);
     }
     else if (trend.ToString().Contains("Падение") && speedTrend == 0)
     {
         return(8);
     }
     else
     {
         return(-1);
     }
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Вычисление значения энтропии по нечеткой тенденции
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        public static double CalcEntropyByFT(FuzzyTrendLabel lastPointFTN, FuzzyTrendLabel beforeLastPointFTN, FuzzyTrendLabel beforeBeforeLastPointFTN,
                                             int seriesId, out int pointNext)
        {
            var xNow = Converter.ToFuzzyTrendLabelWeight(lastPointFTN);

            if (xNow == Converter.TrendWeightNotFound)
            {
                throw new Exception(string.Format("Не найден вес для тенденции {0}", lastPointFTN));
            }
            var xLast = Converter.ToFuzzyTrendLabelWeight(beforeLastPointFTN);

            if (xLast == Converter.TrendWeightNotFound)
            {
                throw new Exception(string.Format("Не найден вес для тенденции {0}", beforeLastPointFTN));
            }
            var xLastLast = Converter.ToFuzzyTrendLabelWeight(beforeBeforeLastPointFTN);

            if (xLastLast == Converter.TrendWeightNotFound)
            {
                throw new Exception(string.Format("Не найден вес для тенденции {0}", beforeBeforeLastPointFTN));
            }
            // точка на фазовой полскости для предыдущей точки ряда
            var beforePoint = CalcPointOnPhasePlane(beforeLastPointFTN, xLastLast - xLast);
            // точка на фазовой плоскости для текущей точки ряда
            var nextPoint = CalcPointOnPhasePlane(lastPointFTN, xLast - xNow);

            pointNext = nextPoint;
            // получаем энтропию
            using (var _context = new DissertationDbContext())
            {
                var point = _context.PointTrends.FirstOrDefault(rec => rec.StartPoint == beforePoint && rec.FinishPoint == nextPoint && rec.SeriesDiscriptionId == seriesId);
                if (point == null)
                {
                    return(1);
                }
                else
                {
                    point.Count++;
                    _context.SaveChanges();
                    return(1.0 - point.Weight);
                }
            }
        }