Пример #1
0
        /// <summary>
        /// Найти минимум функции уже по готовому рою
        /// </summary>
        /// <param name="hive"></param>
        /// <param name="eps"></param>
        /// <param name="maxcountstep"></param>
        /// <param name="maxiter"></param>
        /// <returns></returns>
        private static Tuple <Point, double> Gets2D(Hive2D hive, double eps = 1e-10, int maxcountstep = 100, int maxiter = 150)
        {
            if (maxiter <= 0)
            {
                maxiter = Int32.MaxValue;
            }
            double e = hive.val;
            int    c = maxcountstep, k = 0;

            Debug.WriteLine($"Погрешность после инициализации пчёл:  {e}");
            while (e > eps && maxcountstep > 0 && hive.Radius > eps)
            {
                hive.MakeStep(w, fp, fg);
                k++;
                if (hive.val < e)
                {
                    Debug.WriteLine($"Hive method (iter {k}):  {e} ---> {hive.val}");
                    e            = hive.val;
                    maxcountstep = c;
                }
                else
                {
                    maxcountstep--;
                }
                //Debug.WriteLine( $"c = {maxcountstep}  val = {hive.val}");
                if (k == maxiter)
                {
                    break;
                }
            }
            return(new Tuple <Point, double>(hive.g, hive.val));
        }
Пример #2
0
        /// <summary>
        /// Получить минимум функции, посчитанный роевым методом
        /// </summary>
        /// <param name="f">Целевая функция</param>
        /// <param name="n">Размерность области определения целевой функции</param>
        /// <param name="min">Минимальное возможное значение каждого аргумента</param>
        /// <param name="max">Максимальное возможное значение каждого аргумента</param>
        /// <param name="eps">Допустимая погрешность</param>
        /// <param name="countpoints">Количество пчёл в рое</param>
        /// <param name="maxcountstep">Максимальное число неудачных итераций метода</param>
        /// <param name="center">Центр распредления точек</param>
        /// <param name="maxiter">Максимальное число итераций метода</param>
        /// <returns></returns>
        public static Tuple <Point, double> GetGlobalMin(Func <Point, double> f, Point center, double min = -1e12, double max = 1e12, double eps = 1e-10, int countpoints = 1000, int maxcountstep = 100, int maxiter = 150)
        {
            Point minimum = new Point(min);
            Point maximum = new Point(max);

            Hive2D hive;

            if (center == Point.Zero)
            {
                hive = new Hive2D(minimum, maximum, f, countpoints);
            }
            else
            {
                hive = new Hive2D(minimum + center, maximum + center, f, countpoints, center);
            }

            return(Gets2D(hive, eps, maxcountstep, maxiter));
        }