混沌优化算法(COA):续篇
内容
引言
在上一篇文章中,我们介绍了混沌优化方法,并分析了算法中包含的部分核心方法。在本文中,我们将完成剩余方法的解析,并直接进入算法在测试函数上的验证环节。
在本次实现中,混沌优化方法通过确定性混沌遍历解空间。其核心原理是使用三种不同的混沌映射(逻辑映射、正弦映射、帐篷映射)生成具备伪随机性与遍历性的序列。算法分为三个阶段执行:初始混沌搜索、基于加权梯度法的解优化、自适应缩小范围的最终局部搜索。
通过引入带惯性的速度向量与停滞检测机制,算法能够有效避免陷入局部最优。参数的动态自适应调整与多种变异策略,确保了全局空间探索与局部解开发之间的平衡。接下来我们继续解析剩余方法。
算法的实现
ApplyMutation 方法用于为智能体引入变异操作。其核心任务是对指定智能体的参数进行随机修改。
方法首先校验目标智能体索引的有效性。若索引超出范围,方法将直接终止。随后,方法获取与该智能体关联的各类数组长度信息,如参数数组长度、速度数组长度。这一操作可防止方法访问数组越界。
方法基于可用数组长度计算出允许修改的最大坐标数量,确保操作安全。随机选取一个数值,确定需要执行变异的坐标数量。该数值范围为1 到最大可用坐标数的 30%。生成一个包含所有可修改坐标索引的数组。并将其随机打乱,确保变异选择的随机性。
在循环中,从打乱后的索引数组中选取待变异坐标。对每一个选中的坐标,根据随机值确定变异类型。支持的变异类型包括:完全随机变异(在指定区间内随机生成新值)、基于全局最优解的相对变异以及基于混沌映射的变异。
完成每个坐标的数值修改后,智能体对应的速度会被重置,避免历史速度影响新值。最后,在区间范围与步长约束下,为智能体对应坐标设置新数值,确保数值始终处于适当的区间内。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_COA_chaos::ApplyMutation (int agentIdx) { // Determine the number of coordinates for mutation (from 1 to 30% of coordinates) int mutationCount = 1 + (int)(u.RNDprobab () * coords * 0.3); mutationCount = MathMin (mutationCount, coords); // Create an array of indices for mutation without repetitions int mutationIndices []; ArrayResize (mutationIndices, coords); // Fill the array with indices for (int i = 0; i < coords; i++) { mutationIndices [i] = i; } // Shuffle the indices for (int i = coords - 1; i > 0; i--) { int j = (int)(u.RNDprobab () * (i + 1)); if (j <= i) // Additional security check { int temp = mutationIndices [i]; mutationIndices [i] = mutationIndices [j]; mutationIndices [j] = temp; } } // Apply mutations to the selected coordinates for (int m = 0; m < mutationCount; m++) { int c = mutationIndices [m]; // Different types of mutations for variety double r = u.RNDprobab (); double x; if (r < 0.3) { // Complete random mutation x = rangeMin [c] + u.RNDprobab () * (rangeMax [c] - rangeMin [c]); } else if (r < 0.6) { // Mutation relative to global best double offset = (u.RNDprobab () - 0.5) * (rangeMax [c] - rangeMin [c]) * 0.2; x = cB [c] + offset; } else { // Mutation using chaotic map agent [agentIdx].gamma [c] = SelectChaosMap (agent [agentIdx].gamma [c], (epochNow + c) % 3); x = rangeMin [c] + agent [agentIdx].gamma [c] * (rangeMax [c] - rangeMin [c]); } // Reset velocity agent [agentIdx].velocity [c] = 0.0; // Apply the new value with range check a [agentIdx].c [c] = u.SeInDiSp (x, rangeMin [c], rangeMax [c], rangeStep [c]); } } //——————————————————————————————————————————————————————————————————————————————
类中的 UpdateSigma 方法负责动态自适应调整优化过程中使用的惩罚参数。它会根据智能体种群中可行解的数量,调节惩罚值的大小。
如果该方法是第一次被调用(迭代轮次为 1),则将当前惩罚值(currentSigma)设置为基础值(sigma)的一半。方法遍历整个智能体种群,并统计可行解的数量。为此,程序会调用一个辅助函数来判断该智能体代表的解是否为可行解。通过遍历所有智能体,方法可以确定有多少个体满足预设的约束条件。
随后,方法用可行解数量除以智能体总数,计算可行解在整个种群中的占比。该比例有助于评估当前策略的运行效果。基于计算出的可行解比例,方法决定是否调整惩罚值:如果可行解占比低于 30%,说明算法约束过强,因此提高惩罚值,以改变搜索动态,提升智能体行为的多样性。如果占比超过 70%,说明满足条件的智能体过多,因此降低惩罚值,避免算法过早收敛。
最后,方法会确保当前惩罚值保持在合理范围内。如果数值过小(低于基础值的 10%),则将其提升至该下限;同样,如果惩罚值超过基础值的 500%,则将其限制在该上限。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_COA_chaos::UpdateSigma () { // Dynamic adaptation of the penalty parameter // Start with a small value and increase it if necessary if (epochNow == 1) { currentSigma = sigma * 0.5; return; } // Calculate the number of feasible solutions int feasibleCount = 0; for (int i = 0; i < popSize; i++) { if (IsFeasible (i)) { feasibleCount++; } } double feasibleRatio = (double)feasibleCount / MathMax (1, popSize); // Adapt the penalty parameter depending on the proportion of feasible solutions if (feasibleRatio < 0.3) { // Too few feasible solutions - increase the penalty currentSigma *= 1.2; } else if (feasibleRatio > 0.7) { // Too many feasible solutions - reduce the penalty currentSigma *= 0.9; } // Limit the sigma value if (currentSigma < sigma * 0.1) currentSigma = sigma * 0.1; else if (currentSigma > sigma * 5.0) currentSigma = sigma * 5.0; } //——————————————————————————————————————————————————————————————————————————————
IsFeasible 方法用于判断:由索引 agentIdx 对应的智能体所表示的解,是否满足给定的约束条件,即是否为可行解。
首先,方法检查智能体索引 agentIdx 是否在被允许范围内,即大于等于 0 且小于种群规模 popSize。若索引无效,方法直接返回 false,表示该解无效。若智能体索引有效,方法开始检查当前解的约束条件。它遍历解的所有坐标,并通过 CalculateConstraintValue 函数计算每个坐标的约束违反度。
CalculateConstraintValue 函数返回的数值,反映了当前解在指定坐标上的约束违反程度。如果遍历完所有坐标后,没有任何约束被违反,即所有约束违反值均小于等于阈值 eps,则该解被判定为可行解,方法返回 true。
//—————————————————————————————————————————————————————————————————————————————— bool C_AO_COA_chaos::IsFeasible (int agentIdx) { // Check if the solution is within the feasible region for (int c = 0; c < coords; c++) { double violation = CalculateConstraintValue (agentIdx, c); if (violation > eps) { return false; } } return true; } //——————————————————————————————————————————————————————————————————————————————
UpdateBestHistory 方法用于将当前最优值存入搜索历史记录。它接收新的最优值,并首先检查该数值是否合法有效。若数值有效,则将其存入最优结果历史记录数组的当前索引位置。存储完成后,通过对历史数组长度取余的方式,循环更新下一次存储的索引位置。这确保历史记录始终保存最近 10 个数值,且不会发生数组越界。
该方法支持追踪搜索进度,并可利用最优解历史记录进行分析。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_COA_chaos::UpdateBestHistory (double newBest) { // Protection against invalid values if (!MathIsValidNumber (newBest)) return; // Update the history of the best values globalBestHistory [historyIndex] = newBest; historyIndex = (historyIndex + 1) % 10; } //——————————————————————————————————————————————————————————————————————————————
IsConverged 方法用于判断算法是否已达到收敛状态。它通过分析全局最优解的历史记录,评估解随时间的优化幅度是否显著。若优化提升变得极小,则判定算法已收敛。
方法初始化若干变量,用于统计全局最优解历史数组 globalBestHistory 中的:有效数值数量、数值总和、最小值与最大值。变量 minVal 和 maxVal 分别被初始化为双精度类型的最大 / 最小可能值,以确保后续能正确计算极值。
方法遍历 globalBestHistory 数组,对历史中的每个值执行有效性校验、数据充足性校验、同质性检查,计算平均值与相对差值,并最终判断收敛性。总体而言,IsConverged 方法通过分析最优解历史、评估优化提升的显著性,为优化算法提供了收敛判断机制。
//—————————————————————————————————————————————————————————————————————————————— bool C_AO_COA_chaos::IsConverged () { // Check if there is enough data in the history int validValues = 0; double sum = 0.0; double minVal = DBL_MAX; double maxVal = -DBL_MAX; // Find min, max, and sum of values in history for (int i = 0; i < 10; i++) { if (globalBestHistory [i] == -DBL_MAX || !MathIsValidNumber (globalBestHistory [i])) continue; minVal = MathMin (minVal, globalBestHistory [i]); maxVal = MathMax (maxVal, globalBestHistory [i]); sum += globalBestHistory [i]; validValues++; } // If there is not enough data or all values are the same if (validValues < 5 || minVal == maxVal) return false; // Calculate the average value double average = sum / validValues; // Check the case when the mean is close to zero if (MathAbs (average) < eps) return MathAbs (maxVal - minVal) < eps * 10.0; // Relative difference for convergence testing double relDiff = MathAbs (maxVal - minVal) / MathAbs (average); return relDiff < 0.001; // Convergence threshold - 0.1% } //——————————————————————————————————————————————————————————————————————————————
ResetStagnatingAgents 方法用于在优化过程中管理智能体,专门处理智能体停止优化、不再产生更好结果的情况。该方法监控智能体的停滞状态,并在必要时对陷入局部最优的智能体执行变异操作。
对每个智能体,检查其当前适应度函数值(a[i].f)相比历史最优值(a[i].fB)是否有所提升。如果当前值没有提升甚至变差,智能体的 ** 停滞计数器(stagnationCounter)** 加 1,标记该智能体进入停滞状态。如果数值得到优化,则停滞计数器重置为 0。
如果智能体连续停滞超过 5 轮迭代,方法会计算重置概率(resetProb)。该概率与停滞计数器的当前值成正比,意味着智能体停滞时间越长,被重置的概率越高。概率计算公式包含一个固定系数(0.2)与停滞计数器的相对值。如果随机生成的数值小于计算出的重置概率,就通过 ApplyMutation 函数对该智能体执行变异。执行变异后,智能体的停滞计数器清零,同时全局重置次数计数器(resetCount)加 1。
在处理完所有超出停滞阈值且满足变异条件的智能体后,方法执行完毕。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_COA_chaos::ResetStagnatingAgents () { int resetCount = 0; for (int i = 0; i < popSize; i++) { // Increase the stagnation counter if there is no improvement if (a [i].f <= a [i].fB) { agent [i].stagnationCounter++; } else { agent [i].stagnationCounter = 0; } // Reset the agent if it has been stagnating for too long if (agent [i].stagnationCounter > 5) { // Reset only some of the agents with a probability depending on stagnation double resetProb = 0.2 * (1.0 + (double)agent [i].stagnationCounter / 10.0); if (u.RNDprobab () < resetProb) { ApplyMutation (i); agent [i].stagnationCounter = 0; resetCount++; } } } } //——————————————————————————————————————————————————————————————————————————————
CalculateWeightedGradient 方法用于估算指定智能体、指定坐标的约束梯度,并考虑约束违反程度进行加权。它帮助确定解需要调整的方向与幅度,以消除约束违反,并根据违反程度对梯度进行加权。
首先,方法检查智能体索引与坐标索引是否在合法范围内。若索引无效,则返回空值,表示无调整方向。随后,方法遍历当前智能体的所有坐标,计算每个坐标的约束违反值。并找出其中的最大违反值。若指定坐标的违反值大于阈值 eps,则认为需要执行修正;否则返回 0—— 该方向无需调整。
若违反程度显著,则计算该坐标的约束梯度(衡量约束随坐标变化的方向与强度)。梯度会乘以一个权重系数,权重为当前坐标违反值 / 所有约束的最大违反值。这确保违反越严重,对调整方向的影响越大。最终返回加权约束梯度,表示解需要按比例调整的方向与大小,以消除当前坐标的约束违反。
//—————————————————————————————————————————————————————————————————————————————— double C_AO_COA_chaos::CalculateWeightedGradient (int agentIdx, int coordIdx) { // Calculate the maximum value of the constraint violation double maxViolation = eps; for (int c = 0; c < coords; c++) { double violation = CalculateConstraintValue (agentIdx, c); maxViolation = MathMax (maxViolation, violation); } // Violation for the current coordinate double violation = CalculateConstraintValue (agentIdx, coordIdx); // If there is no significant violation, return 0 if (violation <= eps) return 0.0; // Calculate the gradient double gradient = CalculateConstraintGradient (agentIdx, coordIdx); // Normalize the impact depending on the degree of violation double weight = violation / maxViolation; return gradient * weight; } //——————————————————————————————————————————————————————————————————————————————
CalculateConstraintValue 方法用于估算指定智能体、指定坐标的约束违反程度。它计算当前坐标值超出允许范围的距离,并返回代表违反大小的数值。
首先,方法检查智能体索引(agentIdx)与坐标索引(coordIdx)是否有效。方法获取智能体当前坐标值 x,以及该坐标对应的最小值(min)和最大值(max)边界。随后,检查 x 是否在合法区间内。最终,方法返回违反值(violation),即该智能体在该坐标上的总约束违反量。
核心特性:
- 约束违反时返回正值,满足约束时返回 0。
- 违反值的大小与坐标超出边界的程度成正比。
简言之,CalculateConstraintValue 提供了种群中每个智能体满足问题约束的关键信息。它测量违反程度,帮助算法判断需要调整的幅度。
//—————————————————————————————————————————————————————————————————————————————— double C_AO_COA_chaos::CalculateConstraintValue (int agentIdx, int coordIdx) { double x = a [agentIdx].c [coordIdx]; double min = rangeMin [coordIdx]; double max = rangeMax [coordIdx]; // Smoothed constraint violation function with a smooth transition at the boundary double violation = 0.0; // Check the lower bound if (x < min) { violation += min - x; } // Check the upper bound else if (x > max) { violation += x - max; } return violation; } //——————————————————————————————————————————————————————————————————————————————
CalculateConstraintGradient 方法计算指定智能体、指定坐标的约束梯度。该方法确定因约束违反,坐标值需要改变的方向与幅度。
方法首先检查输入的智能体索引(agentIdx)与坐标索引(coordIdx)是否合法。若任一索引超出有效范围,返回 0.0,表示无法计算梯度。方法获取智能体当前坐标值,以及该坐标的最小 / 最大边界。这些数值是后续评估所必需的。随后检查当前值 x 是否超出设定边界。
方法最终返回的值,反映了在约束条件下,智能体坐标需要调整的方向与必要性。
//—————————————————————————————————————————————————————————————————————————————— double C_AO_COA_chaos::CalculateConstraintGradient (int agentIdx, int coordIdx) { double x = a [agentIdx].c [coordIdx]; double min = rangeMin [coordIdx]; double max = rangeMax [coordIdx]; // Smoothed gradient for better stability if (x < min) return -1.0; // Need to increase the value else if (x > max) return 1.0; // Need to decrease the value return 0.0; } //——————————————————————————————————————————————————————————————————————————————
CalculatePenaltyFunction 方法计算带约束违反惩罚的目标函数值。它将目标函数基础值与基于违反程度的惩罚项结合。
方法首先检查智能体索引是否有效,若有效则获取该智能体的基础目标函数值(a[agentIdx].f),存入 baseValue。随后遍历智能体所有坐标,计算每个坐标的约束违反量。若违反量超过阈值 eps,则将违反量的平方加入惩罚总和 penaltySum。
使用二次惩罚,可以对轻微违反进行 “轻微” 惩罚,对严重违反进行 “严厉” 惩罚。累加所有约束违反惩罚后,计算总惩罚值。
最后,该方法通过从目标函数的基础值中减去惩罚项,计算出最终带惩罚的目标函数值。返回所得到的目标函数惩罚值。
//—————————————————————————————————————————————————————————————————————————————— double C_AO_COA_chaos::CalculatePenaltyFunction (int agentIdx) { // Base value of the objective function double baseValue = a [agentIdx].f; // Penalty term double penaltySum = 0.0; for (int c = 0; c < coords; c++) { double violation = CalculateConstraintValue (agentIdx, c); // Quadratic penalty for better resolution of solutions close to the boundary if (violation > eps) { penaltySum += violation * violation; } } // Apply a dynamic penalty ratio double penalty = currentSigma * penaltySum; // For the maximization problem: f_penalty = f - penalty return baseValue - penalty; } //——————————————————————————————————————————————————————————————————————————————
Moving 方法是优化过程中控制解移动的核心流程。它按步骤执行系统状态更新、参数自适应与搜索阶段管理。
首先,当前迭代轮次计数器加 1。第一次调用时,方法初始化种群并返回。随后,动态更新惩罚参数(sigma),调节搜索过程中惩罚函数的影响。一个关键任务是定期检查并重置停滞智能体,避免陷入局部最优。
根据迭代计数器的值确定当前搜索阶段:初期执行全局搜索,之后切换到更精细的局部搜索。根据所处阶段,调用对应的搜索策略,控制智能体移动。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_COA_chaos::Moving () { epochNow++; if (!revision) { InitialPopulation (); revision = true; return; } // Dynamically update the penalty parameter UpdateSigma (); // Reset stagnating agents if (epochNow % 5 == 0) { ResetStagnatingAgents (); } // Determine the search phase if (epochNow <= S1) { FirstCarrierWaveSearch (); } else if (epochNow <= S1 + S2) { SecondCarrierWaveSearch (); } } //——————————————————————————————————————————————————————————————————————————————
Revision 方法负责在迭代优化过程中改进解并自适应调整搜索参数。它会重新评估种群的当前状态,更新最优解,并根据近期迭代表现调整搜索参数。
方法遍历种群中的所有解,通过惩罚函数计算其新的惩罚后函数值,从而将约束违反情况纳入评估。对计算结果进行有效性校验,若合法则将其作为当前函数值保存。对于每一个新函数值优于历史值的智能体,更新其个体信息:保存新的函数值,并同步记录当前坐标。以此维护每个智能体的个体历史最优解。若某个智能体的解优于当前全局最优解,则更新全局最优解并记录对应坐标。同时更新最优解历史记录。
在首轮迭代之后(epochNow > 1),方法会评估搜索成效 —— 统计所有智能体中解得到改进的比例。基于该评估结果进行参数自适应调整,重点调整alpha 参数(各坐标的搜索范围)。根据当前处于全局搜索还是局部搜索阶段,alpha 的调整规则有所不同:全局搜索阶段,若改进比例较低,则扩大搜索范围以提升探索能力;局部搜索阶段,若改进不足,同样扩大搜索范围。若搜索成效显著,则缩小搜索范围,以便在最优解附近进行精细化搜索。根据坐标的合法取值范围,算法会将 Alpha 参数限制在上下限之间。
该机制通过利用历史迭代的表现信息,实现全局探索与局部寻优之间的动态平衡。
//—————————————————————————————————————————————————————————————————————————————— void C_AO_COA_chaos::Revision () { int improvementCount = 0; double bestImprovement = 0.0; // Evaluate all solutions for (int i = 0; i < popSize; i++) { double newValue = CalculatePenaltyFunction (i); // Check the validity of the new value if (!MathIsValidNumber (newValue)) continue; // Save the current value for the next iteration a [i].f = newValue; // Update the personal best solution (before a global one for efficiency) if (newValue > a [i].fB) { a [i].fB = newValue; ArrayCopy (a [i].cB, a [i].c, 0, 0, WHOLE_ARRAY); improvementCount++; } // Update the global best solution if (newValue > fB) { double improvement = newValue - fB; fB = newValue; ArrayCopy (cB, a [i].c, 0, 0, WHOLE_ARRAY); // Update the history of the best values UpdateBestHistory (fB); bestImprovement = MathMax (bestImprovement, improvement); improvementCount++; } } // Adapt search parameters depending on the phase and success if (epochNow > 1) { // Search success rate (prevention of zero divide) double successRate = (double)improvementCount / MathMax (1, 2 * popSize); // Adaptation of the alpha parameter for (int c = 0; c < coords; c++) { double oldAlpha = alpha [c]; if (epochNow <= S1) { // In the global search phase if (successRate < 0.1) { // Very few improvements - increasing the search scope alpha [c] *= t3; } else if (successRate < 0.3) { // Few improvements - slightly expanding the scope alpha [c] *= 1.2; } else if (successRate > 0.7) { // Many improvements - narrowing the scope alpha [c] *= 0.9; } } else { // In the local search phase if (successRate < 0.05) { // Very few improvements - increasing the search scope alpha [c] *= t3; } else if (successRate > 0.2) { // Enough improvements - narrowing the scope alpha [c] *= 0.8; } } // Limits on alpha range with safe bounds verification if (c < ArraySize (rangeMax) && c < ArraySize (rangeMin)) { double maxAlpha = 0.2 * (rangeMax [c] - rangeMin [c]); double minAlpha = 0.0001 * (rangeMax [c] - rangeMin [c]); if (alpha [c] > maxAlpha) { alpha [c] = maxAlpha; } else if (alpha [c] < minAlpha) { alpha [c] = minAlpha; } } } } } //——————————————————————————————————————————————————————————————————————————————
现在我们已经解析了所有方法,可以直接进入算法测试环节。
测试结果
结果一目了然:外部参数经过轻微优化,内部参数则保持不变,沿用前文方法中所述的设置。COA(CHAOS)|混沌优化算法|50.0|10.0|40.0|2.0|1.2|0.0001=============================
5 Hilly's;函数运行次数:10000;结果:0.6083668756744218
25 Hilly's;函数运行次数:10000;结果:0.4079413401686229
500 Hilly's;函数运行次数:10000;结果:0.2678056430575926
=============================
5 Forest's;函数运行次数:10000;结果:0.668343763134901
25 Forest's;函数运行次数:10000;结果:0.38894787694645416
500 Forest's;函数运行次数:10000;结果: 0.2198998763835145
=============================
5 Megacity's;函数运行次数:10000;结果:0.32307692307692304
25 Megacity's;函数运行次数:10000;结果:0.1987692307692308
500 Megacity's;函数运行次数:10000;结果:0.10598461538461638
=============================
总得分:3.18914 (35.43%)
我想重点展示一下算法运行的可视化效果:多种搜索方式的组合产生了别具一格的视觉表现。

在 Hilly 函数上测试COA(CHAOS)算法

在 Forest 函数上测试COA(CHAOS)算法

在 Megacity 函数上测试COA(CHAOS)算法
根据测试结果,混沌优化算法(COA/CHAOS)已纳入我们的评级表中。
| # | 算法 | 说明 | Hilly | Hilly 最终结果 | Forest | Forest 最终结果 | Megacity (离散) | Megacity 最终结果 | 最终 结果 | % of MAX | ||||||
| 10 p (5 F) | 50 p (25 F) | 1000 p (500 F) | 10 p (5 F) | 50 p (25 F) | 1000 p (500 F) | 10 p (5 F) | 50 p (25 F) | 1000 p (500 F) | ||||||||
| 1 | ANS | 交叉邻近搜索 | 0.94948 | 0.84776 | 0.43857 | 2.23581 | 1.00000 | 0.92334 | 0.39988 | 2.32323 | 0.70923 | 0.63477 | 0.23091 | 1.57491 | 6.134 | 68.15 |
| 2 | CLA | 代码锁定算法(JOO) | 0.95345 | 0.87107 | 0.37590 | 2.20042 | 0.98942 | 0.91709 | 0.31642 | 2.22294 | 0.79692 | 0.69385 | 0.19303 | 1.68380 | 6.107 | 67.86 |
| 3 | AMOm | 动物迁徙优化M | 0.90358 | 0.84317 | 0.46284 | 2.20959 | 0.99001 | 0.92436 | 0.46598 | 2.38034 | 0.56769 | 0.59132 | 0.23773 | 1.39675 | 5.987 | 66.52 |
| 4 | (P+O)ES | (P+O) 进化策略 | 0.92256 | 0.88101 | 0.40021 | 2.20379 | 0.97750 | 0.87490 | 0.31945 | 2.17185 | 0.67385 | 0.62985 | 0.18634 | 1.49003 | 5.866 | 65.17 |
| 5 | CTA | 彗尾算法(JOO) | 0.95346 | 0.86319 | 0.27770 | 2.09435 | 0.99794 | 0.85740 | 0.33949 | 2.19484 | 0.88769 | 0.56431 | 0.10512 | 1.55712 | 5.846 | 64.96 |
| 6 | TETA | 时间演化旅行算法(JOO) | 0.91362 | 0.82349 | 0.31990 | 2.05701 | 0.97096 | 0.89532 | 0.29324 | 2.15952 | 0.73462 | 0.68569 | 0.16021 | 1.58052 | 5.797 | 64.41 |
| 7 | SDSm | 随机扩散搜索 M | 0.93066 | 0.85445 | 0.39476 | 2.17988 | 0.99983 | 0.89244 | 0.19619 | 2.08846 | 0.72333 | 0.61100 | 0.10670 | 1.44103 | 5.709 | 63.44 |
| 8 | BOAm | 台球优化算法 M | 0.95757 | 0.82599 | 0.25235 | 2.03590 | 1.00000 | 0.90036 | 0.30502 | 2.20538 | 0.73538 | 0.52523 | 0.09563 | 1.35625 | 5.598 | 62.19 |
| 9 | AAm | 射箭算法 M | 0.91744 | 0.70876 | 0.42160 | 2.04780 | 0.92527 | 0.75802 | 0.35328 | 2.03657 | 0.67385 | 0.55200 | 0.23738 | 1.46323 | 5.548 | 61.64 |
| 10 | ESG | 社会群体的进化(JOO) | 0.99906 | 0.79654 | 0.35056 | 2.14616 | 1.00000 | 0.82863 | 0.13102 | 1.95965 | 0.82333 | 0.55300 | 0.04725 | 1.42358 | 5.529 | 61.44 |
| 11 | SIA | 模拟各向同性退火(JOO) | 0.95784 | 0.84264 | 0.41465 | 2.21513 | 0.98239 | 0.79586 | 0.20507 | 1.98332 | 0.68667 | 0.49300 | 0.09053 | 1.27020 | 5.469 | 60.76 |
| 12 | ACS | 人工协同搜索 | 0.75547 | 0.74744 | 0.30407 | 1.80698 | 1.00000 | 0.88861 | 0.22413 | 2.11274 | 0.69077 | 0.48185 | 0.13322 | 1.30583 | 5.226 | 58.06 |
| 13 | DA | 辩证算法 | 0.86183 | 0.70033 | 0.33724 | 1.89940 | 0.98163 | 0.72772 | 0.28718 | 1.99653 | 0.70308 | 0.45292 | 0.16367 | 1.31967 | 5.216 | 57.95 |
| 14 | BHAm | 黑洞算法 M | 0.75236 | 0.76675 | 0.34583 | 1.86493 | 0.93593 | 0.80152 | 0.27177 | 2.00923 | 0.65077 | 0.51646 | 0.15472 | 1.32195 | 5.196 | 57.73 |
| 15 | ASO | 无政府社会优化 | 0.84872 | 0.74646 | 0.31465 | 1.90983 | 0.96148 | 0.79150 | 0.23803 | 1.99101 | 0.57077 | 0.54062 | 0.16614 | 1.27752 | 5.178 | 57.54 |
| 16 | RFO | 皇家同花顺优化算法 (JOO) | 0.83361 | 0.73742 | 0.34629 | 1.91733 | 0.89424 | 0.73824 | 0.24098 | 1.87346 | 0.63154 | 0.50292 | 0.16421 | 1.29867 | 5.089 | 56.55 |
| 17 | AOSm | 原子环路搜索 M | 0.80232 | 0.70449 | 0.31021 | 1.81702 | 0.85660 | 0.69451 | 0.21996 | 1.77107 | 0.74615 | 0.52862 | 0.14358 | 1.41835 | 5.006 | 55.63 |
| 18 | TSEA | 龟壳进化算法(JOO) | 0.96798 | 0.64480 | 0.29672 | 1.90949 | 0.99449 | 0.61981 | 0.22708 | 1.84139 | 0.69077 | 0.42646 | 0.13598 | 1.25322 | 5.004 | 55.60 |
| 19 | DE | 差分进化 | 0.95044 | 0.61674 | 0.30308 | 1.87026 | 0.95317 | 0.78896 | 0.16652 | 1.90865 | 0.78667 | 0.36033 | 0.02953 | 1.17653 | 4.955 | 55.06 |
| 20 | SRA | 成功餐饮经营者算法(joo) | 0.96883 | 0.63455 | 0.29217 | 1.89555 | 0.94637 | 0.55506 | 0.19124 | 1.69267 | 0.74923 | 0.44031 | 0.12526 | 1.31480 | 4.903 | 54.48 |
| 21 | CRO | 化学反应优化 | 0.94629 | 0.66112 | 0.29853 | 1.90593 | 0.87906 | 0.58422 | 0.21146 | 1.67473 | 0.75846 | 0.42646 | 0.12686 | 1.31178 | 4.892 | 54.36 |
| 22 | BIO | 血缘遗传优化算法 (JOO) | 0.81568 | 0.65336 | 0.30877 | 1.77781 | 0.89937 | 0.65319 | 0.21760 | 1.77016 | 0.67846 | 0.47631 | 0.13902 | 1.29378 | 4.842 | 53.80 |
| 23 | BSA | 鸟群算法 | 0.89306 | 0.64900 | 0.26250 | 1.80455 | 0.92420 | 0.71121 | 0.24939 | 1.88479 | 0.69385 | 0.32615 | 0.10012 | 1.12012 | 4.809 | 53.44 |
| 24 | HS | 和声搜索算法 | 0.86509 | 0.68782 | 0.32527 | 1.87818 | 0.99999 | 0.68002 | 0.09590 | 1.77592 | 0.62000 | 0.42267 | 0.05458 | 1.09725 | 4.751 | 52.79 |
| 25 | SSG | 树苗播种和生长算法 | 0.77839 | 0.64925 | 0.39543 | 1.82308 | 0.85973 | 0.62467 | 0.17429 | 1.65869 | 0.64667 | 0.44133 | 0.10598 | 1.19398 | 4.676 | 51.95 |
| 26 | BCOm | 细菌趋化优化算法M | 0.75953 | 0.62268 | 0.31483 | 1.69704 | 0.89378 | 0.61339 | 0.22542 | 1.73259 | 0.65385 | 0.42092 | 0.14435 | 1.21912 | 4.649 | 51.65 |
| 27 | ABO | 非洲水牛优化 | 0.83337 | 0.62247 | 0.29964 | 1.75548 | 0.92170 | 0.58618 | 0.19723 | 1.70511 | 0.61000 | 0.43154 | 0.13225 | 1.17378 | 4.634 | 51.49 |
| 28 | (PO)ES | (PO) 进化策略 | 0.79025 | 0.62647 | 0.42935 | 1.84606 | 0.87616 | 0.60943 | 0.19591 | 1.68151 | 0.59000 | 0.37933 | 0.11322 | 1.08255 | 4.610 | 51.22 |
| 29 | TSm | 禁忌搜索优化算法 | 0.87795 | 0.61431 | 0.29104 | 1.78330 | 0.92885 | 0.51844 | 0.19054 | 1.63783 | 0.61077 | 0.38215 | 0.12157 | 1.11449 | 4.536 | 50.40 |
| 30 | BSO | 头脑风暴优化 | 0.93736 | 0.57616 | 0.29688 | 1.81041 | 0.93131 | 0.55866 | 0.23537 | 1.72534 | 0.55231 | 0.29077 | 0.11914 | 0.96222 | 4.498 | 49.98 |
| 31 | WOAm | 鲸鱼优化算法M | 0.84521 | 0.56298 | 0.26263 | 1.67081 | 0.93100 | 0.52278 | 0.16365 | 1.61743 | 0.66308 | 0.41138 | 0.11357 | 1.18803 | 4.476 | 49.74 |
| 32 | AEFA | 人工电场算法 | 0.87700 | 0.61753 | 0.25235 | 1.74688 | 0.92729 | 0.72698 | 0.18064 | 1.83490 | 0.66615 | 0.11631 | 0.09508 | 0.87754 | 4.459 | 49.55 |
| 33 | AEO | 基于人工生态系统的优化算法 | 0.91380 | 0.46713 | 0.26470 | 1.64563 | 0.90223 | 0.43705 | 0.21400 | 1.55327 | 0.66154 | 0.30800 | 0.28563 | 1.25517 | 4.454 | 49.49 |
| 34 | ACOm | 蚁群优化 M | 0.88190 | 0.66127 | 0.30377 | 1.84693 | 0.85873 | 0.58680 | 0.15051 | 1.59604 | 0.59667 | 0.37333 | 0.02472 | 0.99472 | 4.438 | 49.31 |
| 35 | BFO-GA | 细菌觅食优化 - ga | 0.89150 | 0.55111 | 0.31529 | 1.75790 | 0.96982 | 0.39612 | 0.06305 | 1.42899 | 0.72667 | 0.27500 | 0.03525 | 1.03692 | 4.224 | 46.93 |
| 36 | SOA | 简单优化算法 | 0.91520 | 0.46976 | 0.27089 | 1.65585 | 0.89675 | 0.37401 | 0.16984 | 1.44060 | 0.69538 | 0.28031 | 0.10852 | 1.08422 | 4.181 | 46.45 |
| 37 | ABHA | 人工蜂巢算法 | 0.84131 | 0.54227 | 0.26304 | 1.64663 | 0.87858 | 0.47779 | 0.17181 | 1.52818 | 0.50923 | 0.33877 | 0.10397 | 0.95197 | 4.127 | 45.85 |
| 38 | ACMO | 大气云层模型优化 | 0.90321 | 0.48546 | 0.30403 | 1.69270 | 0.80268 | 0.37857 | 0.19178 | 1.37303 | 0.62308 | 0.24400 | 0.10795 | 0.97503 | 4.041 | 44.90 |
| 39 | ADAMm | 自适应动量评估 M | 0.88635 | 0.44766 | 0.26613 | 1.60014 | 0.84497 | 0.38493 | 0.16889 | 1.39880 | 0.66154 | 0.27046 | 0.10594 | 1.03794 | 4.037 | 44.85 |
| 40 | CGO | 混沌博弈优化算法 | 0.57256 | 0.37158 | 0.32018 | 1.26432 | 0.61176 | 0.61931 | 0.62161 | 1.85267 | 0.37538 | 0.21923 | 0.19028 | 0.78490 | 3.902 | 43.35 |
| 41 | ATAm | 人工部落算法 M | 0.71771 | 0.55304 | 0.25235 | 1.52310 | 0.82491 | 0.55904 | 0.20473 | 1.58867 | 0.44000 | 0.18615 | 0.09411 | 0.72026 | 3.832 | 42.58 |
| 42 | CROm | 珊瑚礁优化算法 M | 0.78512 | 0.46032 | 0.25958 | 1.50502 | 0.86688 | 0.35297 | 0.16267 | 1.38252 | 0.63231 | 0.26738 | 0.10734 | 1.00703 | 3.895 | 43.27 |
| 43 | CFO | 中心力优化算法 | 0.60961 | 0.54958 | 0.27831 | 1.43750 | 0.63418 | 0.46833 | 0.22541 | 1.32792 | 0.57231 | 0.23477 | 0.09586 | 0.90294 | 3.668 | 40.76 |
| 44 | ASHA | 人工淋浴算法 | 0.89686 | 0.40433 | 0.25617 | 1.55737 | 0.80360 | 0.35526 | 0.19160 | 1.35046 | 0.47692 | 0.18123 | 0.09774 | 0.75589 | 3.664 | 40.71 |
| 45 | ASBO | 适应性社会行为优化 | 0.76331 | 0.49253 | 0.32619 | 1.58202 | 0.79546 | 0.40035 | 0.26097 | 1.45677 | 0.26462 | 0.17169 | 0.18200 | 0.61831 | 3.657 | 40.63 |
| CHAOS | 混沌优化算法 | 0.60837 | 0.40794 | 0.26781 | 1.28412 | 0.66834 | 0.38895 | 0.21990 | 1.27719 | 0.32308 | 0.19877 | 0.10598 | 0.62783 | 3.189 | 35.43 | |
| RW | 神经类群优化算法2 (joo) | 0.48754 | 0.32159 | 0.25781 | 1.06694 | 0.37554 | 0.21944 | 0.15877 | 0.75375 | 0.27969 | 0.14917 | 0.09847 | 0.52734 | 2.348 | 26.09 | |
总结
测试后得到 35% 的结果,已足以体现混沌优化算法(COA/CHAOS)具备良好的优化潜力,尤其是考虑到算法本身的复杂度,且本次测试仅对部分外部参数做了小幅调优,大量内部参数并未优化的情况下。该算法目前还远未发挥出其最优性能。
算法中最具创新性与应用前景的亮点包括:采用逻辑映射、正弦映射、帐篷映射三种不同混沌映射,极大丰富了算法的搜索能力;引入惯性项,使算法在移动中保持搜索动量,更易跳出局部最优陷阱;基于优化成效与搜索阶段动态调整参数,显著提升了算法自适应能力;通过记录决策历史、重置 “停滞” 智能体,避免了在无价值区域浪费计算资源。此外,拉丁超立方抽样与多样化的智能体初始布局策略,从一开始就保证了对搜索空间的充分覆盖。若要进一步提升算法性能,后续可对其内部参数开展更精细化的调优研究。
该算法为改进其他优化方法提供了丰富思路,特别是其自适应机制与停滞处理策略,可有效迁移到其他面向金融市场的机器学习与优化算法中。

图例 1. 根据相应测试结果的算法颜色分级

Figure 2. 算法测试结果直方图(比例从 0 到 100,越高越好,其中 100 是最大可能的理论结果,存档中有一个用于计算评级表的脚本)
COA(CHAOS) 的优缺点:
优点:
- 多样化的搜索策略。
- 极具潜力的改进方向。
- 稳定的结果。
缺点:
- 大量的外部参数。
- 存在大量不可优化的内部参数。
本文附带了一个文档,其中包含了算法代码的当前版本。作者不对标准算法描述的绝对准确性承担责任。因为为了提升搜索能力,本文已对原算法进行了多处修改。文章中表述的结论和论断是基于实验的结果。
文中所用程序
| # | 名称 | 类型 | 说明 |
|---|---|---|---|
| 1 | #C_AO.mqh | 库 | 种群优化算法的父类 |
| 2 | #C_AO_enum.mqh | 库 | 群体优化算法枚举 |
| 3 | TestFunctions.mqh | 库 | 测试函数库 |
| 4 | TestStandFunctions.mqh | 库 | 测试台函数库 |
| 5 | Utilities.mqh | 库 | 辅助函数库 |
| 6 | CalculationTestResults.mqh | 库 | 用于计算对比表中结果的脚本 |
| 7 | Testing AOs.mq5 | 脚本 | 所有种群优化算法的统一测试平台 |
| 8 | Simple use of population optimization algorithms.mq5 | 脚本 | 一个不包含可视化功能的种群优化算法使用示例 |
| 9 | Test_AO_COA_chaos.mq5 | 脚本 | COA(CHAOS) 测试脚本 |
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/17874
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
混沌优化算法(COA)
新手在交易中的10个基本错误
采用 CatBoost AI 预测 Renko 柱
已发表文章《混沌优化算法(COA):继续》:
作者:安德烈-迪克
...