private static Point GetRandom(Point min, Point max) { var r = new MathNet.Numerics.Random.CryptoRandomSource(); Point p = new Point(min); p.x += r.NextDouble() * (max.x - min.x); p.y += r.NextDouble() * (max.y - min.y); return(p); }
/// <summary> /// Создать частицу в окне решений /// </summary> /// <param name="min">Минимальные возможные значения положения</param> /// <param name="max">Максимальные возможные значения положения</param> /// <param name="f">Целевая функция</param> public Bee(Vectors min, Vectors max, Func <Vectors, double> f) { var r = new MathNet.Numerics.Random.CryptoRandomSource(); x = new Vectors(min); for (int i = 0; i < x.Deg; i++) { x[i] += r.NextDouble() * (max[i] - min[i]); } // v = null;f = null;bestval = double.MaxValue;p = null; WhenX(min, max, f); }
/// <summary> /// Задать пчелу по известному начальному положению /// </summary> /// <param name="x"></param> /// <param name="min"></param> /// <param name="max"></param> /// <param name="f"></param> public Bee1D(double x, double min, double max, Func <double, double> f) { random = new MathNet.Numerics.Random.CryptoRandomSource(); this.x = x; p = x; this.f = new Func <double, double>(f); bestval = f(p); double vmax = (max - min), vmin = -vmax; v = vmin; v = random.NextDouble() * (vmax - vmin); }
/// <summary> /// Задать пчелу по известному начальному положению /// </summary> /// <param name="x"></param> /// <param name="min"></param> /// <param name="max"></param> /// <param name="f"></param> public Bee2D(Point x, Point min, Point max, Func <Point, double> f) { random = new MathNet.Numerics.Random.CryptoRandomSource(); this.x = x; p = x; this.f = new Func <Point, double>(f); bestval = f(p); Point vmax = (max - min), vmin = -vmax; v = vmin; v.x = random.NextDouble() * (vmax.x - vmin.x); v.y = random.NextDouble() * (vmax.y - vmin.y); }
/// <summary> /// Переопределить скорость /// </summary> /// <param name="w">Коэффициент инерции</param> /// <param name="fp">Весовой коэффициент для p</param> /// <param name="fg">Весовой коэффициент для g</param> /// <param name="g">Наилучшее положение по рою</param> public void RecalcVOld(double w, double fp, double fg, Vectors g) { var r = new MathNet.Numerics.Random.CryptoRandomSource(); double fi = fg + fp; Vectors rp = new Vectors(v.Deg), rg = new Vectors(v.Deg); for (int i = 0; i < v.Deg; i++) { rp[i] = r.NextDouble(); rg[i] = r.NextDouble(); } v = 2 * w / Math.Abs(2 - fi - Math.Sqrt(fi * (fi - 4))) * (v + fp * Vectors.CompMult(rp, p - x) + fg * Vectors.CompMult(rg, g - x)); }
/// <summary> /// Задать наилучшее положение и случайные скорости, когда x уже известно /// </summary> /// <param name="min"></param> /// <param name="max"></param> /// <param name="f"></param> public void WhenX(Vectors min, Vectors max, Func <Vectors, double> f) { var r = new MathNet.Numerics.Random.CryptoRandomSource(); p = new Vectors(x); this.f = new Func <Vectors, double>(f); bestval = f(p); Vectors vmax = (max - min), vmin = -vmax; v = new Vectors(vmin); for (int i = 0; i < x.Deg; i++) { v[i] += r.NextDouble() * (vmax[i] - vmin[i]); } }