English Русский Español Português
preview
骆驼算法(CA)

骆驼算法(CA)

MetaTrader 5交易 |
43 0
Andrey Dik
Andrey Dik

内容

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


引言

近几十年来,大量受自然现象与生物行为启发的优化算法不断涌现。这类生物启发式算法在众多任务中均表现出优异效果。本文将介绍一种全新的优化算法 ——骆驼算法(CA),该算法模拟骆驼在极端沙漠环境中的生存与移动策略构建而成。该算法由穆罕默德・哈立德・易卜拉欣与拉姆齐・萨利姆・阿里两位学者于 2016 年提出并正式发表。

骆驼具备独特的生理特征与行为适应机制,能够在资源匮乏、气温极端、地貌多变的严酷沙漠环境中高效行进、生存。骆驼算法(CA)对骆驼的核心行为机理进行建模:包含温度影响、水和食物供给调配、耐力、绿洲效应(对应搜索空间中的优质潜力区域),以及驼队群体间的协同交互机制。

按照惯例,本文将剖析原算法的内部原理、对其进行改进,并并在测试函数上对两个版本进行测试。测试结果将纳入我们的智能优化算法综合排名表中。


算法的实现

试想一支骆驼驼队启程,穿行在广袤无垠的沙漠之中。它们的目标,是在茫茫沙海里寻找隐匿的水源与食物绿洲。正是这一自然迁徙寻源行为,启发学者创立了骆驼算法(CA)。

该算法模拟骆驼在恶劣沙漠环境中的生存方式与资源搜寻逻辑。算法中的每一只 “骆驼”,都代表一个潜在解;它们在搜索空间(沙漠)中不断探索,力求找到最优解(资源最丰饶的绿洲)。 

骆驼成群结队迁徙自有其缘由 —— 这是一种天然的生存策略。在算法模型中,一群 “骆驼个体”(潜在解)会互相交流已探索到的最优路径信息,就像现实中的驼队会循着已验证的水源路径前行。

核心要素:

温度(T)—— 影响骆驼行为的随机因子。沙漠昼夜温差极大,从夜晚寒凉到白昼酷热,会直接影响骆驼的行进速度与行进方向。骆驼适应极端温差(寒夜至酷暑白昼)的独特生理特性,被抽象为算法中的温度参数。该参数引入随机性与自适应能力,可有效避免算法陷入局部最优,原理如同骆驼会随环境变化灵活调整行进路线。

供给储备(S) —— 水源与食物资源,会在行进过程中持续消耗衰减。骆驼经过自然演化,能够在地球上最严酷的环境中存活。其高效调配水与食物资源的特性,直接映射为算法中的供给储备参数;该参数随算法迭代不断衰减,并影响搜索策略。骆驼越久找不到绿洲,自身剩余能量就越少。这一特性让该算法尤其适用于计算资源受限的优化求解场景。

耐力(E)—— 代表骆驼的自身能量,受环境温度与行进时长共同影响。烈日炙烤会慢慢消耗整支驼队的体力。骆驼以极强的耐力著称,可凭借极少资源长途跋涉。在算法中,耐力参数决定个体对解空间的探索能力,会随迭代逐步衰减,用以平衡新区域全局探索与已有优质解局部开发的关系。

绿洲效应 —— 当某只骆驼寻找到较优位置(最优候选解)时,自身资源储备与耐力将得到恢复,从而可以继续深度探索。算法中,一旦搜寻到较优解,个体的 “供给储备” 与 “耐力” 就会被重置补给;如同骆驼在绿洲休整、恢复体力后,再对周边区域开展精细搜索。这也是该算法最具特色的机制之一。

随机游走 —— 偏离主行进路径的随机偏移行为,用于开拓未知搜索区域。

如下图所示:五只骆驼组成群体,在沙漠中搜寻资源最丰饶的绿洲。初始阶段它们身处不同位置,朝各自方向行进:

1 号骆驼向北行进,受高温影响行进速度放缓,不得不频繁停歇休整。
2 号骆驼发现一处小型绿洲(局部最优解),具备一定水土与食物资源。它将这一发现告知其他同伴,同时并未停止搜寻,预判周边存在规模更大的绿洲。
3 号骆驼在地势相对平缓的区域漫游前行,自身资源储备逐渐消耗,但仍坚持探索新的行进方向。
4 号骆驼进入极端高温区域,自身耐力大幅下降。依靠随机游走机制,它成功脱离了这片不利区域。
5 号骆驼结合其他骆驼共享的信息,再借助随机游走的有利方向,最终找到了资源最丰富的绿洲(全局最优解)。

    骆驼算法

    图例 1. 骆驼算法(CA)运行机制

    CA算法的伪代码如下:

    // 初始化参数
    初始化:
    popSize = 种群规模(驼队数量)
    Tmin = 最低温度
    Tmax = 最高温度
    omega = 供给负载系数
    dyingRate = 骆驼“死亡”率
    alpha = 绿洲效应可见度参数
    initialSupply = 初始水与食物供给量(通常取 1.0)
    initialEndurance = 初始耐力值(通常取 1.0)
    totalSteps = 路径总迭代步数
    traveledSteps = 已行进步数,初始值为 0

    // 初始化初始种群
    创建初始驼队(一组初始解):
    对每一只骆驼 i(从 1 到 popSize):
    在有效范围内随机生成一个初始解
    设置初始参数:
    temperature[i] = Tmin 到 Tmax 之间的随机值
    supply[i] = initialSupply
                endurance [i] = initialEndurance
        
    计算驼队中每只骆驼的适应度值
    查找当前全局最优解

    // 主优化循环
    While (已行进步数 < 总步数):
    已行进步数 +1
        
    // 遍历驼队中的每一只骆驼
    循环 i 从 1 到 popSize:
            // 1. 更新状态参数(温度、供给、耐力)
    // 公式 (1):当前温度 = (最高温 - 最低温) × 随机数(0,1) + 最低温
    temperature[i] = CalculateTemperature (i)
            
    // 公式 (2):当前供给 = 上一代供给 × (1 - ω × 已行进步数/总步数)
            supply [i] = CalculateSupply (i)
            
    // 公式 (4):当前耐力 = 上一代耐力 × (1 - 当前温度/最高温度) × (1 - 已行进步数/总步数)
            endurance [i] = CalculateEndurance (i)
            
            // 2. 判断骆驼是否“死亡”
    If (随机数 < 消亡率):
    为骆驼 i 重新随机生成一个新解
    直接进入下一次循环
            
            // 3. 更新骆驼位置
    delta = [-1, 1] 区间内的随机数 // 随机游走系数
    保存骆驼当前位置坐标
            
    // 遍历每一维坐标
    对于每一个坐标 c:
    // 计算位置更新公式的系数
    enduranceFactor = (1.0 - 当前耐力 / 初始耐力)
    supplyFactor = exp(1.0 - 当前供给 / 初始供给)

                
                // 使用公式 (6) 更新位置
    新位置[c] = 旧位置[c] + delta × 耐力系数 × 供给系数 × (最优位置[c] - 旧位置[c])
                
    // 检查是否越界,必要时进行边界修正
    新位置[c] = 限制在有效搜索范围内
            
            // 4. 应用绿洲效应
    If (随机数 > (1.0 - alpha) 且 新适应度 > 旧适应度):
    // 发现绿洲,恢复供给与耐力
    supply[i] = initialSupply
                endurance [i] = initialEndurance
            
    // 对骆驼种群排序,更新最优解
    更新全局最优解

    // 返回最终的全局最优解

    现在我们可以开始编写代码,代码中将同时包含作者提出的原始版本(部分代码段会被注释)以及我提出的改进版本,旨在优化算法的逻辑。我们来编写 C_AO_CAm 类,该类用于实现改进型骆驼算法(CAm),并继承自基础类 C_AO。

    该类包含算法专属参数,如种群规模、最低 / 最高温度、负载系数、骆驼淘汰率以及可见度参数。这些参数可在初始化时设置,并可通过参数数组灵活配置。

    类的构造函数定义了算法的基本属性,包括算法名称、描述、思想来源引用,并初始化参数数组。在 SetParams 方法中,这些参数可在运行时动态更新。

    该类实现了种群初始化、骆驼移动、解修正、参数更新以及绿洲效应应用等方法 —— 完整模拟了骆驼在沙漠中的行为并实现最优解搜索。类的核心成员包括:存储每只骆驼温度、水与食物储备、耐力的数组,以及已行进步数和总步数计数器。同时包含定义初始供给量与初始耐力的变量,通常在算法启动时完成初始化。

    总体而言,该类实现了基于驼队行为的改进版优化算法,其中 “温度” 与 “供给” 用于模拟搜索中间状态,而骆驼的移动与淘汰机制则助力算法高效求解。

    //——————————————————————————————————————————————————————————————————————————————
    class C_AO_CAm : public C_AO
    {
      public: //--------------------------------------------------------------------
      ~C_AO_CAm () { }
      C_AO_CAm ()
      {
        ao_name = "CA";
        ao_desc = "Camel Algorithm M";
        ao_link = "https://www.mql5.com/en/articles/18057";
    
        popSize   = 50;     // population size (camel caravan)
        Tmin      = 50;     // minimum temperature
        Tmax      = 100;    // maximum temperature
        omega     = 0.8;    // load factor for 'supply'
        dyingRate = 0.01;   // camels' "death" rate
        alpha     = 0.9;    // visibility parameter for the oasis effect
    
        ArrayResize (params, 6);
    
        params [0].name = "popSize";    params [0].val = popSize;
        params [1].name = "Tmin";       params [1].val = Tmin;
        params [2].name = "Tmax";       params [2].val = Tmax;
        params [3].name = "omega";      params [3].val = omega;
        params [4].name = "dyingRate";  params [4].val = dyingRate;
        params [5].name = "alpha";      params [5].val = alpha;
      }
    
      void SetParams ()
      {
        popSize   = (int)params [0].val;
        Tmin      = params      [1].val;
        Tmax      = params      [2].val;
        omega     = params      [3].val;
        dyingRate = params      [4].val;
        alpha     = params      [5].val;
      }
    
      bool Init (const double &rangeMinP  [],  // minimum values
                 const double &rangeMaxP  [],  // maximum values
                 const double &rangeStepP [],  // step change
                 const int     epochsP = 0);   // number of epochs
    
      void Moving   ();
      void Revision ();
    
      //----------------------------------------------------------------------------
      double Tmin;         // minimum temperature
      double Tmax;         // maximum temperature
      double omega;        // load factor for 'supply'
      double dyingRate;    // camels' "death" rate
      double alpha;        // visibility parameter for the oasis effect
    
      private: //-------------------------------------------------------------------
      double temperature [];   // current temperature for each camel
      double supply      [];   // current supply of water and food for each camel
      double endurance   [];   // current endurance for each camel
      double initialSupply;    // initial supply (usually 1.0)
      double initialEndurance; // initial endurance (usually 1.0)
      int    traveledSteps;    // number of steps taken
      int    totalSteps;       // total number of steps
    
      // Auxiliary methods
      void   InitializePopulation ();
      void   UpdateFactors        ();
      void   UpdatePositions      ();
      void   ApplyOasisEffect     ();
    };
    //——————————————————————————————————————————————————————————————————————————————
    

    Init 方法用于初始化改进型骆驼算法(CAm)。在该方法执行过程中,会为算法后续运行准备必要的数据结构与参数。方法的核心步骤包括调用标准初始化函数,该函数用于设置搜索变量的取值范围与迭代步长。若标准初始化执行失败,则本方法也会返回失败。

    接下来,为存储每只骆驼状态参数的数组分配内存,包括温度、水和食物供给量、耐力,数组大小与种群规模保持一致。这些数组用于模拟骆驼在优化过程中的行为状态。方法会设置初始供给量、初始耐力值,以及与迭代轮数对应的总迭代步数。已完成迭代步数初始化为 0。

    //——————————————————————————————————————————————————————————————————————————————
    bool C_AO_CAm::Init (const double &rangeMinP  [],  // minimum values
                         const double &rangeMaxP  [],  // maximum values
                         const double &rangeStepP [],  // step change
                         const int     epochsP = 0)    // number of epochs
    {
      if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
    
      //----------------------------------------------------------------------------
      // Initialize arrays for each camel
      ArrayResize (temperature, popSize);
      ArrayResize (supply,      popSize);
      ArrayResize (endurance,   popSize);
    
      // Set initial values
      initialSupply    = 1.0;
      initialEndurance = 1.0;
      traveledSteps    = 0;
      totalSteps       = epochsP;
      
      return true;
    }
    //——————————————————————————————————————————————————————————————————————————————
    

    Moving 方法实现算法的迭代流程,负责更新骆驼的状态与位置移动。首先,方法会检查是否完成首次迭代;若未完成,则初始化骆驼种群,并标记初始化完成。

    在后续每一步迭代中,已完成步数计数器加一,随后依次执行以下操作:

    1. 更新温度、供给量、耐力等状态参数,这对模拟算法动态搜索行为至关重要。
    2. 更新骆驼在搜索空间中的位置,即朝着可能提升解质量的方向移动。
    3. 应用绿洲效应:骆驼可补充供给、恢复耐力,有助于避免算法陷入局部最优,并推动搜索空间的深度探索。

    每一步迭代结束时,保存每只骆驼的适应度函数值,用于对比当前状态与历史状态,并据此执行后续决策。

    //+----------------------------------------------------------------------------+
    //| Basic optimization method                                                  |
    //+----------------------------------------------------------------------------+
    void C_AO_CAm::Moving ()
    {
      // First iteration - initialization of the initial population
      if (!revision)
      {
        InitializePopulation ();
        revision = true;
        return;
      }
    
      // Increase the steps counter
      traveledSteps++;
    
      // Main optimization
      // 1. Update factors (temperature, supply, endurance)
      UpdateFactors ();
    
      // 2. Update the camel positions
      UpdatePositions ();
    
      // 3. apply the oasis effect (replenishment of supply and endurance)
      ApplyOasisEffect ();
    
      // 4. Save the state of camels
      for (int i = 0; i < popSize; i++) a [i].fP = a [i].f;
    }
    //——————————————————————————————————————————————————————————————————————————————
    

    Revision 方法负责更新当前骆驼种群中搜索到的最优解。方法遍历种群中的所有骆驼,将每只骆驼的适应度与当前最优值进行比较。若当前骆驼的适应度值(a [i].f)优于全局最优值(fB),则执行更新:

    1. 将新的最优适应度值赋值给 fB。
    2. 将达成最优值的骆驼位置(坐标、参数)从当前最优骆驼的坐标数组(a [i].c)复制到全局最优解坐标数组(cB)。 

    完成种群遍历后,fB 和 cB 将分别存储当前迭代轮次中找到的最优解的函数值与坐标。

    //+----------------------------------------------------------------------------+
    //| Update the best solution                                                   |
    //+----------------------------------------------------------------------------+
    void C_AO_CAm::Revision ()
    {
      // Find the best solution in the current population
      for (int i = 0; i < popSize; i++)
      {
        // Update the best solution
        if (a [i].f > fB)
        {
          fB = a [i].f;
          ArrayCopy (cB, a [i].c, 0, 0, WHOLE_ARRAY);
        }
      }
    }
    //——————————————————————————————————————————————————————————————————————————————
    

    InitializePopulation 方法用于构建优化算法的骆驼初始种群。该方法在整个可行搜索空间内生成均匀分布的初始解。

    方法的核心流程为遍历整个种群(即所有骆驼)。对每只骆驼,在各变量(各维度坐标)的允许范围内随机生成坐标。这些坐标随机选取,以均匀覆盖整个有效搜索区间。

    生成坐标后,将其舍入到最接近的有效步长,确保搜索过程符合离散性约束。该操作可保证初始解严格匹配允许范围与迭代步长。同时,为每只骆驼设置初始供给量、初始耐力等参数,参数值采用种群统一预设值。

    方法执行完成后,将生成均匀分布于整个搜索空间的初始解种群,保障算法高效启动。

    //+----------------------------------------------------------------------------+
    //| Initialize the initial population                                          |
    //+----------------------------------------------------------------------------+
    void C_AO_CAm::InitializePopulation ()
    {
      // Initialize the initial population uniformly throughout the space
      for (int i = 0; i < popSize; i++)
      {
        for (int c = 0; c < coords; c++)
        {
          // Generate random coordinates within acceptable limits
          a [i].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]);
          // Round to the nearest acceptable step
          a [i].c [c] = u.SeInDiSp (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
        }
    
        // Initialize factors for each camel
        supply    [i] = initialSupply;
        endurance [i] = initialEndurance;
      }
    }
    //——————————————————————————————————————————————————————————————————————————————
    

    UpdateFactors 方法属于 C_AO_CAm 类,负责更新影响种群中每只 “骆驼” 行为的核心参数:温度、供给量、耐力。这些参数在算法每一轮迭代中动态变化,并直接影响最优解的搜索过程。

    首先,计算行进比例 journeyRatio,即已完成迭代步数 traveledSteps 与总迭代步数 totalSteps 的比值。该数值反映算法的执行进度。对每只骆驼(i 从 0 到 popSize-1),在设定区间 [Tmin, Tmax] 内随机设置温度 temperature[i]。每只骆驼的温度独立随机生成,为算法引入随机性。

    骆驼的供给量 supply[i] 随行进距离逐步消耗。更新公式为:上一轮供给量 × (1.0 - omega × journeyRatio)。参数 omega 控制供给消耗速率。omega 越大、行进比例 journeyRatio 越高(算法迭代越深入),供给消耗速度越快。

    骆驼的耐力 endurance[i] 同时受温度与行进距离影响而衰减。更新公式为:上一代耐力值 × (1.0 - temperatureRatio) × (1.0 - journeyRatio)。其中 temperatureRatio 为骆驼当前温度与最高温度 Tmax 的比值。温度越高、算法迭代越深入,耐力衰减越明显。

    综上,该方法通过随机变量(温度)与算法进度信息(行进距离),动态调整每只骆驼的状态特征。这些变化直接决定骆驼在搜索空间中的探索行为模式。

    //+----------------------------------------------------------------------------+
    //| Update factors (temperature, supply, endurance)                            |
    //+----------------------------------------------------------------------------+
    void C_AO_CAm::UpdateFactors ()
    {
      double journeyRatio = (double)traveledSteps / (double)totalSteps;
    
      for (int i = 0; i < popSize; i++)
      {
        // Temperature update - random value in the [Tmin, Tmax] range,
        // equation (1): Tnow = (Tmax - Tmin) * Rand(0,1) + Tmin
        temperature [i] = u.RNDfromCI (Tmin, Tmax);
    
        // Supply update - decreases over time,
        // equation (2): Snow = Spast * (1 - ω * Traveled steps / Total journey steps)
        supply [i] = supply [i] * (1.0 - omega * journeyRatio);
    
        // Endurance update depends on temperature and time,
        // equation (4): Enow = Epast * (1 - Tnow/Tmax) * (1 - Traveled steps / Total journey steps)
        double temperatureRatio = temperature [i] / Tmax;
        endurance [i] = endurance [i] * (1.0 - temperatureRatio) * (1.0 - journeyRatio);
      }
    }
    //——————————————————————————————————————————————————————————————————————————————
    

    UpdatePositions 方法用于在优化算法的每一步迭代中更新骆驼的位置。该方法模拟影响位置更新的移动行为与随机事件。

    该方法的核心流程是遍历整个骆驼种群。对每只骆驼执行以下步骤:

    1. 在一定概率下(例如遭遇流沙、风暴、高温等恶劣环境),骆驼会被判定为 “消亡”。此时,会在有效搜索范围内重新随机生成其空间位置,并按照最小步长进行修正。

    2. 若骆驼未 “消亡”,则通过随机游走模型确定其新位置。对每一维坐标,生成区间在 [-1, 1] 内的随机系数 delta,以模拟随机扰动。

    3. 新坐标的计算方式为:在旧坐标基础上叠加修正项,修正项综合考虑随机游走、骆驼当前状态(耐力与供给)、当前坐标与绿洲位置的差值。计算过程中会引入 “耐力” 与 “资源供给” 的影响权重。

    4. 新坐标计算完成后,会检查其是否超出有效范围。

    通过该流程,骆驼的位置实现动态更新,模拟其在搜索空间中的移动过程,同时兼顾随机因素与自身状态(耐力、供给)。这种位置更新机制能够提升算法对解空间的探索效率,避免陷入局部最优,并助力寻找全局最优解。 

    原始版本中关于骆驼 “消亡” 与位置重新生成的注释代码,在当前改进版算法中已不再使用。 

    改进版的核心变更:骆驼 “消亡” 的判断现在针对每一维坐标单独执行,而非对整只骆驼统一判断;不再完全随机生成新位置,而是通过 GaussDistribution 函数,以全局最优解为中心采用高斯分布生成新位置,使算法能够更精准地探索潜力区域。

    //+----------------------------------------------------------------------------+
    //| Update camel positions                                                     |
    //+----------------------------------------------------------------------------+
    void C_AO_CAm::UpdatePositions ()
    {
      for (int i = 0; i < popSize; i++)
      {
        /*
        // Checking for camel "death" (quicksand, storm, etc.)
        if (u.RNDprobab () < dyingRate)
        {
          // Generate a new position randomly
          for (int c = 0; c < coords; c++)
          {
            a [i].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]);
            a [i].c [c] = u.SeInDiSp (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
          }
          continue;
        }
        */
    
        // Updating position-------------------------------------------------------
        double delta = u.RNDfromCI (-1.0, 1.0); // Random walk factor
    
        // Update each coordinate
        for (int c = 0; c < coords; c++)
        {
          /*
          // Apply the update equation from the article
          double enduranceFactor = (1.0 - endurance [i] / initialEndurance);
          double supplyFactor    = MathExp (1.0 - supply [i] / initialSupply);
    
          // Update position
          a [i].c [c] = a [i].c [c] + delta * enduranceFactor * supplyFactor * (cB [c] - a [i].c [c]);
    
          // Check for out-of-bounds and adjust to acceptable value
          a [i].c [c] = u.SeInDiSp (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
          */
    
          // Checking for camel "death" (quicksand, storm, etc.)
          if (u.RNDprobab () < dyingRate)
          {
            // Generate a new position relative to the oasis coordinate using a normal distribution
            a [i].c [c] = u.GaussDistribution (cB [c], rangeMin [c], rangeMax [c], 8);
          }
          else
          {
            // Apply the update equation from the article
            double enduranceFactor = (1.0 - endurance [i] / initialEndurance);
            double supplyFactor    = MathExp (1.0 - supply [i] / initialSupply);
    
            // Update position
            a [i].c [c] = a [i].c [c] + delta * enduranceFactor * supplyFactor * (cB [c] - a [i].c [c]);
          }
    
          // Check for out-of-bounds and adjust to acceptable value
          a [i].c [c] = u.SeInDiSp (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
        }
      }
    }
    //——————————————————————————————————————————————————————————————————————————————
    

    ApplyOasisEffect 方法用于模拟搜索过程中绿洲效应对骆驼状态的影响。该方法的核心任务是:判断骆驼是否发现绿洲,并据此恢复其资源状态。

    方法遍历整个种群,对每只骆驼校验两个条件。第一个条件是发现绿洲的概率,由随机数决定,并受参数 alpha 控制。alpha 数值越大,发现绿洲的概率越高。第二个条件是检查骆驼当前适应度函数值(解的质量)是否优于上一代迭代。这确保只有实际找到更优解的骆驼才能触发绿洲效应。

    若两个条件同时满足,则判定该骆驼发现了绿洲。此时,骆驼的供给量与耐力将重置为初始值。因此,绿洲效应可恢复骆驼的资源,使其能以更高效率继续主动探索搜索空间。

    该方法的整体设计思想是:模拟骆驼寻找绿洲的自然行为,使其得以恢复体力、持续搜索,从而提升找到全局最优解的概率。

    //+----------------------------------------------------------------------------+
    //| Apply the oasis effect (refresh supply and endurance)                      |
    //+----------------------------------------------------------------------------+
    void C_AO_CAm::ApplyOasisEffect ()
    {
      for (int i = 0; i < popSize; i++)
      {
        // Oasis detection condition:
        // 1) The camel should "see" the oasis (random probability depending on 'alpha')
        // 2) The current solution should be better than the previous iteration
    
        if (u.RNDprobab () > (1.0 - alpha) && a [i].f > a [i].fP)
        {
          // Oasis discovered, replenish supply and endurance
          supply    [i] = initialSupply;
          endurance [i] = initialEndurance;
        }
      }
    }
    //——————————————————————————————————————————————————————————————————————————————
    


    测试结果

    可以看出,运行原始版本骆驼算法(CA)时,其最高得分仅为 32.56%。

    CA|骆驼算法|50.0|50.0|100.0|0.8|0.1|0.5|
    =============================
    5 Hilly's;函数运行次数:10000;结果:0.5872886802671936
    25 Hilly's;函数运行次数:10000;结果0.3896531310299016
    500 Hilly's;函数运行次数:10000;结果:0.3412707468979892
    =============================
    5 Forest's;函数运行次数:10000;结果:0.5248302942062708
    25 Forest's;函数运行次数:10000;结果:0.2760893244414008
    500 Forest's;函数运行次数:10000;结果:0.18881523788478266
    =============================
    5 Megacity's;函数运行次数:10000;结果:0.3507692307692308
    25 Megacity's;函数运行次数:10000;结果:0.16676923076923078
    500 Megacity's;函数运行次数:10000;结果:0.10464615384615475
    =============================
    总得分:2.93013 (32.56%)

    改进后的算法表现出更优效果:

    CAm|改进的骆驼算法|50.0|50.0|100.0|0.8|0.01|0.9|
    =============================
    5 Hilly's;函数运行次数:10000;结果:0.786842172387197
    25 Hilly's;函数运行次数:10000;结果:0.560421361070792
    500 Hilly's;函数运行次数:10000;结果:0.3513297097198401
    =============================
    5 Forest's;函数运行次数:10000;结果:0.8277193604225209
    25 Forest's;函数运行次数:10000;结果:0.5604138230149972
    500 Forest's;函数运行次数:10000;结果:0.24335977579892912
    =============================
    5 Megacity's;函数运行次数:10000;结果:0.6484615384615386
    25 Megacity's;函数运行次数:10000;结果: 0.33092307692307693
    500 Megacity's;函数运行次数:10000;结果:0.13417692307692433
    =============================
    总得分:4.44365 (49.37%)

    为清晰区分两种算法的差异,本文展示了原始骆驼算法 CA与改进骆驼算法 CAm的运行过程可视化效果图。两种算法均体现出骆驼算法固有寻优特征:个体在潜在较优解附近呈现聚集收敛现象。

    Hilly

    CA算法在Hilly函数上的测试表现

      Hilly

    优化后的CA算法在Hilly函数上的测试表现

    Forest

    CA算法Forest函数上的测试表现

        Forest

    优化后的CA算法Forest函数上的测试表现

    Megacity

    CA算法Megacity函数上的测试表现

    Megacity

    优化后的CA算法Megacity函数上的测试表现

    改进版算法在种群优化算法榜单中位列第 35 名。原版算法仅作参考展示,未参与排名。

    # 算法 说明 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 FBA 基于分形的算法 0.79000 0.65134 0.28965 1.73099 0.87158 0.56823 0.18877 1.62858 0.61077 0.46062 0.12398 1.19537 4.555 50.61
    30 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
    31 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
    32 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
    33 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
    34 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
    35 CAm 骆驼算法 M 0.78684 0.56042 0.35133 1.69859 0.82772 0.56041 0.24336 1.63149 0.64846 0.33092 0.13418 1.11356 4.444 49.37
    36 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
    37 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
    38 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
    39 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
    40 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
    41 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
    42 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
    43 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
    44 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
    45 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
    CA camel algorithm 0.58729 0.38965 0.34127 1.31821 0.52483 0.27609 0.18882 0.98974 0.35077 0.16677 0.10465 0.62219 2.930 32.56
    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


    总结

    得益于多项核心优化,改进型骆驼算法 CAm 相较原版算法性能提升十分显著。

    首先,算法彻底重构了骆驼 “消亡” 机制:摒弃完全随机生成新解的方式,改为围绕已寻得的最优解采用高斯分布生成新个体,实现对优质搜索区域的定向深度挖掘。

    通过保留每只骆驼的历史适应度数值,精准追踪解的质量改善情况,使绿洲效应的触发判定更加严谨合理。将最低温度参数纳入可调范围,并增设外部参数控制总迭代步数,进一步提升算法灵活度,使改进算法能够更好适配各类优化问题。

    综上,以上改进大幅提升了该算法在收敛速度、求解精度与运行稳定性三方面的综合性能。

    图表

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

    图表

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

    CAm 算法的优缺点:

    优点:

    1. 速度快。
    2. 实现简单。
    3. 在中高维度测试函数上表现优异,尤其适用于平滑型优化问题。

    缺点:

    1. 大量的外部参数。
    2. 在低维函数上,算法的结果呈现出较大的离散性。

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


    文中所用程序

    # 名称 类型 说明
    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_CAm.mq5
    脚本 CAm测试台

    本文由MetaQuotes Ltd译自俄文
    原文地址: https://www.mql5.com/ru/articles/18057

    附加的文件 |
    CA.zip (213.16 KB)
    交易策略 交易策略
    各种交易策略的分类都是任意的,下面这种分类强调从交易的基本概念上分类。
    基于分形的算法(FBA) 基于分形的算法(FBA)
    本文提出了一种新型元启发式算法,该算法基于分形思想对搜索空间进行划分,以求解优化问题。该算法通过逐步识别并分离有前景的区域,构建出自相似的分形结构,从而将计算资源集中到最有前景的搜索区域。其独特的、面向更优解的变异机制,有助于在搜索空间的全局探索与局部开发之间取得良好的平衡,显著提升了算法效率。
    新手在交易中的10个基本错误 新手在交易中的10个基本错误
    新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
    神经网络在交易中的应用:混合图序列模型(GSM++) 神经网络在交易中的应用:混合图序列模型(GSM++)
    混合图序列模型(GSM++)结合了不同架构的优点,能够提供高保真度的数据分析,并优化计算成本。这些模型可高效适配动态市场数据,进而优化金融信息的展示与处理流程。