From 05e4ca47cff8669704fb909a4613c20f5c83c05a Mon Sep 17 00:00:00 2001 From: JQSakaJoo Date: Sun, 21 Jun 2026 17:59:17 +0400 Subject: [PATCH] Add BChimp --- .../Math/AOs/PopulationAO/#C_AO_enum.mqh | Bin 39874 -> 40280 bytes .../AO_BChimp_ChimpOptimizationAlgorithm.mqh | 308 ++++++++++++++++++ MQL5/Include/Math/AOs/PopulationAO/links.html | 1 + README.md | 1 + 4 files changed, 310 insertions(+) create mode 100644 MQL5/Include/Math/AOs/PopulationAO/AO_BChimp_ChimpOptimizationAlgorithm.mqh diff --git a/MQL5/Include/Math/AOs/PopulationAO/#C_AO_enum.mqh b/MQL5/Include/Math/AOs/PopulationAO/#C_AO_enum.mqh index 36e4b0931673bc82721eb970c78d8f466474c8eb..bccdb560e436c33e47029d7636011cf32cff4304 100644 GIT binary patch delta 201 zcmX@Ko$1CdrVW==C-KRMIx}Q2WHRJ36fndyz}b@nHElOvQw=eg{2+wG94^eD!=M0% z`V9IEP6#bfaSepXvh delta 59 zcmcbyi|NpIrVW==CmRT`Y<5r!F_?V7iDk0J6u!xBKpYURHhEp7)a1VKg2@dgESn-G PSWix= 0.0 && x < P) + x = x / P; + else + if(x >= P && x < 0.5) + x = (x - P) / (0.5 - P); + else + if(x >= 0.5 && x < 1.0 - P) + x = (1.0 - P - x) / (0.5 - P); + else + x = (1.0 - x) / P; + } + +//--- счётчики итераций + epochs = epochsP; + epochsDen = (epochs > 1) ? epochs - 1 : 1; + epochNow = 0; + + return true; + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| Moving | +//| | +//| 1. первый прогон: cP -> c (внешний цикл оценит FF); | +//| 2. далее: a и четыре группы коэффициентов на итерацию; | +//| 3. для каждого агента/координаты — четыре кандидата от вожаков, | +//| усреднение, проекция в границы (SeInDiSp). | +//+------------------------------------------------------------------+ +void C_AO_BChimp::Moving() + { +//--- первый прогон: cP -> c + if(!revision) + { + for(int i = 0; i < popSize; i++) + for(int c = 0; c < coords; c++) + a [i].c [c] = u.SeInDiSp(a [i].cP [c], rangeMin [c], rangeMax [c], rangeStep [c]); + return; + } + +//--- отношение t/T (зажато в 1.0); a: спад 2 -> 0 + epochNow++; + double tRatio = (double)epochNow / (double)epochsDen; + if(tRatio > 1.0) + tRatio = 1.0; + + double aCoef = 2.0 - 2.0 * tRatio; + +//--- групповые динамические коэффициенты +// u1 = (t/T)^(1/3) — корневой закон, u3 = (t/T)^3 — кубический + double u1 = MathPow(tRatio, 1.0 / 3.0); + double u3 = tRatio * tRatio * tRatio; + + double C1G [4], C2G [4]; + C1G [0] = 1.95 - 2.0 * u1; + C2G [0] = 2.0 * u1 + 0.5; // группа 1 (attacker) + C1G [1] = 1.95 - 2.0 * u1; + C2G [1] = 2.0 * u3 + 0.5; // группа 2 (barrier) + C1G [2] = -2.0 * u3 + 2.5; + C2G [2] = 2.0 * u1 + 0.5; // группа 3 (chaser) + C1G [3] = -2.0 * u3 + 2.5; + C2G [3] = 2.0 * u3 + 0.5; // группа 4 (driver) + +//--- движение + for(int i = 0; i < popSize; i++) + { + double mi = chimp [i].m; + + for(int c = 0; c < coords; c++) + { + double xi = a [i].c [c]; + double sum = 0.0; + + for(int k = 0; k < 4; k++) + { + //--- A симметричен относительно 0: амплитуда aCoef*C1G[k] -> 0 + // к концу прогона (E[A]=0, нет сноса в угол). C масштабирован + // к канону [0..~2.5]. Знак C1G[k] роли не играет — множится + // на симметричное (2r-1). + double Ak = aCoef * C1G [k] * (2.0 * u.RNDprobab() - 1.0); + double Ck = C2G [k] * u.RNDprobab(); + double Dk = MathAbs(Ck * lead [k].c [c] - mi * xi); + sum += lead [k].c [c] - Ak * Dk; + } + + double v = sum / 4.0; + a [i].c [c] = u.SeInDiSp (v, rangeMin [c], rangeMax [c], rangeStep [c]); + } + } + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| Revision | +//| | +//| Обновление личных/глобального лучших + элитарная актуализация | +//| четвёрки вожаков (best-ever). Откатов нет — версия эталонная. | +//+------------------------------------------------------------------+ +void C_AO_BChimp::Revision() + { +//--- обновление личных и глобального лучших + for(int i = 0; i < popSize; i++) + { + if(a [i].f > a [i].fB) + { + a [i].fB = a [i].f; + ArrayCopy(a [i].cB, a [i].c, 0, 0, coords); + } + if(a [i].f > fB) + { + fB = a [i].f; + ArrayCopy(cB, a [i].c, 0, 0, coords); + } + } + +//--- элитарная актуализация вожаков (инициализация на первом вызове +// и поддержание top-4 на последующих) + for(int i = 0; i < popSize; i++) + InsertLeader(i); + + if(!revision) + revision = true; + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| InsertLeader — вставка агента в лесенку вожаков | +//| Вожаки отсортированы по убыванию фитнеса (lead[0] — лучший). | +//+------------------------------------------------------------------+ +void C_AO_BChimp::InsertLeader(const int i) + { + double f = a [i].f; + + int p = -1; + if(f > lead [0].f) + p = 0; + else + if(f > lead [1].f) + p = 1; + else + if(f > lead [2].f) + p = 2; + else + if(f > lead [3].f) + p = 3; + + if(p < 0) + return; + +//--- сдвиг вниз от хвоста к позиции вставки + for(int s = 3; s > p; s--) + { + lead [s].f = lead [s - 1].f; + ArrayCopy(lead [s].c, lead [s - 1].c, 0, 0, coords); + } + +//--- вставка + lead [p].f = f; + ArrayCopy(lead [p].c, a [i].c, 0, 0, coords); + } +//+------------------------------------------------------------------+ diff --git a/MQL5/Include/Math/AOs/PopulationAO/links.html b/MQL5/Include/Math/AOs/PopulationAO/links.html index ccf5ed4..891c7f2 100644 --- a/MQL5/Include/Math/AOs/PopulationAO/links.html +++ b/MQL5/Include/Math/AOs/PopulationAO/links.html @@ -148,6 +148,7 @@ BBBCbig bang - big crunch algorithm CPAcyclic parthenogenesis algorithm CA_Cricketcricket algorithm + BChimpChimp Optimization Algorithm FAmfirefly algorithm M ASSAartificial searching swarm algorithm CHAcolor harmony algorithm diff --git a/README.md b/README.md index 3ce295f..8f98f8f 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ BM (Blue Monkey Algorithm) BBBC (big bang big crunch) CPA (cyclic parthenogenesis algorithm) CA_Cricket (cricket algorithm) +BChimp (chimp optimization algorithm) ASSA (artificial searching swarm algorithm) CHA (color harmony algorithm) CVO (corona virus optimization)