引言


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

差分进化算法的原理


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

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

差分进化算法流程


具体步骤如下:

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

实例:

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

  1. %%%%%%%差分进化求函数极值%%%%%%%%%
  2. %%%%%%%初始化%%%%%%%%
  3. clear all;
  4. close all;
  5. clc;
  6. NP = 50; %种群的数量
  7. D = 10; %变量的维度
  8. G = 200; %最大进化代数
  9. F0 = 0.4; %初始变异算子
  10. CR = 0.1; %交叉算子
  11. Xs = 20; %上限
  12. Xx = -20; %下限
  13. yz = 10^-6; %阈值
  14. %%%%%%%%赋初值%%%%%%%%%%%%
  15. x = zeros(D,NP); %初始种群
  16. v = zeros(D,NP); %变异种群
  17. u = zeros(D,NP); %选择种群
  18. x = rand(D,NP) * (Xs-Xx) + Xx; %赋初值
  19. %%%%%%%%%%计算目标函数%%%%%%%%%%%
  20. for m = 1:NP
  21. Ob(m) = func1(x(:,m));
  22. end
  23. trace(1) = min(Ob);
  24. %%%%%%%%%差分进化循环%%%%%%%%%%
  25. for gen = 1:G
  26. %%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%
  27. %%%%%%%%%%%自适应变异算子%%%%%%%
  28. lamda = exp(1-G/(G+1-gen));
  29. F = F0*2^(lamda);
  30. %%%%%%%%r1,r2,r3m互不相同%%%%
  31. for m = 1:NP
  32. r1 = randi([1,NP],1,1);
  33. while(r1 == m)
  34. r1 = randi([1,NP],1,1);
  35. end
  36. r2 = randi([1,NP],1,1);
  37. while (r2 == m) | (r2 == r1)
  38. r2 = randi([1,NP],1,1);
  39. end
  40. r3 = randi([1,NP],1,1);
  41. while (r3 == m) | (r3 == r1 | r3 == r2)
  42. r3 = randi([1,NP],1,1);
  43. end
  44. v(:,m) = x(:,r1) + F * (x(:,r2) - x(:,r3));
  45. end
  46. %%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%
  47. r = randi([1,NP],1,1); %确保必有一个v(:)进入u(:)中
  48. for n = 1:D
  49. cr = rand(1);
  50. if (cr <= CR) | (n == r)
  51. u(n,:) = v(n,:); %批量操作,替换所有个体第n
  52. else
  53. u(n,:) = x(n,:);
  54. end
  55. end
  56. %%%%%%%%%%%%%%%%边界条件的处理%%%%%%%%%%%%%%%
  57. for n = 1:D
  58. for m = 1:NP
  59. if (u(n,m) < Xx) | (u(n,m) > Xs)
  60. u(n,m) = rand * (Xs - Xx) + Xx;
  61. end
  62. end
  63. end
  64. %%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%
  65. for m = 1:NP
  66. Ob1(m) = func1(u(:,m));
  67. end
  68. for m = 1:NP
  69. if Ob1(m) < Ob(m)
  70. x(:,m) = u(:,m);
  71. end
  72. end
  73. for m = 1:NP
  74. Ob(m) = func1(x(:,m));
  75. end
  76. trace(gen+1) = min(Ob);
  77. if min(Ob) < yz
  78. break;
  79. end
  80. end
  81. %%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%
  82. figure
  83. plot(trace);
  84. xlabel('迭代次数');
  85. ylabel('目标函数值');
  86. title('DE目标函数曲线');
  87. %%%%%%%%%%%%%%适应度函数%%%%%%%%%%
  88. function result = func1(x)
  89. summ = sum(x.^2);
  90. result = summ;
  91. 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. c3算法

    # L(G) = [G] + [O] # G = [O] # = GO # L[E] = EO # L[F] = [F] + [GO] # F = [GO] # = FGO # L[B] = [B] ...

  2. golang的http库使用代理

    1.先上代码 package main import ( "crypto/tls" "flag" "fmt" "io/ioutil ...

  3. 【编程学习笔记】如何组织构建多文件 C 语言程序!编程也有~

    优秀 Unix 程序哲学 首先,你要知道这个 C 程序是一个 Unix 命令行工具.这意味着它运行在(或者可被移植到)那些提供 Unix C 运行环境的操作系统中.当贝尔实验室发明 Unix 后,它从 ...

  4. 51Nod 最大M子段和系列 V1 V2 V3

    前言 \(HE\)沾\(BJ\)的光成功滚回家里了...这堆最大子段和的题抠了半天,然而各位\(dalao\)们都已经去做概率了...先%为敬. 引流之主:老姚的博客 最大M子段和 V1 思路 最简单 ...

  5. fastdfs之同一台storage server下包含多个store path

    一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...

  6. WebSocket的理解

    Websocket相对于无状态的HTTp协议,是在一次成功连接之后,在关闭请求之前,服务器和客户端能顺利进行信息传输.而不用像HTTP那样每一次都要告诉服务器这个请求者是谁(身份鉴别信息). 在HTT ...

  7. Asp.Net实现局部刷新,ScriptManager和UpdatePanel控件的使用

    <asp:CheckBoxList ID="LimitCollegeNo" runat="server" CellPadding="5" ...

  8. OpenCV计算机视觉学习(7)——图像金字塔(高斯金字塔,拉普拉斯金字塔)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本节 ...

  9. frida框架hook参数获取方法入参模板

    python脚本 # -*- coding: utf-8 -*- import logging import frida import sys logging.basicConfig(level=lo ...

  10. vue watch的用法

    1.监听对象需要深度监听 ,如下代码可以监听整个msg对象的变化 watch: { msg: { handler(newValue, oldValue) { console.log(newValue) ...