English Русский Español Português
preview
混沌优化算法(COA):续篇

混沌优化算法(COA):续篇

MetaTrader 5测试者 |
40 2
Andrey Dik
Andrey Dik

内容

  1. 引言
  2. 算法的实现
  3. 测试结果
  4. 总结


引言

上一篇文章中,我们介绍了混沌优化方法,并分析了算法中包含的部分核心方法。在本文中,我们将完成剩余方法的解析,并直接进入算法在测试函数上的验证环节。 

在本次实现中,混沌优化方法通过确定性混沌遍历解空间。其核心原理是使用三种不同的混沌映射(逻辑映射、正弦映射、帐篷映射)生成具备伪随机性与遍历性的序列。算法分为三个阶段执行:初始混沌搜索、基于加权梯度法的解优化、自适应缩小范围的最终局部搜索。

通过引入带惯性的速度向量与停滞检测机制,算法能够有效避免陷入局部最优。参数的动态自适应调整与多种变异策略,确保了全局空间探索与局部解开发之间的平衡。接下来我们继续解析剩余方法。



算法的实现

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

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

Forest

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

Megacity

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)
1ANS交叉邻近搜索0.949480.847760.438572.235811.000000.923340.399882.323230.709230.634770.230911.574916.13468.15
2CLA代码锁定算法(JOO)0.953450.871070.375902.200420.989420.917090.316422.222940.796920.693850.193031.683806.10767.86
3AMOm动物迁徙优化M0.903580.843170.462842.209590.990010.924360.465982.380340.567690.591320.237731.396755.98766.52
4(P+O)ES(P+O) 进化策略0.922560.881010.400212.203790.977500.874900.319452.171850.673850.629850.186341.490035.86665.17
5CTA彗尾算法(JOO)0.953460.863190.277702.094350.997940.857400.339492.194840.887690.564310.105121.557125.84664.96
6TETA时间演化旅行算法(JOO)0.913620.823490.319902.057010.970960.895320.293242.159520.734620.685690.160211.580525.79764.41
7SDSm随机扩散搜索 M0.930660.854450.394762.179880.999830.892440.196192.088460.723330.611000.106701.441035.70963.44
8BOAm台球优化算法 M0.957570.825990.252352.035901.000000.900360.305022.205380.735380.525230.095631.356255.59862.19
9AAm射箭算法 M0.917440.708760.421602.047800.925270.758020.353282.036570.673850.552000.237381.463235.54861.64
10ESG社会群体的进化(JOO)0.999060.796540.350562.146161.000000.828630.131021.959650.823330.553000.047251.423585.52961.44
11SIA模拟各向同性退火(JOO)0.957840.842640.414652.215130.982390.795860.205071.983320.686670.493000.090531.270205.46960.76
12ACS人工协同搜索0.755470.747440.304071.806981.000000.888610.224132.112740.690770.481850.133221.305835.22658.06
13DA辩证算法0.861830.700330.337241.899400.981630.727720.287181.996530.703080.452920.163671.319675.21657.95
14BHAm黑洞算法 M0.752360.766750.345831.864930.935930.801520.271772.009230.650770.516460.154721.321955.19657.73
15ASO无政府社会优化0.848720.746460.314651.909830.961480.791500.238031.991010.570770.540620.166141.277525.17857.54
16RFO皇家同花顺优化算法 (JOO)0.833610.737420.346291.917330.894240.738240.240981.873460.631540.502920.164211.298675.08956.55
17AOSm原子环路搜索 M0.802320.704490.310211.817020.856600.694510.219961.771070.746150.528620.143581.418355.00655.63
18TSEA龟壳进化算法(JOO)0.967980.644800.296721.909490.994490.619810.227081.841390.690770.426460.135981.253225.00455.60
19DE差分进化0.950440.616740.303081.870260.953170.788960.166521.908650.786670.360330.029531.176534.95555.06
20SRA成功餐饮经营者算法(joo)0.968830.634550.292171.895550.946370.555060.191241.692670.749230.440310.125261.314804.90354.48
21CRO化学反应优化0.946290.661120.298531.905930.879060.584220.211461.674730.758460.426460.126861.311784.89254.36
22BIO血缘遗传优化算法 (JOO)0.815680.653360.308771.777810.899370.653190.217601.770160.678460.476310.139021.293784.84253.80
23BSA鸟群算法0.893060.649000.262501.804550.924200.711210.249391.884790.693850.326150.100121.120124.80953.44
24HS和声搜索算法0.865090.687820.325271.878180.999990.680020.095901.775920.620000.422670.054581.097254.75152.79
25SSG树苗播种和生长算法0.778390.649250.395431.823080.859730.624670.174291.658690.646670.441330.105981.193984.67651.95
26BCOm细菌趋化优化算法M0.759530.622680.314831.697040.893780.613390.225421.732590.653850.420920.144351.219124.64951.65
27ABO非洲水牛优化0.833370.622470.299641.755480.921700.586180.197231.705110.610000.431540.132251.173784.63451.49
28(PO)ES(PO) 进化策略0.790250.626470.429351.846060.876160.609430.195911.681510.590000.379330.113221.082554.61051.22
29TSm禁忌搜索优化算法0.877950.614310.291041.783300.928850.518440.190541.637830.610770.382150.121571.114494.53650.40
30BSO头脑风暴优化0.937360.576160.296881.810410.931310.558660.235371.725340.552310.290770.119140.962224.49849.98
31WOAm鲸鱼优化算法M0.845210.562980.262631.670810.931000.522780.163651.617430.663080.411380.113571.188034.47649.74
32AEFA人工电场算法0.877000.617530.252351.746880.927290.726980.180641.834900.666150.116310.095080.877544.45949.55
33AEO基于人工生态系统的优化算法0.913800.467130.264701.645630.902230.437050.214001.553270.661540.308000.285631.255174.45449.49
34ACOm蚁群优化 M0.881900.661270.303771.846930.858730.586800.150511.596040.596670.373330.024720.994724.43849.31
35BFO-GA细菌觅食优化 - ga0.891500.551110.315291.757900.969820.396120.063051.428990.726670.275000.035251.036924.22446.93
36SOA简单优化算法0.915200.469760.270891.655850.896750.374010.169841.440600.695380.280310.108521.084224.18146.45
37ABHA人工蜂巢算法0.841310.542270.263041.646630.878580.477790.171811.528180.509230.338770.103970.951974.12745.85
38ACMO大气云层模型优化0.903210.485460.304031.692700.802680.378570.191781.373030.623080.244000.107950.975034.04144.90
39ADAMm自适应动量评估 M0.886350.447660.266131.600140.844970.384930.168891.398800.661540.270460.105941.037944.03744.85
40CGO混沌博弈优化算法0.572560.371580.320181.264320.611760.619310.621611.852670.375380.219230.190280.784903.90243.35
41ATAm人工部落算法 M0.717710.553040.252351.523100.824910.559040.204731.588670.440000.186150.094110.720263.83242.58
42CROm珊瑚礁优化算法 M0.785120.460320.259581.505020.866880.352970.162671.382520.632310.267380.107341.007033.89543.27
43CFO中心力优化算法0.609610.549580.278311.437500.634180.468330.225411.327920.572310.234770.095860.902943.66840.76
44ASHA人工淋浴算法0.896860.404330.256171.557370.803600.355260.191601.350460.476920.181230.097740.755893.66440.71
45ASBO适应性社会行为优化0.763310.492530.326191.582020.795460.400350.260971.456770.264620.171690.182000.618313.65740.63
CHAOS混沌优化算法0.608370.407940.267811.284120.668340.388950.219901.277190.323080.198770.105980.627833.18935.43
RW神经类群优化算法2 (joo)0.487540.321590.257811.066940.375540.219440.158770.753750.279690.149170.098470.527342.34826.09


总结

测试后得到 35% 的结果,已足以体现混沌优化算法(COA/CHAOS)具备良好的优化潜力,尤其是考虑到算法本身的复杂度,且本次测试仅对部分外部参数做了小幅调优,大量内部参数并未优化的情况下。该算法目前还远未发挥出其最优性能。

算法中最具创新性与应用前景的亮点包括:采用逻辑映射、正弦映射、帐篷映射三种不同混沌映射,极大丰富了算法的搜索能力;引入惯性项,使算法在移动中保持搜索动量,更易跳出局部最优陷阱;基于优化成效与搜索阶段动态调整参数,显著提升了算法自适应能力;通过记录决策历史、重置 “停滞” 智能体,避免了在无价值区域浪费计算资源。此外,拉丁超立方抽样与多样化的智能体初始布局策略,从一开始就保证了对搜索空间的充分覆盖。若要进一步提升算法性能,后续可对其内部参数开展更精细化的调优研究。

该算法为改进其他优化方法提供了丰富思路,特别是其自适应机制与停滞处理策略,可有效迁移到其他面向金融市场的机器学习与优化算法中。

TAB

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

图表

Figure 2. 算法测试结果直方图(比例从 0 到 100,越高越好,其中 100 是最大可能的理论结果,存档中有一个用于计算评级表的脚本)

COA(CHAOS) 的优缺点:

优点:

  1. 多样化的搜索策略。
  2. 极具潜力的改进方向。
  3. 稳定的结果。

缺点:

  1. 大量的外部参数。
  2. 存在大量不可优化的内部参数。

本文附带了一个文档,其中包含了算法代码的当前版本。作者不对标准算法描述的绝对准确性承担责任。因为为了提升搜索能力,本文已对原算法进行了多处修改。文章中表述的结论和论断是基于实验的结果。


文中所用程序

#名称类型说明
1#C_AO.mqh

种群优化算法的父类
2#C_AO_enum.mqh

群体优化算法枚举
3TestFunctions.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

附加的文件 |
COAcCHAOSd.zip (203.55 KB)
最近评论 | 前往讨论 (2)
Jesus Manzur
Jesus Manzur | 12 2月 2026 在 21:04
MetaQuotes:

已发表文章《混沌优化算法(COA):继续》:

作者:安德烈-迪克

令人惊讶的是,当不同的方法结合在一起时,会产生一种像老式电视机一样的静态,就像她在某种程度上显示出一种 "噪音 "或混沌,而这种 "噪音 "或混沌仍然记录在是中,必须由敏感性决定的小的初始变化最终完全改变最终结果的相同事实,事实上,我们是微不足道的,非常好的文章。
Andrey Dik
Andrey Dik | 13 2月 2026 在 05:22
Jesus Manzur #:
...
谢谢!
交易策略 交易策略
各种交易策略的分类都是任意的,下面这种分类强调从交易的基本概念上分类。
混沌优化算法(COA) 混沌优化算法(COA)
本文介绍一种改进型混沌优化算法(COA),该算法将混沌特性与自适应搜索机制相结合。算法通过一组混沌映射与惯性分量对搜索空间进行遍历探索。文章阐述了金融优化领域中混沌方法的理论基础。
新手在交易中的10个基本错误 新手在交易中的10个基本错误
新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
采用 CatBoost AI 预测 Renko 柱 采用 CatBoost AI 预测 Renko 柱
如何将Renko柱与人工智能结合使用?我们来探讨外汇市场中的Renko交易,其预测准确率最高可达 59.27%。我们将探究Renko柱在过滤市场噪音方面的优势,了解为何成交量比价格形态更重要,以及如何为欧元 / 美元设置最优的Renko块大小。这是一份分步指南,教你整合 CatBoost、Python 与 MT5(MetaTrader 5),搭建属于自己的外汇Renko柱预测系统。对于希望突破传统技术分析框架的交易者来说,这是绝佳方案。