骆驼算法(CA)
内容
引言
近几十年来,大量受自然现象与生物行为启发的优化算法不断涌现。这类生物启发式算法在众多任务中均表现出优异效果。本文将介绍一种全新的优化算法 ——骆驼算法(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 方法实现算法的迭代流程,负责更新骆驼的状态与位置移动。首先,方法会检查是否完成首次迭代;若未完成,则初始化骆驼种群,并标记初始化完成。
在后续每一步迭代中,已完成步数计数器加一,随后依次执行以下操作:
- 更新温度、供给量、耐力等状态参数,这对模拟算法动态搜索行为至关重要。
- 更新骆驼在搜索空间中的位置,即朝着可能提升解质量的方向移动。
- 应用绿洲效应:骆驼可补充供给、恢复耐力,有助于避免算法陷入局部最优,并推动搜索空间的深度探索。
每一步迭代结束时,保存每只骆驼的适应度函数值,用于对比当前状态与历史状态,并据此执行后续决策。
//+----------------------------------------------------------------------------+ //| 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),则执行更新:
- 将新的最优适应度值赋值给 fB。
- 将达成最优值的骆驼位置(坐标、参数)从当前最优骆驼的坐标数组(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, 1] 内的随机系数 delta,以模拟随机扰动。
-
新坐标的计算方式为:在旧坐标基础上叠加修正项,修正项综合考虑随机游走、骆驼当前状态(耐力与供给)、当前坐标与绿洲位置的差值。计算过程中会引入 “耐力” 与 “资源供给” 的影响权重。
-
新坐标计算完成后,会检查其是否超出有效范围。
通过该流程,骆驼的位置实现动态更新,模拟其在搜索空间中的移动过程,同时兼顾随机因素与自身状态(耐力、供给)。这种位置更新机制能够提升算法对解空间的探索效率,避免陷入局部最优,并助力寻找全局最优解。
原始版本中关于骆驼 “消亡” 与位置重新生成的注释代码,在当前改进版算法中已不再使用。
改进版的核心变更:骆驼 “消亡” 的判断现在针对每一维坐标单独执行,而非对整只骆驼统一判断;不再完全随机生成新位置,而是通过 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%。
=============================
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的运行过程可视化效果图。两种算法均体现出骆驼算法固有寻优特征:个体在潜在较优解附近呈现聚集收敛现象。

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

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

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

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

CA算法在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 | #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
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
基于分形的算法(FBA)
新手在交易中的10个基本错误
神经网络在交易中的应用:混合图序列模型(GSM++)