Пример #1
0
        /// <summary>
        /// Оптимизация методом пчелиной колонии
        /// </summary>
        /// <param name="f">Оптимизируемая функция</param>
        /// <param name="min">Нижняя граница области решений</param>
        /// <param name="max">Верхняя граница области решений</param>
        /// <param name="n">Размерность области решений</param>
        /// <param name="s">Общее число пчёл</param>
        /// <param name="p">Число пчёл, выбранных для последующего исследования (p меньше s)</param>
        /// <param name="e">Число особо исследуемых пчёл (e меньше p)</param>
        /// <param name="sp">Число вспомогательных пчёл для пчёл из p</param>
        /// <param name="se">Число вспомогательных пчёл для пчёл из e</param>
        /// <param name="delta">Радиус окрестности</param>
        /// <param name="eps">Допустимая погрешность</param>
        /// <param name="maxcount">Максимальное число итераций</param>
        /// <returns></returns>
        public static Tuple <Vectors, double> GetGlobalMin(Func <Vectors, double> f, Vectors min, Vectors max, int n = 1, int s = 1000, int p = 300, int e = 100, int sp = 50, int se = 100, double delta = 1.0, double eps = 1e-10, int maxcount = 10)
        {
            SBee[] mas = SBee.Create(f, min, max, s);
            int    k   = 0;

            while (SBee.GetBest(mas).v > eps && maxcount > 0 && k < 3)
            {
                double old = SBee.GetBest(mas).v;
                SBee.MakeStep(ref mas, f, min, max, n, p, e, sp, se, delta);
                double now = SBee.GetBest(mas).v;
                if (now < old)
                {
                    Debug.WriteLine($"\tColony: {old} ---> {now}");
                    k = 0;
                }
                else
                {
                    k++;
                }


                maxcount--;
            }

            SBee res = SBee.GetBest(mas);

            return(new Tuple <Vectors, double>(res.x, res.v));
        }