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