注:该算法已按照智能优化算法APP标准格式进行整改,可直接集成到APP中,方便大家与自己的算法进行对比。
云漂移优化算法(Cloud Drift Optimization Algorithm, CDO)的灵感源自天空中云团的灵动变幻。那些在大气力作用下悠然漂移、聚散自如的云粒子,藏着探索与开发的精妙平衡 —— 既会随风远行探索未知空域,又能在特定区域汇聚深耕。科研人员从中汲取智慧,将云的动态特性转化为独特的优化逻辑:通过自适应权重调整模拟云的实时漂移行为,借概率性移动策略在搜索空间中灵活穿梭。这种模拟自然的算法,正以高效的导航能力和稳健的性能,在复杂优化问题中展现出独特优势。
该成果于2025年8月最新发表于计算机领域期刊Discover Computing,出显著的应用潜力。
1 算法原理详解
(1)算法初始化
在初始阶段,算法通过在搜索空间中随机设定 个候选解(云),以实现对整个搜索域的无偏覆盖:
其中 表示在区间 [0, 1] 上的均匀随机分布。该步骤模拟了天空中云粒子的随机初始分布,其初始位置未知且呈离散分布。
(2)权重自适应
每个云(或粒子)根据其相对于群体中其他粒子的适应度值被赋予一个动态权重。该权重决定了粒子受到自身位置及其他粒子位置影响的强度。每个云的权重依据适应度函数进行更新:
其中 表示迄今为止找到的最优适应度值。 ,其中 为所有云中的最差适应度值, 为避免除零而引入的极小常数。该权重自适应机制使算法能够更多地关注适应度较优的粒子,同时允许适应度较差的粒子探索新的区域。在自适应权重更新公式中取值 0.3 与 0.7,系通过大量实证调参获得,其作用是控制缩放因子在区间 [0.3, 1.0] 内变化,从而在保持群体多样性的同时,自适应地平衡探索与开发过程。
该方法模拟了云的自然行为,即主要的大气力会作用于其邻近的粒子。从数学角度来看,这类似于进化算法中常见的基于适应度比例的选择机制。通过持续调整权重,CDO 能够避免过早收敛,并在后期阶段仍保持有效的探索能力。
(3)开发阶段:局部优化
在该阶段,云体逐步向迄今为止找到的最优解(即全局最优位置)移动。其位置更新方程为:
其中 表示在迭代 时刻已知的最优解, 表示一个受因子 影响的小随机调整,该因子用于控制开发程度。此精炼行为模拟了云在初始运动后逐渐调整形态的过程,即基于邻近最优解不断修正其位置。
(4)探索阶段:全局搜索
在探索环节中,算法通过允许云在搜索空间内的随机运动来实现种群多样性,以避免陷入局部最优:
其中 表示影响粒子运动的另一随机因子。参数 随时间递减,使算法逐步从探索阶段过渡到开发阶段。该阶段模拟了大气中云的随机漂移,确保算法通过鼓励探索新区域来避免陷入局部最优。该策略源于不可预测的大气条件下云的随机漂移行为,使得即便表现较差的粒子也有机会探索新的区域,这对于跳出局部最优至关重要。通过引入随机参考点,算法能够促进种群多样性,避免停滞,并在多峰优化场景下提升鲁棒性。
(5)随机扰动机制
为了避免算法过早陷入收敛,并在后期阶段保持探索特性,部分云可能会被随机重置。其发生概率为 ,且该概率会随着算法运行逐步降低:
该随机化机制模拟了大气条件的不可预测变化,这些变化可能改变漂移云的运动轨迹,从而确保即使在算法后期仍能继续搜索。此技术类似于模拟退火或遗传算法中的变异操作。通过引入偶尔的大幅扰动,算法能够保持跳出局部最优的能力,并有效优化全局解。
下图展示了一个概念性框架,说明了云体与目标区域之间的相互作用。图中揭示了云群内部的基本交互和修正行为,并强调了三种关键作用力:吸引力:当云体处于一定距离时,会相互吸引,促使它们靠拢;排斥力:当云体过于接近时,排斥力会将它们分开,防止过度拥挤,并保证搜索空间的有效探索;目标区:表示云体试图到达的目标区域。吸引力与排斥力的相互作用引导云群向该最优区域靠近。图中显示了吸引力与排斥力如何在探索(发现新区域)与利用(集中于有潜力的区域)之间实现平衡,使云群能够高效收敛至最佳解。
所提出的CDO算法的完整流程如下图所示。
2 结果展示





3、MATLAB核心代码
%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 云漂移优化算法(Cloud Drift Optimization Algorithm, CDO)
function [Best_fitness, Best_position, Convergence_curve] = CDO(N, Max_iter, lb, ub, dim, fobj)
disp('Enhanced Cloud Drift Optimization (CDO) is optimizing your problem');
% Initialization
Best_position = zeros(1, dim);
Best_fitness = inf;
AllFitness = inf * ones(N, 1);
weight = ones(N, dim);
X = initialization(N, dim, ub, lb);
Convergence_curve = zeros(1, Max_iter);
it = 1;
search_history = X;
% Algorithm parameters
z = 0.005; % Initial probability of random movement
StoppingThreshold = 1e-300; % Lower stopping threshold for higher precision
while it <= Max_iter
% Evaluate objective function for each solution
for i = 1:N
X(i, :) = min(max(X(i, :), lb), ub); % Keep solutions within bounds
AllFitness(i) = fobj(X(i, :));
end
% Sort solutions based on fitness values
[SmellOrder, SmellIndex] = sort(AllFitness);
bestFitness = SmellOrder(1);
worstFitness = SmellOrder(N);
S = bestFitness - worstFitness + eps;
% Update weights dynamically
for i = 1:N
for j = 1:dim
if i <= (N / 2)
weight(SmellIndex(i), j) = 1 + (0.3 + 0.7 * rand()) * log10((bestFitness - SmellOrder(i)) / S + 1);
else
weight(SmellIndex(i), j) = 1 - (0.3 + 0.7 * rand()) * log10((SmellOrder(i) - bestFitness) / S + 1);
end
end
end
% Update the best solution found so far
if bestFitness < Best_fitness
Best_position = X(SmellIndex(1), :);
Best_fitness = bestFitness;
end
% Stop early if precision target is reached
if Best_fitness < StoppingThreshold
disp(['Converged at iteration ', num2str(it)]);
break;
end
% Adjust control parameters dynamically
a = atanh(-it / Max_iter + 1);
b = 1 - it / Max_iter;
z = 0.002 + 0.003 * (1 - it / Max_iter); % Reduce random jumps over iterations
% Update particle positions
for i = 1:N
if rand < z
% Random reinitialization of some solutions
X(i, :) = min(max((ub - lb) .* rand(1, dim) + lb, lb), ub);
else
p = tanh(abs(AllFitness(i) - Best_fitness));
vb = unifrnd(-0.2 * a, 0.2 * a, 1, dim);
vc = unifrnd(-0.2 * b, 0.2 * b, 1, dim);
for j = 1:dim
r = rand();
A = randi([1, N]);
B = randi([1, N]);
if r < p
% Exploitation phase
X(i, j) = Best_position(j) + 0.8 * vb(j) * (weight(i, j) * X(A, j) - X(B, j));
else
% Exploration phase
X(i, j) = vc(j) * X(i, j);
end
% Fine-tuning in the final iterations
if it > 0.9 * Max_iter
X(i, j) = X(i, j) * (1 - 1e-12 * randn());
end
end
end
X(i, :) = min(max(X(i, :), lb), ub);
end
% Store convergence data
Convergence_curve(it) = Best_fitness;
it = it + 1;
end
end
参考文献
[1] Alibabaei Shahraki, M. Cloud drift optimization algorithm as a nature-inspired metaheuristic. Discov Computing 28, 173 (2025). https://doi.org/10.1007/s10791-025-09671-6.
完整代码获取
2万+

被折叠的 条评论
为什么被折叠?



