原论文摘要:智能技术的快速发展促使利用自然行为来解决复杂问题的优化算法得以发展。其中,鼠群优化算法(Rat Swarm Optimizer,RSO)受老鼠的社会和行为特征启发,在各个领域已展现出潜力,但其收敛精度和探索能力有限。为解决这些缺点,本研究引入改进的鼠群优化算法(Modified Rat Swarm Optimizer,MRSO),旨在增强探索与开发之间的平衡。MRSO 进行了独特的改进以提高搜索效率和鲁棒性,使其适用于诸如焊接梁、压力容器和齿轮传动设计等具有挑战性的工程问题。通过经典基准函数的广泛测试表明,MRSO 显著提高了性能,在九种多模态函数中的六种以及所有七种固定维度多模态函数中避免了局部最优并实现了更高的精度。在 CEC 2019 基准测试中,MRSO 在十项函数中的六项中优于标准 RSO,展示出卓越的全局搜索能力。当应用于工程设计问题时,MRSO 始终比 RSO 提供更好的平均结果,证明了其有效性。此外,我们使用经典和 CEC-2019 基准将我们的方法与八种近期知名算法进行了比较。MRSO 在 23 个经典基准函数中的六种以及 CEC-2019 基准函数中的四种中优于这些算法中的每一种,这些结果进一步证明了 MRSO 作为工程应用中可靠且高效的优化工具的重大贡献。
Matlab
function [output] = MRSO(itt,F)
for n=1:itt
Function_name=F; % Name of the test function from beanchmark test functions
[lb,ub,dim,fobj]=CEC2019(Function_name);
ShowIterInfo = true; % Flag for Showing Iteration Information
MaxIt = 500; % max Iteration numbers
nPop = 30; % Population size
Position=zeros(1,dim);
Score=inf;
Positions=init(nPop,dim,ub,lb); %initialization
Convergence=zeros(1,MaxIt);
l=0; %% Parameters of MRSO
x = 1;
y = 5;
R = floor((y-x).*rand(1,1) + x); % equation No. (3)
for it=1:MaxIt
%
for i=1:size(Positions,1)
Flag4Upper_bound=Positions(i,:)>ub;
Flag4Lower_bound=Positions(i,:)<lb;
Positions(i,:)=(Positions(i,:).*(~(Flag4Upper_bound+Flag4Lower_bound)))+ub.*Flag4Upper_bound+lb.*Flag4Lower_bound;
fitness=fobj(Positions(i,:));
if fitness<Score
Score=fitness;
Position=Positions(i,:);
end
end
F1=R-l*((R)/MaxIt); % equation No. (6)
F2=(1-it*((1)/MaxIt)); % equation No. (7)
F3=(2*rand-1*rand); % equation No. (8)
Ar=F1*F2*F3; % equation No. (9)
for i=1:nPop
for j=1:dim
C=2*rand(); % equation No. (4)
Positions(i,j)=Position(j)-(Ar*Positions(i,j)+abs(C*((Position(j)-Positions(i,j))))); % equation No. (1)
end
end
l=l+1;
Convergence(it)=Score;
% Display Iteration Information
if ShowIterInfo
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(Convergence(it))]);
end
end
out.pop = Positions;
out.BestSol = Score;
out.BestCosts = Convergence;
semilogy(Convergence, 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
output = zeros(itt, 1);
output1 (n) = Score; % added!
output = output1;
end
end