一、云漂移优化算法
云漂移优化(Cloud Drift Optimization,CDO)算法是2025年提出的一种受自然现象启发的元启发式算法,它模拟云在大气中漂移的动态行为来解决复杂的优化问题。云在大气中受到各种大气力的影响,其粒子的运动具有一定的随机性和规律性,CDO算法正是基于这种特性,通过模拟云粒子的运动来在优化问题的解空间中进行搜索。
以下是云漂移优化算法(Cloud Drift Optimization, CDO)的详细介绍:
算法操作步骤
- 初始化:首先在解空间中随机初始化一群“云粒子”,每个粒子代表一个潜在的解。
- 适应度评估:计算每个粒子的适应度值,以评估其作为解的质量。
- 更新最优解:根据粒子的适应度值,更新群体的最优解(全局最优)和每个粒子的个体最优解。
- 自适应权重调整:CDO算法引入了自适应权重调整机制,根据优化过程的进展动态调整权重参数,以平衡探索(exploration)和开发(exploitation)之间的关系。在优化初期,权重较大,粒子在解空间中具有较大的随机性,有利于全局搜索;随着优化的进行,权重逐渐减小,粒子的运动更加趋向于当前最优解,有利于局部搜索。
- 位置更新:根据粒子的速度和方向,结合权重参数,更新粒子的位置,模拟云粒子在大气中的漂移运动。粒子的速度更新通常受到个体最优解和全局最优解的引导,同时加入随机因素以保持一定的探索能力。
- 循环迭代:重复步骤2至5,直到满足预设的终止条件,如最大迭代次数或适应度精度要求。
- 输出结果:最终输出群体的最优解作为优化问题的近似最优解。
算法优势
- 探索与开发的平衡:通过自适应权重调整机制,CDO算法能够在优化过程中动态地在全局搜索和局部搜索之间切换,避免了过早收敛到局部最优解,提高了寻找全局最优解的能力。
- 较强的鲁棒性:算法对初始参数的选择不敏感,具有较好的稳定性和适应性,能够在不同类型的优化问题中取得较好的效果。
- 高效的收敛速度:利用云粒子的群体智慧和协同搜索,CDO算法能够在相对较短的迭代次数内快速收敛到较优解,节省计算资源和时间。
- 适用范围广:不仅适用于连续空间的优化问题,还可以通过适当的离散化处理应用于离散优化问题。
参考文献:
[1]Mohammad Alibabaei Shahrak.Cloud Drift Optimization (CDO) Algorithm: A Nature-Inspired Metaheuristic,2025.
二、23个函数介绍
参考文献:
[1] Yao X, Liu Y, Lin G M. Evolutionary programming made faster[J]. IEEE transactions on evolutionary computation, 1999, 3(2):82-102.
三、部分代码及结果
clear;
clc;
close all;
warning off all;
SearchAgents_no=50; %Number of search solutions
Max_iteration=500; %Maximum number of iterations
Func_name='F1'; % Name of the test function
% Load details of the selected benchmark function
[lb,ub,dim,fobj]=Get_F(Func_name);
tic;
[Best_score,Best_pos,cg_curve]=(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
tend=toc;
% figure('Position',[500 500 901 345])
%Draw search space
subplot(1,2,1);
func_plot(Func_name);
title('Parameter space')
xlabel('x_1');
ylabel('x_2');
zlabel([Func_name,'( x_1 , x_2 )'])
%Draw objective space
subplot(1,2,2);
semilogy(cg_curve,'Color','m',LineWidth=2.5)
title(Func_name)
% title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
axis tight
grid on
box on
legend('')
display(['The running time is:', num2str(tend)]);
display(['The best fitness is:', num2str(Best_score)]);
display(['The best position is: ', num2str(Best_pos)]);