当前位置:   article > 正文

matlab实现差分进化算法DE_差分进化算法 代码实现

差分进化算法 代码实现


类似于其它进化算法范例,DE是一种基于群体的随机搜索算法,它采用变异、交
替换等算子指导群体进化。但是,DE执行简单,在收敛速度和搜索性能方面均占
有一定的优势。
在进化过程中,DE保持一个规模为NP的群体(也就是群体中包含NP个个体,每
个个体为搜索空间中的一个点),并且通过迭代的方式改善群体质量。它从当前群体
中提取方向和距离等信息用于产生下一代群体。目前,几乎所有的DE均采用以下算法
框架:

算法框架

在这里插入图片描述

差分进化算法的基本思想

当我们构建一个实际问题时,会建模一个基于问题的目标函数,为求解目标函数的值引入了适应度的概念。适应度函数的值越小,适应度越好
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
构建一个种群,种群有8个个体

在这里插入图片描述
X代表个体,括号内的t代表迭代次数,左边的V代表变异个体,父代个体也叫做目标个体 ,r1,r2,r3表示从
8个个体中随机选出3个个体,对每个目标个体产生变异个体,例如对父代个体X1产生一个变异个体,Xr1,Xr2,Xr3只能在X2~X8中取,X1 ~X8中的每一个目标个体都通过变异操作产生一个变异个体,但一个个体包含多个维度,在变异操作时,应当对每个个体进行逐维的更新
在这里插入图片描述
CR是控制变异个体和父代个体在决策变量上交换的频率(交叉概率)
把变异之后的数据和变异之前的进行交换
在这里插入图片描述
计算目标个体和实验个体的适应度,选择适应度函数值小的个体

差分进化算法具体步骤如下:

(1)确定差分进化算法的控制参数和所要采用的具体策略。差分进化算法的控制参数包括:种群数量、变异算子、交叉算子、最大进化代数、终止条件等。
(2)随机产生初始种群,进化代数k=1。
(3)对初始种群进行评价,即计算初始种群中每个个体的目标函数值。
(4)判断是否达到终止条件或达到最大进化代数:若是,则进化终止,将此时的最佳个体作为解输出;否则,继续下一步操作。
(5)进行变异操作和交叉操作,对边界条件进行处理,得到临时种群。
(6)对临时种群进行评价,计算临时种群中每个个体的目标函数值。
(7)对临时种群中的个体和原种群中对应的个体,进行“一对一”的选择操作,得到新种群。
(8)进化代数k=k+1,转步骤(4)。

具体步骤和代码实现

算法控制参数
DE算法的控制参数主要有种群规模NP、缩放因子F以及交叉概率 CR.在经典DE算法中采用的是参数固定设置的方式,即参数在搜索之前预先设置好并且在整个迭代过程中保持不变。

clear;%删除工作区所有变量
close all;%关闭图形窗口
clc;%清除命令行窗口
Np=200;
F=0.5;%缩放因子,[0.4,0.95]之间,
%取大增大算法的搜索空间,提高种群多样性,有利于算法搜索最优解,但会降低收敛速率;取小提高算法开发能力,提高算法收敛的速度,增加早熟收敛风险
Cr=0.5;%交叉概率[0.3-0.9]之间,取大增强种群多样性,但后期收敛速度变慢,取小有利于分析个体各维可分离问题
it_max=100;%最大进化代数;
D=30;%染色体长度,种群中每个个体的维度
iter=1;%初代种群
%初始种群一般在给定的约束边界内随机生成
smin=-200;%上界
smax=200;%下界
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

1.种群初始化
在这里插入图片描述

%种群初始化,随机生成初始种群并计算种群的适应值
initpop=rand(Np,D)*(smax-smin)+smin;
for i =1:Np
    fitness_1(i)=sum(initpop(i,:).^2);
end
trace(iter)=min(fitness_1);%计算初始种群中每个个体的目标函数值,取出其中最优个体
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.变异
对于种群中每个个体;,差分进化算法的变异向量按照下面的方式产生: 在这里插入图片描述

while(iter<it_max)
    for w=1:Np
         num = randperm(Np,4);           %随机生成4个从1到NP的数
       if num(1)==w,num(1)=num(4);
       elseif num(2)==w,num(2)=num(4);%取初始种群的第num(n)行作为变异个体并命名为x_1,x_2,x_3;
       elseif num(3)==w,num(3)=num(4);
       end
    variation(w,:)=initpop(num(1),:)+F*(initpop(num(2),:)-initpop(num(3),:));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.修补染色体

    for m = 1:D
  if variation(w,m)<smin||variation(w,m)>smax
      variation(w,m)=rand*(smax-smin)+smin;
  end
  end
  • 1
  • 2
  • 3
  • 4
  • 5

4.交叉
在这里插入图片描述

  for y=1:D
       rnbr = randi([1,D],1,1)
       cr=rand;
          if (cr<Cr || y==rnbr)
              trial(w,y)=variation(w,y);
          else
              trial(w,y)=initpop(w,y);
          end
  end
      fitness_2(w)=sum(trial(w,:).^2);
  end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5.选择
在这里插入图片描述

   for f=1:Np
      if fitness_2(f)<=fitness_1(f)
          initpop(f,:)=trial(f,:);
      end
      fitness_1(f)=sum(initpop(f,:).^2);
  end
  iter=iter+1;
  trace(iter)=min(fitness_1);
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

6.绘图
figure(1);
plot(trace);
xlabel(‘进化代数’);
ylabel(‘适应值’);
运行结果:
(过了很久以后……终于出了结果)
在这里插入图片描述

完整代码

clear;%删除工作区所有变量
close all;%关闭图形窗口
clc;%清除命令行窗口
Np=200;
F=0.5;%缩放因子,[0.4,0.95]之间,
%取大增大算法的搜索空间,提高种群多样性,有利于算法搜索最优解,但会降低收敛速率;取小提高算法开发能力,提高算法收敛的速度,增加早熟收敛风险
Cr=0.5;%交叉概率[0.3-0.9]之间,取大增强种群多样性,但后期收敛速度变慢,取小有利于分析个体各维可分离问题
it_max=100;%最大进化代数;
D=30;%染色体长度,种群中每个个体的维度
iter=1;%初代种群
%初始种群一般在给定的约束边界内随机生成
smin=-200;%上界
smax=200;%下界
%种群初始化,随机生成初始种群并计算种群的适应值
initpop=rand(Np,D)*(smax-smin)+smin;
for i =1:Np
   fitness_1(i)=sum(initpop(i,:).^2);
end
trace(iter)=min(fitness_1);%计算初始种群中每个个体的目标函数值,取出其中最优个体
while(iter<it_max)
   for w=1:Np
        num = randperm(Np,4);           %随机生成4个从1到NP的数
      if num(1)==w,num(1)=num(4);
      elseif num(2)==w,num(2)=num(4);%取初始种群的第num(n)行作为变异个体并命名为x_1,x_2,x_3;
      elseif num(3)==w,num(3)=num(4);
      end
   variation(w,:)=initpop(num(1),:)+F*(initpop(num(2),:)-initpop(num(3),:));
   %对变异种群的个体是否在解空间内做判断,修补操作
   for m = 1:D
   if variation(w,m)<smin||variation(w,m)>smax
       variation(w,m)=rand*(smax-smin)+smin;
   end
   end
   for y=1:D
        rnbr = randi([1,D],1,1)
        cr=rand;
           if (cr<Cr || y==rnbr)
               trial(w,y)=variation(w,y);
           else
               trial(w,y)=initpop(w,y);
           end
   end
       fitness_2(w)=sum(trial(w,:).^2);
   end
   for f=1:Np
       if fitness_2(f)<=fitness_1(f)
           initpop(f,:)=trial(f,:);
       end
       fitness_1(f)=sum(initpop(f,:).^2);
   end
   iter=iter+1;
   trace(iter)=min(fitness_1);
end
figure(1);
plot(trace);
xlabel('进化代数');
ylabel('适应值');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/630176
推荐阅读
相关标签
  

闽ICP备14008679号