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