Files
Population-optimization-alg…/MQL5/Scripts/Testing AOs/Simple use of population optimization algorithms.mq5
2024-11-13 17:27:02 +05:00

84 lines
8.5 KiB
Plaintext

#property script_show_inputs // Указывает, что скрипт будет показывать входные параметры в окне свойств
#include <Math\AOs\PopulationAO\#C_AO_enum.mqh> // Подключение библиотеки для работы с алгоритмами оптимизации
input E_AO AOexactly = NONE_AO; // Параметр для выбора алгоритма оптимизации, по умолчанию - NONE_AO
//——————————————————————————————————————————————————————————————————————————————
void OnStart()
{
//----------------------------------------------------------------------------
int numbTestFuncRuns = 10000; // Общее количество запусков тестовой функции
int params = 1000; // Количество параметров для оптимизации
int popSize = 50; // Размер популяции для алгоритма оптимизации
int epochCount = numbTestFuncRuns / popSize; // Общее количество эпох (итераций) для оптимизации
double rangeMin [], rangeMax [], rangeStep []; // Массивы для хранения границ и шагов параметров
ArrayResize (rangeMin, params); // Изменение размера массива min границ
ArrayResize (rangeMax, params); // Изменение размера массива max границ
ArrayResize (rangeStep, params); // Изменение размера массива шагов
// Инициализация границ и шагов для каждого параметра
for (int i = 0; i < params; i++)
{
rangeMin [i] = -10; // Минимальное значение параметра
rangeMax [i] = 10; // Максимальное значение параметра
rangeStep [i] = DBL_EPSILON; // Шаг для параметра
}
//----------------------------------------------------------------------------
C_AO *ao = SelectAO (AOexactly); // Выбор алгоритма оптимизации
if (ao == NULL) // Проверка, был ли выбран алгоритм
{
Print ("AO не выбран..."); // Сообщение об ошибке, если алгоритм не выбран
return;
}
ao.params [0].val = popSize; // Назначение размера популяции....
ao.SetParams (); //... (необязательно, тогда будет использован размер популяции по умолчанию)
ao.Init (rangeMin, rangeMax, rangeStep, epochCount); // Инициализация алгоритма с заданными границами и количеством эпох
// Основной цикл по количеству эпох
for (int epochCNT = 1; epochCNT <= epochCount; epochCNT++)
{
ao.Moving (); // Выполнение одной эпохи алгоритма оптимизации
// Вычисление значения целевой функции для каждого решения в популяции
for (int set = 0; set < ArraySize (ao.a); set++)
{
ao.a [set].f = ObjectiveFunction (ao.a [set].c); // Применение целевой функции к каждому решению
}
ao.Revision (); // Обновление популяции на основе результатов целевой функции
}
//----------------------------------------------------------------------------
// Вывод имени алгоритма, лучшего результата и количества запусков функции
Print (ao.GetName (), ", best result: ", ao.fB, ", number of function launches: ", numbTestFuncRuns);
delete ao; // Освобождение памяти, занятой объектом алгоритма
}
//——————————————————————————————————————————————————————————————————————————————
//——————————————————————————————————————————————————————————————————————————————
// Определение целевой функции пользователя, в данном случае как пример - параболоид, F(Xn) ∈ [0.0; 1.0], X ∈ [-10.0; 10.0], максимизация
double ObjectiveFunction (double &x [])
{
double sum = 0.0; // Переменная для накопления результата
// Цикл по всем параметрам
for (int i = 0; i < ArraySize (x); i++)
{
// Проверка, находится ли параметр в допустимом диапазоне
if (x [i] < -10.0 || x [i] > 10.0) return 0.0; // Если параметр вне диапазона, возвращаем 0
sum += (-x [i] * x [i] + 100.0) * 0.01; // Вычисление значения целевой функции
}
return sum /= ArraySize (x);
}
//——————————————————————————————————————————————————————————————————————————————