diff --git a/MQL5/Include/Math/AOs/PopulationAO/#C_AO_enum.mqh b/MQL5/Include/Math/AOs/PopulationAO/#C_AO_enum.mqh index c9002ba..27b7383 100644 Binary files a/MQL5/Include/Math/AOs/PopulationAO/#C_AO_enum.mqh and b/MQL5/Include/Math/AOs/PopulationAO/#C_AO_enum.mqh differ diff --git a/MQL5/Include/Math/AOs/PopulationAO/AO_BOA_BullOptimizationAlgorithm.mqh b/MQL5/Include/Math/AOs/PopulationAO/AO_BOA_BullOptimizationAlgorithm.mqh new file mode 100644 index 0000000..1542497 Binary files /dev/null and b/MQL5/Include/Math/AOs/PopulationAO/AO_BOA_BullOptimizationAlgorithm.mqh differ diff --git a/MQL5/Include/Math/AOs/PopulationAO/links.html b/MQL5/Include/Math/AOs/PopulationAO/links.html index 7b4731e..4af136f 100644 --- a/MQL5/Include/Math/AOs/PopulationAO/links.html +++ b/MQL5/Include/Math/AOs/PopulationAO/links.html @@ -98,6 +98,7 @@ DA(Duelist)duelist algorithm ECOieco-inspired evolutionary algorithm BFO-GAbacterial foraging optimization - genetic algorithm + BOA(Bull)bull optimization algorithm SOAsimple optimization algorithm ABHAartificial bee hive algorithm DOdandelion optimizer diff --git a/MQL5/Include/Math/AOs/TestStand3D.mqh b/MQL5/Include/Math/AOs/TestStand3D.mqh index 1933f41..76fb1ad 100644 Binary files a/MQL5/Include/Math/AOs/TestStand3D.mqh and b/MQL5/Include/Math/AOs/TestStand3D.mqh differ diff --git a/MQL5/Scripts/Testing AOs/Test_AO_All.mq5 b/MQL5/Scripts/Testing AOs/Test_AO_All.mq5 new file mode 100644 index 0000000..3c778d2 --- /dev/null +++ b/MQL5/Scripts/Testing AOs/Test_AO_All.mq5 @@ -0,0 +1,262 @@ +//+----------------------------------------------------------------------------+ +//| Copyright 2007-2026, Andrey Dik | +//| https://www.mql5.com/ru/users/joo | +//+----------------------------------------------------------------------------+ +#property copyright "Copyright 2007-2026, JQS aka Joo." +#property link "https://www.mql5.com/ru/users/joo" +#property version "1.00" +#property script_show_inputs + +#include +#include +#include +#include +#include + + + +//+------------------------------------------------------------------+ +input string AOparam = "----------------"; //AO parameters----------- +input E_AO AOexactly_P = NONE_AO; + +input string TestStand_1 = "----------------"; //Test stand-------------- +input double ArgumentStep_P = 0.0; //Argument Step + +input string TestStand_2 = "----------------"; //------------------------ +input int Test1FuncRuns_P = 5; //Test #1: Number of functions in the test +input int Test2FuncRuns_P = 25; //Test #2: Number of functions in the test +input int Test3FuncRuns_P = 500; //Test #3: Number of functions in the test + +input string TestStand_3 = "----------------"; //------------------------ +input EFunc Function1 = Hilly; +input EFunc Function2 = Forest; +input EFunc Function3 = Megacity; + +input string TestStand_4 = "----------------"; //------------------------ +input int NumbTestFuncRuns_P = 10000; //Number of test function runs +input int NumberRepetTest_P = 10; //Test repets number + +input string TestStand_5 = "----------------"; //------------------------ +input int DelayInMS_P = 0; +input bool Video_P = true; //Show video +input bool Use3D_P = true; //Показывать 3D-визуализацию +input int Grid3D_P = 80; //Разрешение 3D-сетки (10..200) +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnStart() + { + C_AO *AO = SelectAO(AOexactly_P); + + if(AO == NULL) + { + Print("AO is not selected..."); + return; + } + + Print(AO.GetName(), "|", AO.GetDesc(), "|", AO.GetParams()); + +//--- 2D стенд + C_TestStand ST; + ST.Init(750, 375); + +//--- 3D стенд + C_TestStand3D *ST3 = NULL; + if(Use3D_P) + { + ST3 = new C_TestStand3D(); + if(!ST3.Init("__3DView__", 5, 30, ST.H, ST.H)) + { + Print("C_TestStand3D: Init failed — 3D-режим отключён"); + delete ST3; + ST3 = NULL; + } + } + + double allScore = 0.0; + double allTests = 0.0; + + C_Function *F1 = SelectFunction(Function1); + C_Function *F2 = SelectFunction(Function2); + C_Function *F3 = SelectFunction(Function3); + + if(F1 != NULL) + { + Print("============================="); + ST.CanvasErase(); + if(ST3 != NULL) + {ST3.BuildSurface(*F1, Grid3D_P); ST3.Show(true); } + + FuncTests(AO, ST, ST3, *F1, Test1FuncRuns_P, clrLime, allScore, allTests); + FuncTests(AO, ST, ST3, *F1, Test2FuncRuns_P, clrAqua, allScore, allTests); + FuncTests(AO, ST, ST3, *F1, Test3FuncRuns_P, clrOrangeRed, allScore, allTests); + delete F1; + } + + if(F2 != NULL) + { + Print("============================="); + ST.CanvasErase(); + if(ST3 != NULL) + {ST3.BuildSurface(*F2, Grid3D_P); ST3.Show(true); } + + FuncTests(AO, ST, ST3, *F2, Test1FuncRuns_P, clrLime, allScore, allTests); + FuncTests(AO, ST, ST3, *F2, Test2FuncRuns_P, clrAqua, allScore, allTests); + FuncTests(AO, ST, ST3, *F2, Test3FuncRuns_P, clrOrangeRed, allScore, allTests); + delete F2; + } + + if(F3 != NULL) + { + Print("============================="); + ST.CanvasErase(); + if(ST3 != NULL) + {ST3.BuildSurface(*F3, Grid3D_P); ST3.Show(true); } + + FuncTests(AO, ST, ST3, *F3, Test1FuncRuns_P, clrLime, allScore, allTests); + FuncTests(AO, ST, ST3, *F3, Test2FuncRuns_P, clrAqua, allScore, allTests); + FuncTests(AO, ST, ST3, *F3, Test3FuncRuns_P, clrOrangeRed, allScore, allTests); + delete F3; + } + + Print("============================="); + if(allTests > 0.0) + Print("All score: ", DoubleToString(allScore, 5), " (", DoubleToString(allScore * 100.0 / allTests, 2), "%)"); + + if(ST3 != NULL) + {ST3.Show(false); delete ST3; } + ST.Canvas.Destroy(); + delete AO; + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void FuncTests(C_AO &ao, + C_TestStand &st, + C_TestStand3D *st3, + C_Function &f, + const int funcCount, + const color clrConv, + double &allScore, + double &allTests) + { + if(funcCount <= 0) + return; + + allTests++; + + if(Video_P) + { + st.DrawFunctionGraph(f); + st.SendGraphToCanvas(); + st.MaxMinDr(f); + st.Update(); + } + + int xConv = 0.0; + int yConv = 0.0; + double aveResult = 0.0; + int params = funcCount * 2; + int epochCount = NumbTestFuncRuns_P / (int)ao.params [0].val; + +//---------------------------------------------------------------------------- + double rangeMin [], rangeMax [], rangeStep []; + ArrayResize(rangeMin, params); + ArrayResize(rangeMax, params); + ArrayResize(rangeStep, params); + + for(int i = 0; i < funcCount; i++) + { + rangeMax [i * 2] = f.GetMaxRangeX(); + rangeMin [i * 2] = f.GetMinRangeX(); + rangeStep [i * 2] = ArgumentStep_P; + + rangeMax [i * 2 + 1] = f.GetMaxRangeY(); + rangeMin [i * 2 + 1] = f.GetMinRangeY(); + rangeStep [i * 2 + 1] = ArgumentStep_P; + } + + double ag3D []; + + for(int test = 0; test < NumberRepetTest_P; test++) + { + //-------------------------------------------------------------------------- + if(!ao.Init(rangeMin, rangeMax, rangeStep, epochCount)) + break; + + int agCnt = ArraySize(ao.a); + if(st3 != NULL) + {ArrayResize(ag3D, agCnt * funcCount * 2); st3.ResetTrail(); } + + // Optimization------------------------------------------------------------- + for(int epochCNT = 1; epochCNT <= epochCount && !IsStopped(); epochCNT++) + { + if(DelayInMS_P > 0) + Sleep(DelayInMS_P); + Comment(epochCNT); + + ao.Moving(); + + for(int set = 0; set < ArraySize(ao.a); set++) + { + ao.a [set].f = f.CalcFunc(ao.a [set].c); + } + + ao.Revision(); + + //--- 2D визуализация ------------------------------------------- + if(Video_P) + { + //drawing a population-------------------------------------------------- + st.SendGraphToCanvas(); + + for(int i = 0; i < agCnt; i++) + { + st.PointDr(ao.a [i].c, f, 1, 1, funcCount, false); + } + st.PointDr(ao.cB, f, 1, 1, funcCount, true); + + st.MaxMinDr(f); + + //drawing a convergence graph------------------------------------------- + xConv = (int)st.Scale(epochCNT, 1, epochCount, st.H + 2, st.W - 3, false); + yConv = (int)st.Scale(ao.fB, f.GetMinFunValue(), f.GetMaxFunValue(), 2, st.H - 2, true); + st.Canvas.FillCircle(xConv, yConv, 1, COLOR2RGB(clrConv)); + + st.Update(); + } + + //--- 3D визуализация ------------------------------------------- + if(st3 != NULL) + { + for(int i = 0; i < agCnt; i++) + for(int j = 0; j < funcCount; j++) + { + ag3D [(i * funcCount + j) * 2] = ao.a [i].c [j * 2]; + ag3D [(i * funcCount + j) * 2 + 1] = ao.a [i].c [j * 2 + 1]; + } + + st3.OnTimer(0.033); + st3.SetAgents(ag3D, agCnt, funcCount, f, ao.cB); + st3.Redraw(); + } + } + + aveResult += ao.fB; + } + + aveResult /= (double)NumberRepetTest_P; + + double score = aveResult; + + Print(funcCount, " ", f.GetFuncName(), "'s; Func runs: ", NumbTestFuncRuns_P, "; result: ", aveResult); + allScore += score; + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+ diff --git a/MQL5/Scripts/Testing AOs/Test_AO_AntiCheat.mq5 b/MQL5/Scripts/Testing AOs/Test_AO_AntiCheat.mq5 new file mode 100644 index 0000000..6906a7f --- /dev/null +++ b/MQL5/Scripts/Testing AOs/Test_AO_AntiCheat.mq5 @@ -0,0 +1,121 @@ +//+------------------------------------------------------------------+ +//| Copyright 2007-2026, Andrey Dik | +//| https://www.mql5.com/ru/users/joo | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2007-2026, JQS aka Joo." +#property link "https://www.mql5.com/ru/users/joo" +#property version "1.00" +#property script_show_inputs + +#include +#include +#include + +//———————————————————————————————————————————————————————————————————— +input string AOparam = "----------------"; //AO parameters----------- +input E_AO AOexactly_P = NONE_AO; + +input string TestStand_P = "----------------"; //Test stand--------------- +input int NumbTestFuncRuns_P = 1e4; // Количество вычислений функции +input int NumberRepetTest_P = 10; // Количество повторных прогонов +//———————————————————————————————————————————————————————————————————— + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnStart() + { + C_AO *AO = SelectAO(AOexactly_P); + + if(AO == NULL) + { + Print("AO is not selected..."); + return; + } + + Print(AO.GetName(), "|", AO.GetDesc(), "|", AO.GetParams()); + +//--- создаём 5 функций +#define NFUNCS 5 + C_Function *funcs [NFUNCS]; + funcs [0] = new C_Hilly(); + funcs [1] = new C_Forest(); + funcs [2] = new C_Megacity(); + funcs [3] = new C_Peaks(); + funcs [4] = new C_Skin(); + +//--- 10 координат: пара 0-1 = Hilly, 2-3 = Forest, 4-5 = Megacity, +// 6-7 = Peaks, 8-9 = Skin + int params = NFUNCS * 2; + + double rangeMin []; + double rangeMax []; + double rangeStep []; + ArrayResize(rangeMin, params); + ArrayResize(rangeMax, params); + ArrayResize(rangeStep, params); + + for(int i = 0; i < NFUNCS; i++) + { + rangeMin [i * 2] = funcs [i].GetMinRangeX(); + rangeMax [i * 2] = funcs [i].GetMaxRangeX(); + rangeStep [i * 2] = 0.0; + + rangeMin [i * 2 + 1] = funcs [i].GetMinRangeY(); + rangeMax [i * 2 + 1] = funcs [i].GetMaxRangeY(); + rangeStep [i * 2 + 1] = 0.0; + } + +//--- запуск тестов + int epochCount = NumbTestFuncRuns_P / (int)AO.params [0].val; + double aveResult = 0.0; + + Print("============================="); + Print("Composite test: Hilly + Forest + Megacity + Peaks + Skin"); + Print("Coordinates: ", params, "; Epochs: ", epochCount, + "; Repeats: ", NumberRepetTest_P); + Print("============================="); + + for(int test = 0; test < NumberRepetTest_P; test++) + { + if(!AO.Init(rangeMin, rangeMax, rangeStep, epochCount)) + break; + + for(int epochCNT = 1; epochCNT <= epochCount && !IsStopped(); epochCNT++) + { + AO.Moving(); + + //--- расчёт fitness для каждого агента + for(int set = 0; set < ArraySize(AO.a); set++) + { + double sum = 0.0; + for(int i = 0; i < NFUNCS; i++) + { + sum += funcs [i].Core(AO.a [set].c [i * 2], + AO.a [set].c [i * 2 + 1]); + } + AO.a [set].f = sum / NFUNCS; + } + + AO.Revision(); + } + + Print("Run ", test + 1, "/", NumberRepetTest_P, ": ", AO.fB); + aveResult += AO.fB; + } + + aveResult /= (double)NumberRepetTest_P; + + Print("============================="); + Print("Average result: ", DoubleToString(aveResult, 10), + " (", DoubleToString(aveResult * 100.0, 2), "%)"); + Print("============================="); + +//--- освобождение + for(int i = 0; i < NFUNCS; i++) + delete funcs [i]; + delete AO; + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+ diff --git a/MQL5/Scripts/Testing AOs/Testing AOs.mq5 b/MQL5/Scripts/Testing AOs/Testing AOs.mq5 deleted file mode 100644 index a773518..0000000 Binary files a/MQL5/Scripts/Testing AOs/Testing AOs.mq5 and /dev/null differ diff --git a/README.md b/README.md index ff1a4cc..9eab0f9 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ CMAES (covariance matrix adaptation evolution strategy) DA_Duelist (duelist algorithm) ECOi (eco-inspired evolutionary algorithm) SOA (simple optimization algorithm) +BOA(Bull) (bull optimization algorithm) ABHA (artificial bee hive algorithm) DO (dandelion optimizer) CLA_L (competitive learning algorithm)