引言


差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法,它保留了基于种群的全局搜索策略,采用实数编码、基于差分的简单变异操作和“一对一”的竞争生存策略,降低了进化计算操作的复杂性。

差分进化算法的原理


差分进化算法是一种自组织最小化方法,利用种群中两个随机选择的不同向量来干扰现有向量,种群中的每一个向量都要进行干扰。

  1. 它通过把种群中的两个成员之间的加权差向量加到第三个成员上来产生新的参数向量,该操作成为“变异”。
  2. 将变异向量的参数与另外预先确定的目标向量参数按一定规则混合来产生实验向量,该操作成为“交叉”;
  3. 若实验向量的代价函数比目标向量的代价函数低,实验向量就在下一代中替代目标向量,该操作成为“选择”;

差分进化算法流程


具体步骤如下:

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

实例:

$$计算函数的最小值,其中个体x的维数n=10.这是一个简单的平方和函数,只有一个极小点x=(0,0,...,0)。$$

%%%%%%%差分进化求函数极值%%%%%%%%%
%%%%%%%初始化%%%%%%%%
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); %初始种群
v = zeros(D,NP); %变异种群
u = zeros(D,NP); %选择种群
x = rand(D,NP) * (Xs-Xx) + Xx; %赋初值
%%%%%%%%%%计算目标函数%%%%%%%%%%%
for m = 1:NP
Ob(m) = func1(x(:,m));
end
trace(1) = min(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 = 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,NP],1,1); %确保必有一个v(:)进入u(:)中
for n = 1:D
cr = rand(1);
if (cr <= CR) | (n == r)
u(n,:) = v(n,:); %批量操作,替换所有个体第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
trace(gen+1) = min(Ob);
if min(Ob) < yz
break;
end
end
%%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%
figure
plot(trace);
xlabel('迭代次数');
ylabel('目标函数值');
title('DE目标函数曲线');
%%%%%%%%%%%%%%适应度函数%%%%%%%%%%
function result = func1(x)
summ = sum(x.^2);
result = summ;
end

  

差分进化算法介绍及matlab实现的更多相关文章

  1. 标准差分进化算法matlab程序实现(转载)

    标准差分进化算法matlab程序实现 自适应差分演化算法方面的Matlab和C++代码及论文 差分进化算法 DE-Differential Evolution matlab练习程序(差异演化DE) [ ...

  2. 差分进化算法 DE-Differential Evolution

    差分进化算法 (Differential Evolution)   Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化 ...

  3. 差分进化算法(DE)的C++面向对象方法实现

    代码来源于网络,写得非常棒 /*DE_test *对相应的Matlab程序进行测试 */ #include <iostream> #include <cmath> #inclu ...

  4. 差分进化算法-python实现

    DEIndividual.py import numpy as np import ObjFunction class DEIndividual: ''' individual of differen ...

  5. Python遗传和进化算法框架(一)Geatpy快速入门

    https://blog.csdn.net/qq_33353186/article/details/82014986 Geatpy是一个高性能的Python遗传算法库以及开放式进化算法框架,由华南理工 ...

  6. [Evolutionary Algorithm] 进化算法简介

    进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...

  7. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  8. 蚁群算法和简要matlab来源

    1 蚁群算法原理 从1991由意大利学者 M. Dorigo,V. Maniezzo 和 A. Colorni 通过模拟蚁群觅食行为提出了一种基于群体的模拟进化算法--蚁群优化.极大关注,蚁群算法的特 ...

  9. geatpy - 遗传和进化算法相关算子的库函数(python)

    Geatpy The Genetic and Evolutionary Algorithm Toolbox for Python Introduction Website (including doc ...

随机推荐

  1. Git 高级用法,你会了吗?

    请注意我有意跳过了 git commit.git pull/push 之类的基本命令,这份小抄的主题是 git 的一些「高级」用法. 导航 -- 跳到之前的分支 git checkout - 查看历史 ...

  2. 如何轻松使用 C 语言实现一个栈?​

    什么是数据结构? 数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数 ...

  3. 程序员,想被别人发掘?那你有 freestyle 吗?

    程序员群体是偏内向的,整天和计算机打交道,用代码说话,接受任务,默默工作. 如果这些任务是有挑战性的还行,你的工作成果就能帮你说话,可是大部分工作都是普普通通的,甚至有点儿重复性的劳动. 这个时候表面 ...

  4. 【最大匹配+二分答案】HDU 2236 无题II

    题目内容 这是一个简单的游戏,在一个\(n×n\)的矩阵中,找\(n\)个数使得这\(n\)个数都在不同的行和列里并且要求这\(n\)个数中的最大值和最小值的差值最小. 输入格式 输入一个整数\(T\ ...

  5. Linux下批量kill掉进程

    ps -ef|grep java|grep -v grep|cut -c 9-15|xargs kill -9 管道符"|"用来隔开两个命令,管道符左边命令的输出会作为管道符右边命 ...

  6. C#中的SqlBulkCopy批量插入数据

    在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// < ...

  7. Business Partner - 供应商与客户的集成 - S/4HANA(1)

    本文基于S/4HANA 1511版本,同时大部分内容适用于S/4HANA i.e1610/1709/1809. 本文旨在为全新实施的BP配置,或从ECC到S/4HANA的供应商客户主数据迁移提供信息支 ...

  8. 如何高效定义和验证restful请求的参数

    go-zero针对文本的序列化和反序列化主要在三个地方使用 http api请求体的反序列化 http api返回体的序列化 配置文件的反序列化 完整示例可参照下面这篇文章: 快速构建高并发微服务 1 ...

  9. python 实现多层列表拆分成单层列表

    有个多层列表:[1, 2, 3, 4, [5, 6, [7, 8]], ['a', 'b', [2, 4]]],拆分成单层列表 使用内置方法 结果和原列表顺序不同 def split(li): pop ...

  10. HashMap的理解

    Hashmap的实现原理 默认它是存放了16个链表头的数组,存储数据的时候key先生成hashcode,根据hashcode把数据存放到相应链表中,那么是如何确定存放到哪个链表中的呢?采用hashco ...