差分进化算法

🌞欢迎来到智能优化算法差分进化算法的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破

📆首发时间:🌹2021年12月11日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


目录

0️⃣基本原理

         1️⃣基本流程

2️⃣主要步骤

3️⃣代码部分


0️⃣✨✨✨基本原理✨✨✨

        差分进化算法是一种随机的启发式搜索算法,简单应用,有较强的鲁棒性和应用能力,从数学角度看是随机搜索算法,从工程角度看是一种自适应的迭代寻优过程.除了具有较好的收敛性外,差分进化算法算法非常易于理解与执行.它只包括不多的几个控制参数并且在整个迭代过程中这些参数的值可以保持不变. 在DE算法寻优的过程中,首先,从父代个体间选择两个个体进行向量做差生成差分矢量;其次,选择另外一个个体与差分矢量求和生成实验个体;然后,对父代个体与相应的实验个体进行交叉操作,生成新的子代个体;最后在父代个体和子代个体之间进行选择操作,将符合要求的个体保存到下一代群体中去。

1️⃣✨✨✨基本流程✨✨✨

Step1:参数设置及种群初始化;

Step2:终止条件判断,若未达到终止条件,则转到Step3;

Step3:变异;轮盘赌选择;

Step4:交叉;

Step5:边界条件处理;

Step6:计算目标函数;

Step7:轮盘赌选择;

Step8:输出结果,转到Step2。


2️⃣✨✨✨主要步骤✨✨✨ 

初始化

每个个体是一个n为向量(每一个分量可以想象成一个基因):

Xi,j(t)     \epsilon     (Lj,Uj)

第t代的第i个个体的第j个分量。每个个体代表解空间内的某一个解,而基因代表解的各个分量(和遗传算法一样,遗传算法的每个个体的染色体二进制码在一起代表了一个解)。

Xs=20;
Xx=-20;
x=zeros(5,10);
x=rand(5,10)*(Xs-Xx)+Xx;

 每一行代表一个个体。 每个体有是十个分量。

计算目标函数

Xs=20;
Xx=-20;
x=zeros(5,10);
x=rand(5,10)*(Xs-Xx)+Xx;
for m=1:5
    Ob(m)=func1(x(:,m));
end
function result=func1(x)
summ=sum(x.^2);
result=summ;
end

 变异操作

 F    \epsilon     [0,2]是一个实常数因数

交叉

 边界条件处理

在由边界约束得问题中必须保证产生新个体的参数值位于问题的可行域中。


3️⃣✨✨✨代码部分✨✨✨

%%%%%%%%%%%%%%%%%差分进化算法求函数极值%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;                            %清除所有变量
close all;                            %清图
clc;                                  %清屏
NP=50;                                %个体数目
D=10;                                 %变量的维数
G=200;                                %最大进化代数
F0=0.4;                               %初始变异算子
CR=0.1;                               %交叉算子
Xs=20;                                %上限
Xx=-20;                               %下限
yz=10^-6;                             %阈值
%%%%%%%%%%%%%%%%%%%%%%%%%赋初值%%%%%%%%%%%%%%%%%%%%%%%%
x=zeros(D,NP);                        %初始种群%20201001lu注:D行NP列
v=zeros(D,NP);                        %变异种群
u=zeros(D,NP);                        %选择种群
x=rand(D,NP)*(Xs-Xx)+Xx;              %赋初值
trace=zeros(2,G+1);     
   %%%%%%%%%%%%%%%%%%%%计算目标函数%%%%%%%%%%%%%%%%%%%%
for m=1:NP
    Ob(m)=func1(x(:,m));
end
trace(1)=min(Ob);
trace(2,1)=sum(Ob)/length(Ob);
%%%%%%%%%%%%%%%%%%%%%%%差分进化循环%%%%%%%%%%%%%%%%%%%%%
for gen=1:G
    %%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%自适应变异算子%%%%%%%%%%%%%%%%%%%

    lamda=exp(1-G/(G+1-gen));
    F=F0*2^(lamda);
    %%%%%%%%%%%%%%%%%r1,r2,r3和m互不相同%%%%%%%%%%%%%%%%
    for m=1:NP
        %r1=randint(1,1,[1,NP]);
        r1=randi([1,NP],1,1);
        while (r1==m)
            r1=randi([1,NP],1,1);
        end
        r2=randi([1,NP],1,1);
        while (r2==m)|(r2==r1)
            r2=randi([1,NP],1,1);
        end
        r3=randi([1,NP],1,1);
        while (r3==m)|(r3==r1)|(r3==r2)
            r3=randi([1,NP],1,1);
        end
        v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3));
    end
    %%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%%
    r=randi([1,D],1,1);
    for n=1:D
        cr=rand(1);
        if (cr<=CR)|(n==r) 
            u(n,:)=v(n,:);
        else
            u(n,:)=x(n,:);
        end
    end
    %%%%%%%%%%%%%%%%%%%边界条件的处理%%%%%%%%%%%%%%%%%%%%%
    for n=1:D
        for m=1:NP
            if (u(n,m)<Xx)|(u(n,m)>Xs)
                u(n,m)=rand*(Xs-Xx)+Xx;
            end
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%%%%
    for m=1:NP
        Ob1(m)=func1(u(:,m));
    end
    for m=1:NP
        if Ob1(m)<Ob(m)
            x(:,m)=u(:,m);
        end
    end  
    for m=1:NP
        Ob(m)=func1(x(:,m));
    end
    sumf=sum(Ob);
    trace(1,gen+1)=min(Ob);
    trace(2,gen+1)=sumf/length(Ob);
    if min(Ob(m))<yz  
        break
    end
end
[SortOb,Index]=sort(Ob);
x=x(:,Index);
X=x(:,1)                              %最优变量              
Y=min(Ob)                             %最优值  
%%%%%%%%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1);
plot(trace(1,:));
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
figure(2);
plot(trace(2,:));
xlabel('迭代次数')
ylabel('目标均值')
title('均值变化曲线')
%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%
function result=func1(x)
summ=sum(x.^2);
result=summ;
end

ss

s

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿云阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值