Files
JQSakaJoo 8b1aa2561e Add BBBC
2025-01-09 00:39:09 +05:00

128 lines
7.7 KiB
Plaintext

//+————————————————————————————————————————————————————————————————————————————+
//| C_AO_RW |
//| Copyright 2007-2024, Andrey Dik |
//| https://www.mql5.com/ru/users/joo |
//—————————————————————————————————————————————————————————————————————————————+
//Article: https://www.mql5.com/ru/articles/
#include "#C_AO.mqh"
//——————————————————————————————————————————————————————————————————————————————
class C_FastRandomFloat
{
private:
uint state;
// Быстрый целочисленный генератор
uint xorshift ()
{
state ^= state << 13;
state ^= state >> 17;
state ^= state << 5;
return state;
}
public:
void Init (uint seed)
{
state = seed;
}
// Получить случайное число в диапазоне [min, max]
double nextFloat (const double min, const double max)
{
// Используем младшие 23 бита для мантиссы (достаточно для float)
return min + (xorshift () & 0x7FFFFF) * (max - min) / 0x7FFFFF;
}
// Перегруженная версия для работы по умолчанию в диапазоне [0,1]
double nextFloat ()
{
return (xorshift () & 0x7FFFFF) / (double)0x7FFFFF;
}
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
class C_AO_RW : public C_AO
{
public: //--------------------------------------------------------------------
~C_AO_RW () { }
C_AO_RW ()
{
ao_name = "RW";
ao_desc = "Random Walk";
ao_link = "https://www.mql5.com/ru/articles/";
popSize = 50; //population size
ArrayResize (params, 1);
params [0].name = "popSize"; params [0].val = popSize;
}
void SetParams ()
{
popSize = (int)params [0].val;
}
bool Init (const double &rangeMinP [], //minimum search range
const double &rangeMaxP [], //maximum search range
const double &rangeStepP [], //step search
const int epochsP = 0); //number of epochs
void Moving ();
void Revision ();
private: //-------------------------------------------------------------------
C_FastRandomFloat rnd;
};
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
bool C_AO_RW::Init (const double &rangeMinP [], //minimum search range
const double &rangeMaxP [], //maximum search range
const double &rangeStepP [], //step search
const int epochsP = 0) //number of epochs
{
if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
//----------------------------------------------------------------------------
rnd.Init (GetTickCount ());
return true;
}
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
void C_AO_RW::Moving ()
{
for (int w = 0; w < popSize; w++)
{
for (int c = 0; c < coords; c++)
{
a [w].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]);
a [w].c [c] = u.SeInDiSp (a [w].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
}
}
}
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
void C_AO_RW::Revision ()
{
int ind = -1;
for (int i = 0; i < popSize; i++)
{
if (a [i].f > fB)
{
fB = a [i].f;
ind = i;
}
}
if (ind != -1) ArrayCopy (cB, a [ind].c, 0, 0, WHOLE_ARRAY);
}
//——————————————————————————————————————————————————————————————————————————————