差分进化算法及可运行Matlab代码

这是小鱼学习后自己整理的相关知识和撰写的代码,如有不妥之处,希望大家可以在评论区进行指正,小鱼很感激!

差分进化算法的基本理论

什么是差分进化算法

简介:差分进化算法是一种随机的、并行的、直接的搜索算法,属于基于种群的自适应全局优化算法(演化算法的一种)。

特点:结构简单、易实现、收敛快速、鲁棒性强、自适应性、内在并行性等。

基本思想:

        (1)初始化种群X

        (2)变异:X中随机选两个向量,进行差分计算,其结果作为加权,按照一定的规则和第三个个体进行求和,完成变异。

        (3)交叉:将变异个体与预先确定的目标个体进行参数混合,完成交叉。

        (4)选择:个体的适应度值优于阈值,下一代用该个体取代目标个体,否则不变,完成选择。

        (5)迭代:基于上述步骤,保留优良个体,引导搜索过程向全局最优解逼近

算法实现:

        (1)确定控制参数(种群规模NP【5D~10D,且满足大于等于4】、变异算子F和交叉算子CR【0~1,越大收敛越快】)、适应度函数和最大进化代数

        (2)随机初始化:x^{_{ij,0}}=rand\left ( 0,1 \right )\cdot \left ( x^{_{j}^{U}} - x^{_{j}^{L}}\right )+x^{_{j}^{L}}

        (3)评价每个个体的适应度值

        (4)判断是否产生终止条件,若是则终止进化,此时得到的个体作为最佳个体(最优解)输出;否则,继续进化

        (5)变异:    v_{i,G}=x_{r1,G}+F\left ( x_{r2,G}-x_{r3,G} \right ), F\in \left [ 0,2 \right ]

                                自适应变异算子为:\lambda =e^{1-\frac{Gm}{Gm+1-G}},F=F_{0}\cdot 2^{\lambda}

        (6)交叉:    u_{i,G+1}=\left ( u_{1i,G+1},u_{2i,G+1} ,\cdots,u_{Di,G+1}\right )

                ​​​​​​​                u_{ji,G+1}=\binom{v_{ji,G+1},\left ( rand\left ( b(j)\leq CR)else, j=rnbr(i) \right ) \right )}{x_{ji,G+1},\left ( rand\left ( b(j)>CR)else, j\neq rnbr(i) \right ) \right )}

        ​​​​​​​        ​​​​​​​                rnbr(i)\epsilon \left ( 1,2,\cdots ,D \right )

        ​​​​​​​        ​​​​​​​                i=1,2,\cdots ,NP;j=1,2,\cdots,D

        (7)选择:根据是否目标函数最小化来选择,得到新一代种群。

        (8)边界问题:当产生新的个体,不符合边界条件时,采用(1)式进行代替。

        (9)G=G+1,重复(3)-(8).

求某函数最小值:f=\sum_{i=1}^{n}\left ( x^{2} -10cos\left ( 2\pi x \right )+10\right ),\left ( x\geqslant -5.12,x\leqslant 5.12 \right )即测试函数

clc,clear,close all;
Gm=1000;%最大迭代数
F0=0.6;%初始变异算子
NP=100;%种群规模
CR=0.9;%交叉算子
G=1;%初始迭代数
N=30;%维数
xl=-5.12;
xu=5.12;
%% 初始化
ge=zeros(1,NP);
Bx=zeros(NP,N);
X0=(xu-xl)*rand(NP,N)+xl;
X=X0;
X1new=zeros(NP,N);
X1_new=zeros(NP,N);
X1=zeros(NP,N);
value=zeros(1,NP);
a=1;
b=NP;
%% 迭代
while G<Gm
for i = 1:NP
dx=randperm(b-a+1)+a-1;
j=dx(1);
k=dx(2);
p=dx(3);
if j==i
j=dx(4);
elseif k==i
k=dx(4);
elseif p==i
p=dx(4);
end
lambda=exp(1-Gm/(Gm+1-G));
F=F0*2.^lambda;
bon=X(p,:)+F*(X(j,:)-X(k,:));
if(bon>xl)&(bon<xu)
X1new(i,:)=bon;
else
X1new(i,:)=(xu-xl)*rand(1,N)+xl;
end
end
for i=1:NP
if rand>CR
X1_new(i,:)=X(i,:);
else
X1_new(i,:)=X1new(i,:);
end
end
for i=1:NP
if fun(X1_new(i,:))<fun(X(i,:))
X1(i,:)=X1_new(i,:);
else
X1(i,:)=X(i,:);
end
end
for i=1:NP
value(i)=fun(X1(i,:));
end
[fl,nl]=min(value);
ge(G)=fl;
bx(G,:)=X1(nl,:);
G=G+1;
X=X1;
end
[gl,n]=min(ge);
bvalue=gl
bs=bx(n,:)
plot(bs);
function y=fun(x)
y=sum(x.^2-10.*cos(2.*pi.*x)+10);
end

解读:       

        首先,设定预设值与初始化;

        其次,对X进行变异和交叉得到Xnew,后对Xnew和X进行测试,选最小值对应的位置向量和该最小值;

        接着,进行迭代,重复上述该步骤;

        最后,得到最小函数值对应的最小值和对应的位置向量。

 其本质:

        X向量所有元素都在上下界之间,计算该X向量下的函数,将变异交叉后和原X向量进行计算,将选择更小的进行保留,最后在NP个种群中找最小的,进而完成,最后的向量及其对应的函数值。

缺点:

        早熟、收敛慢、全局搜索能力欠佳等问题

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
差分进化算法(Differential Evolution,DE)是一种优化算法,常用于解决连续优化问题。它模拟了生物进化的过程,通过不断迭代来寻找最优解。差分进化算法在AGV车间调度问题中也有应用。 以下是一个使用差分进化算法解决AGV车间调度问题的MATLAB代码示例: ```matlab % AGV车间调度问题的差分进化算法代码示例 % 参数设置 popSize = 50; % 种群大小 maxGen = 100; % 最大迭代次数 F = 0.8; % 缩放因子 CR = 0.9; % 交叉概率 % 初始化种群 pop = randi([1, n], popSize, n); % n为任务数量 % 迭代优化 for gen = 1:maxGen % 计算适应度 fitness = calculateFitness(pop); % 根据具体问题定义适应度函数 % 选择操作 [~, idx] = sort(fitness); bestIndividual = pop(idx(1), :); % 差分进化操作 newPop = zeros(popSize, n); for i = 1:popSize % 随机选择三个个体 r = randperm(popSize, 3); a = pop(r(1), :); b = pop(r(2), :); c = pop(r(3), :); % 变异操作 mutant = a + F * (b - c); % 交叉操作 crossover = zeros(1, n); jrand = randi([1, n]); for j = 1:n if rand() < CR || j == jrand crossover(j) = mutant(j); else crossover(j) = pop(i, j); end end % 选择操作 if calculateFitness(crossover) < fitness(i) newPop(i, :) = crossover; else newPop(i, :) = pop(i, :); end end % 更新种群 pop = newPop; end % 输出最优解 bestFitness = calculateFitness(bestIndividual); disp(['最优解:', num2str(bestIndividual)]); disp(['最优适应度:', num2str(bestFitness)]); % 计算适应度函数的具体实现 function fitness = calculateFitness(individual) % 根据具体问题定义适应度函数的计算方法 % 这里假设适应度函数为任务完成时间的总和,需要根据实际情况进行修改 fitness = sum(individual); end ``` 这段代码使用差分进化算法来解决AGV车间调度问题。其中,种群大小、迭代次数、缩放因子和交叉概率等参数可以根据实际情况进行调整。适应度函数需要根据具体问题进行定义和计算。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值