Files
Population-optimization-alg…/MQL5/Include/Math/AOs/TestFunctions.mqh
T
2026-04-19 22:04:37 +04:00

863 lines
52 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//——————————————————————————————————————————————————————————————————————————————
class C_Function
{
public: //====================================================================
double CalcFunc (double &args []) //function arguments
{
int numbOfFunctions = ArraySize (args) / 2;
if (numbOfFunctions < 1) return GetMinFunValue ();
double x, y;
double sum = 0.0;
for (int i = 0; i < numbOfFunctions; i++)
{
x = args [i * 2];
y = args [i * 2 + 1];
if (!MathIsValidNumber (x)) return GetMinFunValue ();
if (!MathIsValidNumber (y)) return GetMinFunValue ();
if (x < GetMinRangeX ()) return GetMinFunValue ();
if (x > GetMaxRangeX ()) return GetMinFunValue ();
if (y < GetMinRangeY ()) return GetMinFunValue ();
if (y > GetMaxRangeY ()) return GetMinFunValue ();
//double u = -0.1;
//x = x * cos (u) - y * sin (u);
//y = x * sin (u) + y * cos (u);
sum += Core (x, y);
}
sum /= numbOfFunctions;
return sum;
}
double GetMinRangeX () { return xMinRange;}
double GetMaxRangeX () { return xMaxRange;}
double GetMinRangeY () { return yMinRange;}
double GetMaxRangeY () { return yMaxRange; }
double GetMinFuncX () { return xGlobalMin;}
double GetMaxFuncX () { return xGlobalMax;}
double GetMinFuncY () { return yGlobalMin;}
double GetMaxFuncY () { return yGlobalMax;}
double GetMinFunValue () { return globalMinFunValue;}
double GetMaxFunValue () { return globalMaxFunValue;}
string GetFuncName () { return fuName;}
virtual double Core (double x, double y)
{
return 0.0;
}
virtual double Core (double &x [])
{
return 0.0;
}
double xMinRange;
double xMaxRange;
double yMinRange;
double yMaxRange;
double xGlobalMax;
double yGlobalMax;
double xGlobalMin;
double yGlobalMin;
double globalMinFunValue;
double globalMaxFunValue;
string fuName;
public:
double Scale (double In, double InMIN, double InMAX, double OutMIN, double OutMAX)
{
if (OutMIN == OutMAX) return (OutMIN);
if (InMIN == InMAX) return ((OutMIN + OutMAX) / 2.0);
else
{
if (In < InMIN) return (OutMIN);
if (In > InMAX) return (OutMAX);
return (((In - InMIN) * (OutMAX - OutMIN) / (InMAX - InMIN)) + OutMIN);
}
}
double SeInDiSp (double In, double InMin, double InMax, double Step)
{
return (InMin + Step * (double)MathRound ((In - InMin) / Step));
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
enum EFunc
{
NONE_Func,
Skin,
SkinDiscrete,
Hilly,
HillyDiscrete,
Peaks,
Paraboloid,
Rastrigin,
Forest,
Megacity,
Universe,
Ackley,
GoldsteinPrice,
Shaffer,
Griewank,
Rosenbrock
};
C_Function *SelectFunction (EFunc f)
{
C_Function *func;
switch (f)
{
case Skin:
func = new C_Skin ();
return (GetPointer (func));
case SkinDiscrete:
func = new C_SkinDiscrete ();
return (GetPointer (func));
case Hilly:
func = new C_Hilly ();
return (GetPointer (func));
case HillyDiscrete:
func = new C_HillyDiscrete ();
return (GetPointer (func));
case Peaks:
func = new C_Peaks ();
return (GetPointer (func));
case Paraboloid:
func = new C_Paraboloid ();
return (GetPointer (func));
case Rastrigin:
func = new C_Rastrigin ();
return (GetPointer (func));
case Forest:
func = new C_Forest ();
return (GetPointer (func));
case Megacity:
func = new C_Megacity ();
return (GetPointer (func));
case Universe:
func = new C_Universe ();
return (GetPointer (func));
case Ackley:
func = new C_Ackley ();
return (GetPointer (func));
case GoldsteinPrice:
func = new C_GoldsteinPrice ();
return (GetPointer (func));
case Shaffer:
func = new C_Shaffer ();
return (GetPointer (func));
case Griewank:
func = new C_Griewank ();
return (GetPointer (func));
case Rosenbrock:
func = new C_Rosenbrock ();
return (GetPointer (func));
default:
func = NULL; return NULL;
}
}
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_Skin : public C_Function
{
public: //====================================================================
C_Skin ()
{
fuName = "Skin";
//границы функции
xMinRange = -6; xMaxRange = 6;
yMinRange = -6; yMaxRange = 6;
//координаты максимума
globalMaxFunValue = 1.0; //14.060606995534872
xGlobalMax = -3.315699080744071;
yGlobalMax = -3.0724849592478254;
//координаты минимума
globalMinFunValue = 0.0; //-4.313787122075561
xGlobalMin = 3.070541082164328;
yGlobalMin = 2.8028056112224458;
}
double Core (double x, double y)
{
double a1 = 2 * x * x;
double a2 = 2 * y * y;
double b1 = MathCos (a1) - 1.1;
b1 = b1 * b1;
double c1 = MathSin (0.5 * x) - 1.2;
c1 = c1 * c1;
double d1 = MathCos (a2) - 1.1;
d1 = d1 * d1;
double e1 = MathSin (0.5 * y) - 1.2;
e1 = e1 * e1;
double res = b1 + c1 - d1 + e1;
return Scale (res, -4.313787122075561, 14.060606995534872, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_SkinDiscrete : public C_Function
{
public: //====================================================================
C_SkinDiscrete ()
{
fuName = "Skin Discrete";
//границы функции
xMinRange = f.GetMinRangeX (); xMaxRange = f.GetMaxRangeX ();
yMinRange = f.GetMinRangeY (); yMaxRange = f.GetMaxRangeY ();
//координаты максимума
globalMaxFunValue = f.GetMaxFunValue ();
xGlobalMax = f.GetMaxFuncX ();
yGlobalMax = f.GetMaxFuncY ();
//координаты минимума
globalMinFunValue = f.GetMinFunValue ();
xGlobalMin = f.GetMinFuncX ();
yGlobalMin = f.GetMinFuncY ();
}
C_Skin f;
double Core (double x, double y)
{
double res = f.Core (x, y);
return SeInDiSp (res, f.GetMinFunValue (), f.GetMaxFunValue (), 0.2);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_Hilly : public C_Function
{
public: //====================================================================
C_Hilly ()
{
fuName = "Hilly";
//границы функции
xMinRange = -3; xMaxRange = 3;
yMinRange = -3; yMaxRange = 3;
//координаты максимума
globalMaxFunValue = 1; //229.91931214214105
xGlobalMax = -1.4809053654574758;
yGlobalMax = 0.6254111843389699;
//координаты минимума
globalMinFunValue = 0.0; //-39.701816104859866
xGlobalMin = 1.3200361419666748;
yGlobalMin = 1.9993728393766546;
}
double Core (double x, double y)
{
double res = 20.0 + x * x + y * y - 10.0 * cos (2.0 * M_PI * x) - 10.0 * cos (2.0 * M_PI * y)
- 30.0 * exp (-(pow (x - 1.0, 2) + y * y) / 0.1)
+ 200.0 * exp (-(pow (x + M_PI * 0.47, 2) + pow (y - M_PI * 0.2, 2)) / 0.1) //global max
+ 100.0 * exp (-(pow (x - 0.5, 2) + pow (y + 0.5, 2)) / 0.01)
- 60.0 * exp (-(pow (x - 1.33, 2) + pow (y - 2.0, 2)) / 0.02) //global min
- 40.0 * exp (-(pow (x + 1.3, 2) + pow (y + 0.2, 2)) / 0.5)
+ 60.0 * exp (-(pow (x - 1.5, 2) + pow (y + 1.5, 2)) / 0.1);
return Scale (res, -39.701816104859866, 229.91931214214105, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_HillyDiscrete : public C_Function
{
public: //====================================================================
C_HillyDiscrete ()
{
fuName = "Hilly Discrete";
//границы функции
xMinRange = f.GetMinRangeX (); xMaxRange = f.GetMaxRangeX ();
yMinRange = f.GetMinRangeY (); yMaxRange = f.GetMaxRangeY ();
//координаты максимума
globalMaxFunValue = f.GetMaxFunValue ();
xGlobalMax = f.GetMaxFuncX ();
yGlobalMax = f.GetMaxFuncY ();
//координаты минимума
globalMinFunValue = f.GetMinFunValue ();
xGlobalMin = f.GetMinFuncX ();
yGlobalMin = f.GetMinFuncY ();
}
C_Hilly f;
double Core (double x, double y)
{
double res = f.Core (x, y);
return SeInDiSp (res, f.GetMinFunValue (), f.GetMaxFunValue (), 0.05);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_Peaks : public C_Function
{
public: //===================================================================
C_Peaks ()
{
fuName = "Peaks";
//границы функции
xMinRange = -10; xMaxRange = 10;
yMinRange = -10; yMaxRange = 10;
//координаты максимума
globalMaxFunValue = 1.0; //33.252940767815666
xGlobalMax = 3.6172118548423646;
yGlobalMax = 4.911783359236607;
//координаты минимума
globalMinFunValue = 0.0; //-4.1530660577390766
xGlobalMin = 2.3467375713370155;
yGlobalMin = 5.6567339091158795;
}
double Core (double x, double y)
{
double k = 0.0;
double X = 3.0 - x;
double Y = 4.0 - y;
if (x >= 0.0 && y >= 0.0)
{
k = 20.0;
}
double res = k * MathPow ((1 - X), 2) * MathExp (-X * X - (Y + 1) * (Y + 1)) - 10 * (0.2 * X - MathPow (X, 3) - MathPow (Y, 5)) * MathExp (-X * X - Y * Y) - 1 / 3 * MathExp (-(X + 1) * (X + 1) - Y * Y);
return Scale (res, -4.1530660577390766, 33.252940767815666, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
// Paraboloid, F(Xn) ∈ [0.0; 1.0], X ∈ [-10.0; 10.0], maximization
class C_Paraboloid : public C_Function
{
public: //===================================================================
C_Paraboloid ()
{
fuName = "Paraboloid";
//границы функции
xMinRange = -10; xMaxRange = 10;
yMinRange = -10; yMaxRange = 10;
//координаты максимума
globalMaxFunValue = 1;
xGlobalMax = 0.0;
yGlobalMax = 0.0;
//координаты минимума
globalMinFunValue = 0.0;
xGlobalMin = 10;
yGlobalMin = 10;
}
double Core (double x, double y)
{
return ((-x * x + 100.0) * 0.01 + (-y * y + 100.0) * 0.01) * 0.5;
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_Rastrigin : public C_Function
{
public: //===================================================================
C_Rastrigin ()
{
fuName = "Rastrigin";
//границы функции
xMinRange = -5; xMaxRange = 5;
yMinRange = -5; yMaxRange = 5;
//координаты максимума
globalMaxFunValue = 1.0; //80.70658038767792
xGlobalMax = 4.522993657149848;
yGlobalMax = 4.522993657149848;
//координаты минимума
globalMinFunValue = 0.0; //1.2390563437933917e-14
xGlobalMin = 0.0;
yGlobalMin = 0.0;
}
double Core (double x, double y)
{
double res = 20.0 + x * x + y * y
- 10.0 * cos (2.0 * M_PI * x)
- 10.0 * cos (2.0 * M_PI * y);
//return Scale (res, 1.2390563437933917e-14, 80.70658038767792, 0.0, 1.0);
return Scale (-res, -80.70658038767792, -1.2390563437933917e-14, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_Forest : public C_Function
{
public: //===================================================================
C_Forest ()
{
fuName = "Forest";
//границы функции
xMinRange = -42.50; xMaxRange = -37;
yMinRange = -45; yMaxRange = -39.8;
//координаты максимума
globalMaxFunValue = 1.0; // raw: 3.0269632693877031
xGlobalMax = -37.6991104999996764;
yGlobalMax = -41.9822944000032692;
//координаты минимума
globalMinFunValue = 0.0; // raw: 0.0000000000000000
xGlobalMin = -39.0288234999996675;
yGlobalMin = -39.9586780000031325;
}
double Core (double x, double y)
{
double a = MathSin (MathSqrt (MathAbs (x - 1.13) + MathAbs (y - 2.0)));
double b = MathCos (MathSqrt (MathAbs (MathSin (x))) + MathSqrt (MathAbs (MathSin (y - 2.0))));
double f = a + b
+ 1.01 * exp (-(pow (x + 42, 2) + pow (y + 43.5, 2)) / 0.9)
+ 1.0 * exp (-(pow (x + 40.2, 2) + pow (y + 46, 2)) / 0.3);
double res = MathPow (f, 4)
- 0.3 * exp (-(pow (x + 42.3, 2) + pow (y + 46.0, 2)) / 0.02);
//return res;
return Scale (res, 0.0000000000000000, 3.0269632693877031, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_Megacity : public C_Function
{
public: //===================================================================
C_Megacity ()
{
fuName = "Megacity";
//границы функции
xMinRange = -10.0; xMaxRange = -2;
yMinRange = -10.5; yMaxRange = 10;
//координаты максимума
globalMaxFunValue = 1.0; //12.0
xGlobalMax = -9.428;//-9.60528;
yGlobalMax = 2.0009;
//координаты минимума
globalMinFunValue = 0.0; //-1
xGlobalMin = -10.0;
yGlobalMin = -7.66485;
}
double Core (double x, double y)
{
double a = MathSin (MathSqrt (MathAbs (x + 10.13) + MathAbs (y - 5.0)));
double b = MathCos (MathSqrt (MathAbs (MathSin (x))) + MathSqrt (MathAbs (MathSin (y - 2.0))));
double f = a + b;
double res = floor (MathPow (f, 4)) -
floor (2 * exp (-(pow (x + 9.5, 2) + pow (y + 7.5, 2)) / 0.4));
if (res < -1.0) res = -1.0;
return Scale (res, -1.0, 14.0, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_Ackley : public C_Function
{
public: //===================================================================
C_Ackley ()
{
fuName = "Ackley";
//границы функции
xMinRange = -5; xMaxRange = 5;
yMinRange = -5; yMaxRange = 5;
//координаты максимума
globalMaxFunValue = 1.0; //0.0;
xGlobalMax = 0.0;
yGlobalMax = 0.0;
//координаты минимума
globalMinFunValue = 0.0; //-14.302667500265278;
xGlobalMin = -4.597534757757757;
yGlobalMin = 4.597534757757757;
}
double Core (double x, double y)
{
double res1 = -20.0 * MathExp (-0.2 * MathSqrt (0.5 * (x * x + y * y)));
double res2 = -MathExp (0.5 * (MathCos (2.0 * M_PI * x) + MathCos (2.0 * M_PI * y)));
double res3 = -(res1 + res2 + M_E + 20.0);
return Scale (res3, -14.302667500265278, 0.0, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_GoldsteinPrice : public C_Function
{
public: //===================================================================
C_GoldsteinPrice ()
{
fuName = "GoldsteinPrice";
//границы функции
xMinRange = -2; xMaxRange = 2;
yMinRange = -2; yMaxRange = 2;
//координаты максимума
globalMaxFunValue = 1.0; //-3;
xGlobalMax = 0;
yGlobalMax = -1;
//координаты минимума
globalMinFunValue = 0.0; //-1015690.2717980597;
xGlobalMin = -1.7373725379666005;
yGlobalMin = 2;
}
double Core (double x, double y)
{
double part1 = 1 + MathPow ((x + y + 1), 2) * (19 - 14 * x + 3 * x * x - 14 * y + 6 * x * y + 3 * y * y);
double part2 = 30 + MathPow ((2 * x - 3 * y), 2) * (18 - 32 * x + 12 * x * x + 48 * y - 36 * x * y + 27 * y * y);
return Scale (-part1 * part2, -1015690.2717980597, -3.0, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
// Минимум функции Шаффера N2 достигается при (x = 0) и (y = 0),
// значение функции в этой точке равно 0.
class C_Shaffer : public C_Function
{
public: //===================================================================
C_Shaffer ()
{
fuName = "Shaffer";
//границы функции
xMinRange = -100;
xMaxRange = 100;
yMinRange = -100;
yMaxRange = 100;
//координаты максимума
globalMaxFunValue = 1.0; //0.0;
xGlobalMax = 0.0;
yGlobalMax = 0.0;
//координаты минимума
globalMinFunValue = 0.0; //-0.9984331449753265
xGlobalMin = 1.253115070280703;
yGlobalMin = 0.0;
}
double Core (double x, double y)
{
double numerator = MathPow (MathSin (x * x - y * y), 2) - 0.5;
double denominator = MathPow (1 + 0.001 * (x * x + y * y), 2);
return Scale (-(0.5 + numerator / denominator), -0.9984331449753265, 0, 0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_Universe : public C_Function
{
public: //===================================================================
C_Universe ()
{
fuName = "Universe";
//границы функции
xMinRange = -100; xMaxRange = 100;
yMinRange = -100; yMaxRange = 100;
//координаты максимума
globalMaxFunValue = 0.0;
xGlobalMax = 0.0;
yGlobalMax = 0.0;
//координаты минимума
globalMinFunValue = 0.0;
xGlobalMin = 0.0;
yGlobalMin = 0.0;
}
double Core (double x, double y)
{
return (0.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
// Функция Гривана (Griewank)
//
// Источник: Griewank A.O. "Generalized descent for global optimization"
// Journal of Optimization Theory and Applications, 34(1), 1980, pp. 11-39.
// Тестовая карточка: https://www.sfu.ca/~ssurjano/griewank.html
//
// Формула:
// f(x, y) = (x² + y²) / 4000 cos(x) · cos(y/√2) + 1
//
// Глобальный минимум: f(0, 0) = 0 → в фреймворке максимизации: Scale = 1.0
// Максимум raw ≈ 2.141 вблизи (15.716, 17.798) → Scale = 0.0
//
// Область поиска: x, y ∈ [20, 20]
// Диапазон выбран так, чтобы косинусная рябь была визуально различима:
// при [-600,600] период cos (~2π≈6.28) составляет <1% ширины экрана и
// сливается в однородную текстуру, неотличимую от параболоида.
// При [-20,20] на картинку попадает ~6 периодов по X и ~4.5 по Y,
// и характерные кольца чётко видны на 2D-визуализации.
//——————————————————————————————————————————————————————————————————————————————
class C_Griewank : public C_Function
{
public: //===================================================================
C_Griewank ()
{
fuName = "Griewank";
//границы функции
xMinRange = -20.0; xMaxRange = 20.0;
yMinRange = -20.0; yMaxRange = 20.0;
//координаты максимума (фреймворк: минимум исходной функции)
globalMaxFunValue = 1.0;
xGlobalMax = 0.0;
yGlobalMax = 0.0;
//координаты минимума (фреймворк: максимум исходной функции)
globalMinFunValue = 0.0;
xGlobalMin = -15.715716;
yGlobalMin = -17.797798;
}
double Core (double x, double y)
{
double f = (x * x + y * y) / 4000.0
- MathCos (x) * MathCos (y / MathSqrt (2.0))
+ 1.0;
return Scale (-f, -2.140734, 0.0, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
// Функция Розенброка («банановая долина», Rosenbrock)
//
// Источник: Rosenbrock H.H. "An automatic method for finding the greatest
// or least value of a function", The Computer Journal, 3(3), 1960, pp. 175-184.
// Тестовая карточка: https://www.sfu.ca/~ssurjano/rosen.html
//
// Формула:
// f(x, y) = 100·(y x²)² + (1 x)²
//
// Глобальный минимум: f(1, 1) = 0 → в фреймворке максимизации: Scale = 1.0
// Максимум raw ≈ 3905.926 в углу (2.048, 2.048) → Scale = 0.0
// Область поиска: x, y ∈ [2.048, 2.048]
//
// Классический тест на преодоление узкой параболической долины.
//——————————————————————————————————————————————————————————————————————————————
class C_Rosenbrock : public C_Function
{
public: //===================================================================
C_Rosenbrock ()
{
fuName = "Rosenbrock";
//границы функции
xMinRange = -2.048; xMaxRange = 2.048;
yMinRange = -2.048; yMaxRange = 2.048;
//координаты максимума (фреймворк: минимум исходной функции)
globalMaxFunValue = 1.0;
xGlobalMax = 1.0;
yGlobalMax = 1.0;
//координаты минимума (фреймворк: максимум исходной функции)
globalMinFunValue = 0.0;
xGlobalMin = -2.048;
yGlobalMin = -2.048;
}
double Core (double x, double y)
{
double f = 100.0 * MathPow (y - x * x, 2) + MathPow (1.0 - x, 2);
return Scale (-f, -3905.926227, 0.0, 0.0, 1.0);
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
// GenerateFunctionDataFixedSize
bool GenerateFunctionDataFixedSize (int x_size, int y_size, double &data [], double x_min, double x_max, double y_min, double y_max, C_Function &function)
{
if (x_size < 2 || y_size < 2)
{
PrintFormat ("Error in data sizes: x_size=%d,y_size=%d", x_size, y_size);
return (false);
}
double dx = (x_max - x_min) / (x_size - 1);
double dy = (y_max - y_min) / (y_size - 1);
ArrayResize (data, x_size * y_size);
//---
for (int j = 0; j < y_size; j++)
{
for (int i = 0; i < x_size; i++)
{
double x = x_min + i * dx;
double y = y_min + j * dy;
data [j * x_size + i] = function.Core (x, y);
}
}
return (true);
}
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
// GenerateDataFixedSize
bool GenerateDataFixedSize (int x_size, int y_size, C_Function &function, double &data [])
{
if (x_size < 2 || y_size < 2)
{
PrintFormat ("Error in data sizes: x_size=%d,y_size=%d", x_size, y_size);
return (false);
}
return GenerateFunctionDataFixedSize (x_size, y_size, data,
function.GetMinRangeX (),
function.GetMaxRangeX (),
function.GetMinRangeY (),
function.GetMaxRangeY (),
function);
}
//——————————————————————————————————————————————————————————————————————————————
/*
//——————————————————————————————————————————————————————————————————————————————
class C_Multiverse
{
public: //===================================================================
C_Multiverse ()
{
}
C_Hilly H;
C_Forest F;
C_Megacity M;
string GetFuncName ()
{
return ("Multiverse:" + H.GetFuncName () + ":" + F.GetFuncName () + ":" + M.GetFuncName ());
}
double hArg [2];
double fArg [2];
double mArg [2];
void GetFuncRanges (double &rangeMin [],
double &rangeMax [],
int amount) //amount of runs functions, the number is a multiple of 6
{
ArrayResize (rangeMin, amount * 6);
ArrayResize (rangeMax, amount * 6);
for (int i = 0; i < amount; i++)
{
rangeMin [i * 6] = H.GetMinRangeX ();
rangeMin [i * 6 + 1] = F.GetMinRangeY ();
rangeMin [i * 6 + 2] = M.GetMinRangeX ();
rangeMin [i * 6 + 3] = H.GetMinRangeY ();
rangeMin [i * 6 + 4] = F.GetMinRangeX ();
rangeMin [i * 6 + 5] = M.GetMinRangeY ();
rangeMax [i * 6] = H.GetMaxRangeX ();
rangeMax [i * 6 + 1] = F.GetMaxRangeY ();
rangeMax [i * 6 + 2] = M.GetMaxRangeX ();
rangeMax [i * 6 + 3] = H.GetMaxRangeY ();
rangeMax [i * 6 + 4] = F.GetMaxRangeX ();
rangeMax [i * 6 + 5] = M.GetMaxRangeY ();
}
}
double CalcFunc (double &args [], //function arguments
int amount) //amount of runs functions
{
double result = 0.0;
for (int i = 0; i < amount; i++)
{
hArg [0] = args [i * 6];
hArg [1] = args [i * 6 + 3];
fArg [0] = args [i * 6 + 1];
fArg [1] = args [i * 6 + 4];
mArg [0] = args [i * 6 + 2];
mArg [1] = args [i * 6 + 5];
result+= H.CalcFunc (hArg, 1);
result+= F.CalcFunc (fArg, 1);
result+= M.CalcFunc (mArg, 1);
}
return result / (3.0 * amount);
}
};
//——————————————————————————————————————————————————————————————————————————————
*/