1 简介
正弦余弦算法( sine cosine algorithm,SCA) 是由澳大利亚学者 Mirjalili于 2016 年提出的一种新型群体智能优化算法。本文提出一种改进的正弦余弦算法(简记为ISCA).受粒子群优化(PSO)算法的启发,引入惯性权重以提高正弦余弦算法的收敛精度和加快收敛速度.此外,采取反向学习策略产生初始个体以提高种群的多样性和解的质量.采用八个高维基准测试函数进行仿真实验:在相同的最大适应度函数评价次数下,ISCA总体性能上均优于基本SCA和HGWO算法;当维数较高(D=1 000)时,ISCA所用计算量远小于HDEOO算法.实验结果表明ISCA在收敛精度和收敛速度指标上均优于对比算法.
2 部分代码
%% 清除环境变量
clear
clc
%% 参数设置
N = 50; % 种群规模
Function_name = 'F1'; % 从F1到F23的测试函数的名称(本文中的表1、2、3)
Max_iteration = 1000; % 最大迭代次数
% 加载所选基准函数的详细信息
[lb, ub, fobj] = Get_Functions_details(Function_name);
cnt_max = 30;
Curve_ISCA_100 = zeros(1, Max_iteration);
Curve_ISCA_500 = zeros(1, Max_iteration);
Curve_ISCA_1000 = zeros(1, Max_iteration);
for cnt = 1:cnt_max
% 初始化种群位置
% 100维
dim = 100;
X1 = initialization(N, dim, ub, lb);
[ISCA_Best_score_100(cnt), ISCA_Best_pos_100(cnt, :), ISCA_Curve_100] = ISCA(X1, N, Max_iteration, lb, ub, dim, fobj);
% 500维
dim = 500;
X2 = initialization(N, dim, ub, lb);
[ISCA_Best_score_500(cnt), ISCA_Best_pos_500(cnt, :), ISCA_Curve_500] = ISCA(X2, N, Max_iteration, lb, ub, dim, fobj);
% 1000维
dim = 1000;
X3 = initialization(N, dim, ub, lb);
[ISCA_Best_score_1000(cnt), ISCA_Best_pos_1000(cnt, :), ISCA_Curve_1000] = ISCA(X3, N, Max_iteration, lb, ub, dim, fobj);
Curve_ISCA_100 = Curve_ISCA_100+ISCA_Curve_100;
Curve_ISCA_500 = Curve_ISCA_500+ISCA_Curve_500;
Curve_ISCA_1000 = Curve_ISCA_1000+ISCA_Curve_1000;
end
Curve_ISCA_100 = Curve_ISCA_100/cnt_max;
Curve_ISCA_500 = Curve_ISCA_500/cnt_max;
Curve_ISCA_1000 = Curve_ISCA_1000/cnt_max;
std_isca_100 = std(ISCA_Best_score_100);
std_isca_500 = std(ISCA_Best_score_500);
std_isca_1000 = std(ISCA_Best_score_1000);
best_isca_100 = min(ISCA_Best_score_100);
best_isca_500 = min(ISCA_Best_score_500);
best_isca_1000 = min(ISCA_Best_score_1000);
worst_isca_100 = max(ISCA_Best_score_100);
worst_isca_500 = max(ISCA_Best_score_500);
worst_isca_1000 = max(ISCA_Best_score_1000);
mean_isca_100 = mean(ISCA_Best_score_100);
mean_isca_500 = mean(ISCA_Best_score_500);
mean_isca_1000 = mean(ISCA_Best_score_1000);
%% 画图
% % 1、画出所选基准函数的三维立体图形
figure;
func_plot(Function_name);
title(Function_name)
xlabel('x_1');
ylabel('x_2');
zlabel([Function_name,'( x_1 , x_2 )'])
img =gcf; %获取当前画图的句柄
print(img, '-dpng', '-r600', './运行结果.png') %即可得到对应格式和期望dpi的图像
% 2、画出目标函数值变化曲线图
figure;
t = 1:Max_iteration;
semilogy(t, Curve_ISCA_100, 'bo-', t, Curve_ISCA_500, 'ms-', t, Curve_ISCA_1000, 'rd-',...
'linewidth', 1.5, 'markersize', 8, 'MarkerIndices', 1:50:Max_iteration);
title(Function_name)
xlabel('迭代次数');
ylabel('平均值');
axis tight
grid on
box on
legend('D=100', 'D=500', 'D=1000');
img =gcf; %获取当前画图的句柄
print(img, '-dpng', '-r600', './运行结果2.png') %即可得到对应格式和期望dpi的图像
3 仿真结果
4 参考文献
[1]徐松金, & 龙文. (2018). 求解高维优化问题的改进正弦余弦算法. 计算机应用研究, 35(09), 20-23.
5 MATLAB代码与数据下载地址
见博客主页