龙格库塔算法 Runge Kutta Method及其Matlab代码

龙格库塔算法 Runge Kutta Method (RUN)

优化领域受到基于隐喻的“伪创新”或“花哨”优化器的影响。这些老套的方法大多模仿动物的搜索趋势,对优化过程本身的贡献很小。这些方法大多存在局部高效的性能、对简单问题的验证方法存在偏差、组件之间的交互高度相似等问题。在数学基础和数学中广为人知的Runge Kutta 方法的思想基础上,引入一种新的无隐喻的基于种群的优化方法。提出了RUNge - Kutta优化器(RUN)来处理未来各种类型的优化问题。
在这里插入图片描述
参考文献:Ahmadianfar I, Heidari A A, Gandomi A H, et al. RUN beyond the metaphor: An efficient optimization algorithm based on Runge Kutta method[J]. Expert Systems with Applications, 2021, 181: 115079.

龙格库塔算法的数学模型

RUN这种方法的好处是隐藏了优化器中使用的方程的真实性质。因此,RUN解释了Runge Kutta 技术的主要逻辑以及智能体群体基于种群的进化。包括:初始化,搜索机制,更新解,提高解的质量。
位置更新图:
在这里插入图片描述
搜索机制:
在这里插入图片描述
优化过程:
在这里插入图片描述
流程图:
在这里插入图片描述

龙格库塔算法的Matlab代码

%--------------------------------------------------------------------------
% RUN beyond the metaphor(RUN)
% Refernece:RUN beyond the metaphor: An efficient optimization algorithm based on Runge Kutta method
% Code by Luzhenhui Yangtze University
%--------------------------------------------------------------------------
% 输入
% nP:种群个体数目
% MaxIt:算法的最大迭代次数
% lb:变量的取值下界
% ub:变量的取值上界
% dim:变量的维度
% fob:优化的目标函数
%--------------------------------------------------------------------------
% 输出
% Best_Cost:最优适应度值
% Best_X:最优适应度值所对应的个体位置信息
% Convergence_curve:每次迭代的最优适应度值
%--------------------------------------------------------------------------
function [Best_Cost,Best_X,Convergence_curve]=RUN(nP,MaxIt,lb,ub,dim,fobj)
Cost=zeros(nP,1);                    % 记录种群个体的适应度值
X=initialization(nP,dim,ub,lb);      % 初始化种群个体   
Xnew2=zeros(1,dim);
Convergence_curve = zeros(1,MaxIt);  % 记录每一次迭代的最优适应度值
for i=1:nP
    Cost(i) = fobj(X(i,:));          % 计算种群个体的适应度值
end
[Best_Cost,ind] = min(Cost);         % 确定最优适应度值及其对应的最优个体
Best_X = X(ind,:);
Convergence_curve(1) = Best_Cost;
%% 算法主要步骤 
it=1;
while it<MaxIt
    it=it+1;
    f=20.*exp(-(12.*(it/MaxIt))); % 公式(17.6) 
    Xavg = mean(X);               % 种群个体的平均解
    SF=2.*(0.5-rand(1,nP)).*f;    % 通过公式(17.5)确定自适应系数SF   
    for i=1:nP
            [~,ind_l] = min(Cost);
            lBest = X(ind_l,:);   
            [A,B,C]=RndX(nP,i);   % 确定三个随机个体
            [~,ind1] = min(Cost([A B C]));
            % 通过公式(11.1)至(11.3)确定detla X
            gama = rand.*(X(i,:)-rand(1,dim).*(ub-lb)).*exp(-4*it/MaxIt);  
            Stp=rand(1,dim).*((Best_X-rand.*Xavg)+gama);
            DelX = 2*rand(1,dim).*(abs(Stp));
            % Determine Xb and Xw for using in Runge Kutta method
            if Cost(i)<Cost(ind1)                
                Xb = X(i,:);
                Xw = X(ind1,:);
            else
                Xb = X(ind1,:);
                Xw = X(i,:);
            end
            SM = RungeKutta(Xb,Xw,DelX);   % Search Mechanism (SM) of RUN based on Runge Kutta Method
            L=rand(1,dim)<0.5;
            Xc = L.*X(i,:)+(1-L).*X(A,:);  % 公式(17.3)
            Xm = L.*Best_X+(1-L).*lBest;   % 公式(17.4)
            vec=[1,-1];
            flag = floor(2*rand(1,dim)+1);
            r=vec(flag);                   
            g = 2*rand;
            mu = 0.5+.1*randn(1,dim);
            % 公式(18)
            if rand<0.5
                Xnew = (Xc+r.*SF(i).*g.*Xc) + SF(i).*(SM) + mu.*(Xm-Xc);
            else
                Xnew = (Xm+r.*SF(i).*g.*Xm) + SF(i).*(SM)+ mu.*(X(A,:)-X(B,:));
            end  
        % 边界处理
        FU=Xnew>ub;FL=Xnew<lb;Xnew=(Xnew.*(~(FU+FL)))+ub.*FU+lb.*FL; 
        CostNew=fobj(Xnew);
        if CostNew<Cost(i)
            X(i,:)=Xnew;
            Cost(i)=CostNew;
        end
%% Enhanced solution quality (ESQ)  (Eq. 19)      
        if rand<0.5
            EXP=exp(-5*rand*it/MaxIt);
            r = floor(Unifrnd(-1,2,1,1));
            u=2*rand(1,dim); 
            w=Unifrnd(0,2,1,dim).*EXP;               % 公式(19-1)
            [A,B,C]=RndX(nP,i);
            Xavg=(X(A,:)+X(B,:)+X(C,:))/3;           % 公式(19-2)         
            beta=rand(1,dim);
            Xnew1 = beta.*(Best_X)+(1-beta).*(Xavg); % 公式(19-3)
            for j=1:dim
                if w(j)<1 
                    Xnew2(j) = Xnew1(j)+r*w(j)*abs((Xnew1(j)-Xavg(j))+randn);
                else
                    Xnew2(j) = (Xnew1(j)-Xavg(j))+r*w(j)*abs((u(j).*Xnew1(j)-Xavg(j))+randn);
                end
            end
            FU=Xnew2>ub;FL=Xnew2<lb;Xnew2=(Xnew2.*(~(FU+FL)))+ub.*FU+lb.*FL;
            CostNew=fobj(Xnew2);            
            if CostNew<Cost(i)
                X(i,:)=Xnew2;
                Cost(i)=CostNew;
            else
                if rand<w(randi(dim)) 
                    SM = RungeKutta(X(i,:),Xnew2,DelX);
                    Xnew = (Xnew2-rand.*Xnew2)+ SF(i)*(SM+(2*rand(1,dim).*Best_X-Xnew2));  % (Eq. 20)
                    
                    FU=Xnew>ub;FL=Xnew<lb;Xnew=(Xnew.*(~(FU+FL)))+ub.*FU+lb.*FL;
                    CostNew=fobj(Xnew);
                    
                    if CostNew<Cost(i)
                        X(i,:)=Xnew;
                        Cost(i)=CostNew;
                    end
                end
            end
        end
%% 确定最优适应度值及对应的个体
        if Cost(i)<Best_Cost
            Best_X=X(i,:);
            Best_Cost=Cost(i);
        end

    end
% 保存每一次迭代的最优适应度值  
Convergence_curve(it) = Best_Cost;
disp(['it : ' num2str(it) ', Best Cost = ' num2str(Convergence_curve(it) )]);
end
end

function z=Unifrnd(a,b,c,dim)
a2 = a/2;
b2 = b/2;
mu = a2+b2;
sig = b2-a2;
z = mu + sig .* (2*rand(c,dim)-1);
end

% A function to determine thress random indices of solutions
function [A,B,C]=RndX(nP,i)
Qi=randperm(nP);Qi(Qi==i)=[];
A=Qi(1);B=Qi(2);C=Qi(3);
end

function SM=RungeKutta(XB,XW,DelX)
dim=size(XB,2);
C=randi([1 2])*(1-rand);
r1=rand(1,dim);
r2=rand(1,dim);
K1 = 0.5*(rand*XW-C.*XB);
K2 = 0.5*(rand*(XW+r2.*K1.*DelX/2)-(C*XB+r1.*K1.*DelX/2));
K3 = 0.5*(rand*(XW+r2.*K2.*DelX/2)-(C*XB+r1.*K2.*DelX/2));
K4 = 0.5*(rand*(XW+r2.*K3.*DelX)-(C*XB+r1.*K3.*DelX));
XRK = (K1+2.*K2+2.*K3+K4);
SM=1/6*XRK;
end


function Positions=initialization(SearchAgents_no,dim,ub,lb)
Boundary_no= size(ub,2); % numnber of boundaries
% If the boundaries of all variables are equal and user enter a signle
% number for both ub and lb
if Boundary_no==1
    Positions=rand(SearchAgents_no,dim).*(ub-lb)+lb;
end
% If each variable has a different lb and ub
if Boundary_no>1
    for i=1:dim
        ub_i=ub(i);
        lb_i=lb(i);
        Positions(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;
    end
end
end

该博客主要分享龙格库塔算法的代码,并带有中英文注释!
分享不易,喜欢的请大家点赞加收藏,谢谢!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB四阶龙格算法代码如下所示: ```matlab function [t, y, n = runge_kuttx0_o4(ufunc, tspan, y0, h) if nargin < 4 h = 0.01; end if size(tspan) == [1, 2] t0 = tspan(1); tn = tspan(2); else error(message('MATLAB:runge_kuttx0_o4:WrongDimensionOfTspan')); end n = floor((tn - t0) / h); t(1) = t0; y(:, 1) = y0; for i = 1:n t(i + 1) = t(i) + h; k1 = ufunc(t(i), y(:, i)); k2 = ufunc(t(i) + h/2, y(:, i) + h*k1/2); k3 = ufunc(t(i) + h/2, y(:, i) + h*k2/2); k4 = ufunc(t(i) + h, y(:, i) + h*k3); y(:, i + 1) = y(:, i) + h*(k1 + 2*k2 + 2*k3 + k4)/6; %按照龙格方法进行数值求解 end end ``` 这段代码实现了四阶龙格算法,用于求解微分方程的数值解。你需要传入微分方程组的函数名称、时间起点和终点、初始值和步长作为参数调用该函数。它将返回计算得到的时间、数值解矩阵以及步数。这个代码的优点是使用了函数句柄,方便复用,并且模仿了ode45函数的输入变量格式,使用起来比较方便。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MATLAB四阶龙格法_求解微分方程数值解_源程序代码_fourth_order_Runge_Kutta_matlab](https://download.csdn.net/download/m0_53407570/85190131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [四阶龙格算法matlab代码](https://blog.csdn.net/qq_41030359/article/details/114749865)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值