【优化求解-单目标求解】基于具有扰动机制和强化莱维飞行的蝗虫优化算法实现目标求解matlab代码

1 简介

针对蝗虫优化算法(Grasshopper Optimization Algorithm, GOA)存在求解精度低,收敛速度慢等问题,提出具有扰动机制和强化莱维飞行的蝗虫优化算法(DLGOA),位置参数部分使用非线性曲线函数去平衡算法局部开发和全局探索;扰动因子引入位置更新公式,提高算法寻优精度、收敛速度;将莱维飞行的步长改进以避免陷入局部最优,并利用高斯分布的随机性增加种群多样性。通过对 7 个基准函数进行仿真实验以及使用 Wilcoxon 秩和检验来评价算法性能,实验结果表明DLGOA 算法具有较好的鲁棒性以及寻优精度,且明显提升了收敛速度。

蝗虫优化算法(Grasshopper Optimization Algorithm, GOA)在2017年被Saremi等人首次提出。GOA原理易懂、参数较少,易于实现。然而该算法收敛速度慢,容易收敛早熟,虽然具有强大的局部开发能力,但全局勘探的能力仍然有待提升。为了解决这些问题,在2019年文献[2]提出了一种基于动态权重机制和随机跳跃策略(DJGOA)的改进蝗虫优化算法,首先动态权重机制促进了算法迭代的利用,自适应调整蝗虫的搜索空间范围;随后使用随机跳跃策略有助于算法跳出局部最优。李洋洲等在2019年对参数c使用两种曲线自适应改进策略,这种基于曲线自适应和 模 拟 退 火的蝗虫 优 化 算 法(SA-CAGOA),在求解精度方面有了明显改进。然而以上所引文献仍存在收敛速度慢、寻优精度有待优化的问题,本文提出一种具有扰动机制和双重搜索能力莱维飞行的蝗虫改进算法(DLGOA)。首先,提出动态自适应曲线的函数取代原本线性递减的参数c,使全局搜索和局部开发得到更好的平衡;其次,设置扰动因子改变位置更新步长,算法的寻优精度以及收敛速度均被有效提升;最后,引入带有双重搜索功能并具有高斯随机分布的约束因子动态步长的莱维飞行机制,不仅有效避免算法出现早熟收敛现象,并且增加了种群多样性,与此同时提高了寻优精度。

【优化求解-单目标求解】基于具有扰动机制和强化莱维飞行的蝗虫优化算法实现目标求解matlab代码_第1张图片

【优化求解-单目标求解】基于具有扰动机制和强化莱维飞行的蝗虫优化算法实现目标求解matlab代码_第2张图片

【优化求解-单目标求解】基于具有扰动机制和强化莱维飞行的蝗虫优化算法实现目标求解matlab代码_第3张图片

【优化求解-单目标求解】基于具有扰动机制和强化莱维飞行的蝗虫优化算法实现目标求解matlab代码_第4张图片

【优化求解-单目标求解】基于具有扰动机制和强化莱维飞行的蝗虫优化算法实现目标求解matlab代码_第5张图片

2 部分代码

%% 清除环境变量

clear 

clc

%% 参数设置

N = 30;             % 种群规模

Function_name = 'F1';         % 从F1到F23的测试函数的名称(本文中的表1、2、3)

Max_iteration = 500;           % 最大迭代次数

cnt_max = 30;

% 加载所选基准函数的详细信息

[lb, ub, dim, fobj] = Get_Functions_details(Function_name);

Curve_DLGOA = zeros(1, Max_iteration);

Curve_GOA = zeros(1, Max_iteration);

Curve_GWO = zeros(1, Max_iteration);

Curve_ALO = zeros(1, Max_iteration);

Curve_SSA = zeros(1, Max_iteration);

for cnt = 1:cnt_max

    % 初始化种群位置

    X = initialization(N, dim, ub, lb);

    

    [DLGOA_Best_score(cnt), DLGOA_Best_pos(cnt, :), DLGOA_Curve] = DLGOA(N, Max_iteration, lb, ub, dim, fobj);

    [GOA_Best_score(cnt), GOA_Best_pos(cnt, :), GOA_Curve] = GOA(N, Max_iteration, lb, ub, dim, fobj);

    [GWO_Best_score(cnt), GWO_Best_pos(cnt, :), GWO_Curve] = GWO(X, N, Max_iteration, lb, ub, dim, fobj);

    [ALO_Best_score(cnt), ALO_Best_pos(cnt, :), ALO_Curve] = ALO(N, Max_iteration, lb, ub, dim, fobj);

    [SSA_Best_score(cnt), SSA_Best_pos(cnt, :), SSA_Curve] = SSA(X, N, Max_iteration, lb, ub, dim, fobj);

   

    Curve_DLGOA = Curve_DLGOA+DLGOA_Curve;

    Curve_GOA = Curve_GOA+GOA_Curve;

    Curve_GWO = Curve_GWO+GWO_Curve;

    Curve_ALO = Curve_ALO+ALO_Curve;

    Curve_SSA = Curve_SSA+SSA_Curve;

    

end

Curve_DLGOA = Curve_DLGOA/cnt_max;

Curve_GOA = Curve_GOA/cnt_max;

Curve_GWO = Curve_GWO/cnt_max;

Curve_ALO = Curve_ALO/cnt_max;

Curve_SSA = Curve_SSA/cnt_max;

std_DLGOA = std(DLGOA_Best_score);

std_GOA = std(GOA_Best_score);

std_GWO = std(GWO_Best_score);

std_ALO = std(ALO_Best_score);

std_SSA = std(SSA_Best_score);

best_DLGOA = max(DLGOA_Best_score);

best_GOA = max(GOA_Best_score);

best_GWO = max(GWO_Best_score);

best_ALO = max(ALO_Best_score);

best_SSA = max(SSA_Best_score);

worst_DLGOA = min(DLGOA_Best_score);

worst_GOA = min(GOA_Best_score);

worst_GWO = min(GWO_Best_score);

worst_ALO = min(ALO_Best_score);

worst_SSA = min(SSA_Best_score);

mean_DLGOA = mean(DLGOA_Best_score);

mean_GOA = mean(GOA_Best_score);

mean_GWO = mean(GWO_Best_score);

mean_ALO = mean(ALO_Best_score);

mean_SSA = mean(SSA_Best_score);

%% 画图

% 1、画出所选基准函数的三维立体图形

figure;

func_plot(Function_name);

title(Function_name)

xlabel('x_1');

ylabel('x_2');

zlabel([Function_name,'( x_1 , x_2 )'])

% 2、画出目标函数值变化曲线图

figure;

t = 1:Max_iteration;

semilogy(t, Curve_DLGOA, 'rd-', t, Curve_GOA, 'm^-', t, Curve_GWO, 'bo-', t, Curve_ALO, 'gs-', t, Curve_SSA, 'kx-', ...

    'linewidth', 1.5, 'MarkerSize', 8, 'MarkerIndices', 1:15:Max_iteration);

title(Function_name)

xlabel('Iteration');

ylabel('Fitness');

axis fill

grid on

box on

legend('DLGOA', 'GOA', 'GWO', 'ALO', 'SSA');

%% 显示结果

disp(['函数:', num2str(Function_name)]);

disp(['DLGOA:最大值: ', num2str(best_DLGOA), ',最小值:', num2str(worst_DLGOA), ',平均值:', num2str(mean_DLGOA), ',标准差:', num2str(std_DLGOA)]);

disp(['GOA:最大值: ', num2str(best_GOA), ',最小值:', num2str(worst_GOA), ',平均值:', num2str(mean_GOA), ',标准差:', num2str(std_GOA)]);

disp(['GWO:最大值: ', num2str(best_GWO), ',最小值:', num2str(worst_GWO), ',平均值:', num2str(mean_GWO), ',标准差:', num2str(std_GWO)]);

disp(['ALO:最大值: ', num2str(best_ALO), ',最小值:', num2str(worst_ALO), ',平均值:', num2str(mean_ALO), ',标准差:', num2str(std_ALO)]);

disp(['SSA:最大值: ', num2str(best_SSA), ',最小值:', num2str(worst_SSA), ',平均值:', num2str(mean_SSA), ',标准差:', num2str(std_SSA)]);

3 仿真结果

【优化求解-单目标求解】基于具有扰动机制和强化莱维飞行的蝗虫优化算法实现目标求解matlab代码_第6张图片

4 参考文献

[1]赵然, 郭志川, and 朱小勇. "一种基于Levy飞行的改进蝗虫优化算法." 计算机与现代化 No.293.01(2020):108-114.

 

你可能感兴趣的:(优化求解,matlab,算法,开发语言)