#property script_show_inputs // Указывает, что скрипт будет показывать входные параметры в окне свойств #include // Подключение библиотеки для работы с алгоритмами оптимизации 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); } //——————————————————————————————————————————————————————————————————————————————