一、介绍 差分进化算法是模拟自然界生物种群以“优胜劣汰,适者生存”为原则的进化发展规律而形成的一种随机启发式搜索算法。其保留了基于种群的全局搜索策略,采用实数编码,基于差分的简单变异操作和一对一的竞争生存策略,比遗传算法更简单。同时,差分进化算法独特的记忆能力使其可以动态的跟踪当前的搜索情况,及时调整搜索测量,因此具有较强的全局收敛能力。 目前为止,差分进化算法已经成为一种求解非线性,不可微,多极值和高维复杂函数的一种极其有效的方法。 在优化设计中,差分进化算法与传统的算法相比,具有以下特点: 1.差分进化算法从一个群体即多个点而不是从一个点开始搜索,这也是算法能够以较大的概率找到整体最优解的原因。 2.算法的进化准则是基于适应性信息的,不需要其他的辅助性信息,如要求函数可导,连续等。 3. 差分进化算法具有内在的并行性,适用于大规模并行分布处理,减小时间成本开销。 但缺点为: 1.算法后期个体之间的差异性减小,收敛速度慢,易陷入局部最优。 2.没有利用个体的先验知识,可能较多的迭代次数才能收敛到全局最优 算法框架:  (1)群体初始化 在n维空间里随机产生满足约束条件的M个个体

x

i

j

(

0

)

=

x

i

j

m

i

n

+

(

x

i

j

m

a

x

x

i

j

m

i

n

)

r

a

n

d

(

0

,

1

)

x_{ij}(0)=x_{ij_{min}}+(x_{ij_{max}}-x_{ij_{min}})*rand(0,1)

xij(0)=xijmin+(xijmax−xijmin)∗rand(0,1) 其中,

x

i

j

m

a

x

,

x

i

j

m

i

n

x_{ij_{max}},x_{ij_{min}}

xijmax,xijmin表示第

j

j

j个染色体的上下界。 (2) 变异 从群体中随机选择三个个体

x

p

1

,

x

p

2

,

x

p

3

x_{p1},x_{p2},x_{p3}

xp1,xp2,xp3且要求

i

p

1

p

2

p

3

i\neq p1\neq p2\neq p3

i̸=p1̸=p2̸=p3,则:

h

i

j

(

t

+

1

)

=

x

p

1

j

(

t

)

+

F

(

x

p

2

j

(

t

)

x

p

3

j

(

t

)

)

h_{ij}(t+1)=x_{p1j}(t)+F*(x_{p2j}(t)-x_{p3j}(t))

hij(t+1)=xp1j(t)+F∗(xp2j(t)−xp3j(t)) 如果没有局部优化的问题,变异操作为:

h

i

j

(

t

+

1

)

=

x

b

j

(

t

)

+

F

(

x

p

2

j

(

t

)

x

p

3

j

(

t

)

)

h_{ij}(t+1)=x_{bj}(t)+F*(x_{p2j}(t)-x_{p3j}(t))

hij(t+1)=xbj(t)+F∗(xp2j(t)−xp3j(t)) 其中,

x

p

2

j

(

t

)

x

p

3

j

(

t

)

x_{p2j}(t)-x_{p3j}(t)

xp2j(t)−xp3j(t)为差异化向量,是差分进化算法的关键;F为变异因子;P1,P2,P3为随机整数,表示个体在种群中的序号;

x

b

j

x_{bj}

xbj是当前种群中最好的个体,这一步借鉴了当前种群中最好的个体信息,可以大大加快收敛速度 (3) 交叉 交叉操作可以增加群体的多样性

v

i

j

(

t

+

1

)

=

{

h

i

j

(

t

+

1

)

,

r

a

n

d

  

l

i

j

C

R

h

x

i

j

(

t

)

,

r

a

n

d

  

l

i

j

>

C

R

v_{ij}(t+1)=\left\{ \begin{array}{c} h_{ij}(t+1),rand\; l_{ij} \leq CR\\ hx{ij}(t),rand\; l_{ij}>CR\ \end{array}\right.

vij(t+1)={hij(t+1),randlij≤CRhxij(t),randlij>CR  CR为交叉因子。 (4) 选择操作 为了确定

x

i

(

t

+

1

)

x_i(t+1)

xi(t+1)是否成为下一代的成员,我们需要对目标向量和当前的向量的适应度值进行比较,具体由适应度函数决定:

x

i

(

t

+

1

)

=

{

v

i

(

t

+

1

)

,

f

(

v

i

1

(

t

+

1

)

,

.

.

.

v

i

n

(

t

+

1

)

)

<

f

(

x

i

1

(

t

)

,

.

.

.

,

x

i

n

(

t

)

)

x

i

(

t

+

1

)

,

f

(

v

i

1

(

t

+

1

)

,

.

.

.

v

i

n

(

t

+

1

)

)

f

(

x

i

1

(

t

)

,

.

.

.

,

x

i

n

(

t

)

)

x_{i}(t+1)=\left\{ \begin{array}{c} v_{i}(t+1),f(v_{i1}(t+1),...v_{in}(t+1)) <f(x_{i1}(t),...,x_{in}(t))\\ x_{i}(t+1),f(v_{i1}(t+1),...v_{in}(t+1))\geq f(x_{i1}(t),...,x_{in}(t)) \ \end{array}\right.

xi(t+1)={vi(t+1),f(vi1(t+1),...vin(t+1))

f

(

x

,

y

)

=

20

e

0.2

(

x

2

+

y

2

)

/

2

e

(

c

o

s

2

π

x

+

c

o

s

2

π

y

)

/

2

+

e

f(x,y)=-20e^{-0.2\sqrt{({x^2+y^2})/2}}-e^{({cos2\pi x+cos2 \pi y})/2}+e

f(x,y)=−20e−0.2(x2+y2)/2

−e(cos2πx+cos2πy)/2+e为例 三维图为:  可见该函数是多极值的。函数全局最优解为max(max(f(x,y)))=-19.2926,使用一般的算法,极易陷入局部的最优解。 使用差分进化算法,结果为-19.2523,与真实值十分的接近。 适应度函数变化曲线为:  matlab代码为:

% clear all;

% close all;

%

size=50;%群体个数

Codel=2;%所求的变量个数

MinX(1)=-5;%未知量范围

MinX(2)=-5;

MaxX(1)=5;

MaxX(2)=5;

G=200;%迭代次数

F=1.2;%变异因子[0 2]

cr=0.8;%交叉因子[0.6 0.9]

%初始化种群

for i=1:1:Codel

P(:,i)=MinX(i)+(MaxX(i)-MinX(i))*rand(size,1);

end

Best=P(1,:);%全局最优个体 之后不断更新

for i=2:size

if(fun_DE(P(i,1),P(i,2))>fun_DE(Best(1),Best(2)))

Best=P(i,:);

end

end

fi=fun_DE(Best(1),Best(2));%不是C语言 一定要记得给初始变量否则程序跑飞

%%进入循环直到满足精度要求或者迭代次数达到

for Kg=1:1:G

time(Kg)=Kg;

%第二步 变异

for i=1:size

r1=1;r2=1;r3=1;r4=1;%使得个体满足变异条件

while(r1==r2||r1==r3||r1==r4||r2==r3||r2==r4||r3==r4||r1==i||r2==i||r3==i||r4==i)

r1=ceil(size*rand(1));%大小匹配

r2=ceil(size*rand(1));

r3=ceil(size*rand(1));

r4=ceil(size*rand(1));

end

h(i,:)=P(r1,:)+F*(P(r2,:)-P(r3,:));

%h(i,:)=Best+F*(P(r2,:)-P(r3,:));

for j=1:Codel %检查是否越界

if(h(i,j)

h(i,j)=MinX(j);

elseif(h(i,j)>MaxX(j))

h(i,j)=MaxX(j);

end

end

%交叉

for j=1:Codel

temper=rand(1);

if(temper

v(i,j)=h(i,j);

else

v(i,j)=P(i,j);

end

end

%选择

if(fun_DE(v(i,1),v(i,2))>fun_DE(P(i,1),P(i,2)))

P(i,:)=v(i,:);

end

if(fun_DE(P(i,1),P(i,2))>fi)

fi=fun_DE(P(i,1),P(i,2));

Best=P(i,:);

end

end

Best_f(Kg)=fun_DE(P(i,1),P(i,2));

end

fprintf('最优解结果为%f,%f',Best(1),Best(2));

fprintf('最大函数值为%f',Best_f(Kg));

plot(time,Best_f(time));

适应度函数

function J=fun_DE(x1,x2)

% J=100*(x1^2-x2)^2+(1-x1)^2;

J=-20*exp((0.2*sqrt((x1^2+x2^2)/2)))-exp((cos(2*pi*x1)+cos(2*pi*x2))/2)+exp(1);

end

差分进化算法 matlab,差分进化算法之Matlab实现相关推荐

  1. MATLAB差分进化算法求解超市物流配送选址问题实例

    差分进化算法编程问题实例: MATLAB差分进化算法求解超市物流配送中心选址问题代码实例 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表1.要 ...

  2. 差分进化算法_差分进化算法

    差分进化算法(Differential Evolution Algorithm,DE)是一种高效的全局优化算法.是一种模拟生物进化的随机模型,通过反复迭代,使得那些适应环境的个体被保存了下来.它的进化 ...

  3. 优化算法:粒子群算法,遗传算法,差分进化算法

    目录 1.粒子群算法(PSO) 2.遗传算法 3.差分进化算法 1.粒子群算法(PSO) 整个粒子群优化算法的算法框架如下: step1种群初始化,可以进行随机初始化或者根据被优化的问题设计特定的初始 ...

  4. 机器学习中四类进化算法的详解(遗传算法、差分进化算法、协同进化算法、分布估计算法)

    1.遗传算法(Genetic Algorithm,GA) GA算法原理 首先我们来介绍进化算法的先驱遗传算法,遗传算法(Genetic Algorithm,简称GA)是一种最基本的进化算法,它是模拟达 ...

  5. 智能优化算法之 差分进化算法

    差分进化算法原理 差分进化算法是一种随机的启发式搜索算法,简单易用,有较强的鲁棒性和全局搜索能力. 差分进化算法是一种自组织最小化方法,利用种群中随机选择的不同向量来干扰一个现有向量,种群中的每个向量 ...

  6. 文献汇报 基于差分进化的混合人工蜂群算法

    1.研究内容 人工蜂群算法(ABC)和差分进化算法(DE)是两种非常流行和有效的元启发式算法. 存在问题:收敛过早.探索开发不平衡.收敛速度慢. 混合的ABC和DE算法,是一种比以ABC和DE更高效, ...

  7. 微分进化算法解决函数优化问题的matlab代码,Matlab微分进化算法及优化函数测试...

    微分进化(Difference Evolution,DE)算法是一种优化算法,据称其比GA(遗传算法)等更为优秀. 借鉴网上实现的DE算法,用Matlab实现了对若干函数优化问题的解法,代码如下: f ...

  8. 基于Matlab传统有限差分的最小二乘积分波前重构算法

    三维面形重建是利用测得的表面梯度(斜率)或法向矢量数据重建物体表面形貌的过程,是光学测量.机器视觉中的一个经典问题,是哈特曼波前检测.干涉测量.光栅投影测量等技术的关键步骤之一. 本文开发了一种基于传 ...

  9. 算法代码_Python进化算法之多目标优化与代码实战

    前言 自从上三篇博客详细讲解了Python遗传和进化算法工具箱及其在带约束的单目标函数值优化中的应用.利用遗传算法求解有向图的最短路径.利用进化算法优化SVM参数之后,这篇不再局限于单一的进化算法工具 ...

  10. ga设置迭代次数_种群进化+邻域搜索的混合算法(GA+TS)求解柔性作业车间调度问题(FJSP)算法介绍...

    程序猿声 代码黑科技的分享区 过去小编简单了解过作业车间调度问题(JSP),这两个月简单接触了柔性车间调度问题(FJSP),但是因为一些原因打算暂时研究到这里.在研究的时候,小编发现网上这方面的中文资 ...

最新文章

  1. 关于 Oracle DB CONSTRAINT约束的一些SQL ORA-02292: integrity constraint violated
  2. .NET 开发环境中使用VSN版本控制
  3. 网站图片优化需要注意哪些方面?
  4. 从java里调用r jri的设置方法_从Java里调用R – JRI的设置方法
  5. 微软超融合私有云测试08-SCVMM部署之SQL Server与前置条件安装
  6. GPU Gems1 - 7 无数波动草叶的渲染
  7. IE9真的支持CSS3和HTML5?
  8. 100个人奇数枪毙Java,在JAVA中用for循环编写程序计算1~100之间的奇数之和
  9. kettle 简介及入门
  10. 2021-CVPR-Inpainting论文导读
  11. 使用auto.js模拟手动点击芭芭农场任务(芭芭农场自动脚本2022.8.1更新)
  12. 你的数字生活:如何转变为一个个0和1?
  13. AODV=DSR+DSDV
  14. 微众银行客服电话是95384 认准官方的人工客服电话
  15. sklearn 命令行安装_1.sklearn库的安装
  16. 楚留香ai识别人脸_楚留香手游AI捏脸怎么弄_楚留香手游AI捏脸方法步骤_玩游戏网...
  17. Android Studio如何建立VR视频
  18. 位运算与位运算的常见用法
  19. 【Flink异常】Caused by: java.lang.RuntimeException: Row arity of from does not match serializers
  20. JSP Java 期末复习整理

热门文章

  1. iis6.0远程代码执行漏洞
  2. JNI引用溢出导致的重启问题分析
  3. 奇妙的数字小明发现了一个奇妙的数字,他的平方和立方正好把0~9这10个数字每个用且只用了一次,你能猜出这个数字是多少吗
  4. Extjs中EditorGridPanel修改并获取数据的两种方式
  5. Cocoa 获取一个独特的电脑硬件ID (A unique hardware id)
  6. 神州数码交换机CS6200命令(信息安全管理与评估赛项)
  7. 机器学习实战 2.3获取数据
  8. 银行数据仓库体系实践(13)--数据应用之监管报送
  9. 周立功USBCAN资料分享
  10. chrome 安装 gliffy 绘图插件以及使用