原理

介绍

介绍

  • 种群初始化:初代染色体,[x_min,x_max)之间的符合均匀分布的随机数
  • 变异:染色体(解向量)做差分运算;使用种群中三条不同的染色体结合变异因子做差分运算,形成变异染色体;考虑了种群染色体信息
  • 交叉复制:变异染色体和原染色体交叉复制;使用交叉因子交叉染色体中的基因,剩下基因直接复制,形成交叉复制染色体;考虑了种群基因信息
  • 选择:比较交叉复制染色体和原染色体选择适应度高的染色体作为下代染色体,考虑了种群历史信息

建模

变异:
v m ( g + 1 ) = x r 1 ( g ) + F ⋅ ( x r 2 ( g ) − x r 3 ( g ) ) s . t . m ≠ r 1 ≠ r 2 ≠ r 3 备 注 : { m 为 染 色 体 序 号 F 为 变 异 因 子 g 为 第 几 代 , 迭 代 次 数 x r 1 第 r 1 条 染 色 体 v m ( g + 1 ) 为 变 异 后 的 第 m 条 染 色 体 \begin{aligned} v_m(g+1)=x_{r1}(g)+F\cdot(x_{r2}(g)-x_{r3}(g)) \\ s.t.\ m\neq r1\neq r2 \neq r3 \\ 备注: \begin{cases} m为染色体序号 \\ F为变异因子 \\ g为第几代,迭代次数 \\ x_{r1}第r1条染色体 \\ v_m(g+1)为变异后的第m条染色体 \end{cases} \end{aligned} vm​(g+1)=xr1​(g)+F⋅(xr2​(g)−xr3​(g))s.t. m​=r1​=r2​=r3备注:⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​m为染色体序号F为变异因子g为第几代,迭代次数xr1​第r1条染色体vm​(g+1)为变异后的第m条染色体​​
交叉:
u m , n ( g + 1 ) = { v m , n ( g + 1 ) , i f c r r a n d [ 0.0 , 1.0 ) ≤ C R o r j r a n d i n t [ 0 , D ) = n x m , n ( g ) , o t h e r w i s e 备 注 : { m : 第 m 条 染 色 体 , 矩 阵 行 n : 第 n 个 基 因 , 矩 阵 列 D : 染 色 体 向 量 维 数 C R : 交 叉 因 子 u m , n ( g + 1 ) : 交 叉 复 制 染 色 体 , 交 叉 复 制 结 果 染 色 体 v m , n ( g + 1 ) : 变 异 染 色 体 x m , n ( g ) : 原 染 色 体 \begin{aligned} u_{m,n}(g+1)= \begin{cases} v_{m,n}(g+1),\ if\ cr_{rand[0.0, 1.0)}\leq CR\ or\ j_{randint[0,D)}=n \\ x_{m,n}(g),\ otherwise \end{cases} \\ 备注: \begin{cases} m: 第m条染色体,矩阵行 \\ n: 第n个基因,矩阵列 \\ D:染色体向量维数 \\ CR: 交叉因子 \\ u_{m,n}(g+1): 交叉复制染色体,交叉复制结果染色体 \\ v_{m,n}(g+1): 变异染色体 \\ x_{m,n}(g): 原染色体 \end{cases} \end{aligned} um,n​(g+1)={vm,n​(g+1), if crrand[0.0,1.0)​≤CR or jrandint[0,D)​=nxm,n​(g), otherwise​备注:⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​m:第m条染色体,矩阵行n:第n个基因,矩阵列D:染色体向量维数CR:交叉因子um,n​(g+1):交叉复制染色体,交叉复制结果染色体vm,n​(g+1):变异染色体xm,n​(g):原染色体​​

选择:
x m ( g + 1 ) = { u m ( g + 1 ) , i f f i t n e s s ( u m ( g + 1 ) ) ≤ f i t n e s s ( x m ( g ) ) x m ( g ) , o t h e r w i s e 备 注 : { f i t n e s s : 适 应 度 , 根 据 目 标 函 数 得 出 x m ( g + 1 ) : 第 m 条 下 一 代 染 色 体 \begin{aligned} x_m(g+1)= \begin{cases} u_m(g+1),\ if\ fitness(u_m(g+1))\leq fitness(x_m(g)) \\ x_m(g),\ otherwise \end{cases} \\ 备注: \begin{cases} fitness: 适应度,根据目标函数得出 \\ x_m(g+1):第m条下一代染色体 \end{cases} \end{aligned} xm​(g+1)={um​(g+1), if fitness(um​(g+1))≤fitness(xm​(g))xm​(g), otherwise​备注:{fitness:适应度,根据目标函数得出xm​(g+1):第m条下一代染色体​​

注意

适应度函数选择

  • 本文选择目标函数F1作为适应度函数,因此适应度越小越好
  • 本文DE算法select过程中适应度小的子代解会被保留

一次迭代后记录适应度最大还是最小解

  • 由于目标函数F1且select过程中适应度小的子代解会被保留,因此一次迭代后记录适应度最小的解

代码

步骤:

  1. 种群初始化:初代染色体,[x_min,x_max)之间的符合均匀分布的随机数
  2. 变异:染色体(解向量)做差分运算;使用种群中三条不同的染色体结合变异因子做差分运算,形成变异染色体;考虑了种群染色体信息
  3. 交叉复制:变异染色体和原染色体交叉复制;使用交叉因子交叉染色体中的基因,剩下基因直接复制,形成交叉复制染色体;考虑了种群所有基因信息
  4. 选择:比较交叉染色体和原染色体选择适应度高的染色体作为下代染色体
import numpy as np
import matplotlib
import matplotlib.pyplot as pltmatplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 10def F1(x):"""F1函数:param x: 粒子当前位置 一个解4维:return: 适应度"""return np.sum(x ** 2)class Population(object):"""种群"""def __init__(self, x, v, u):"""初始化:param x: 初始种群:param v: 变异种群:param u: 交叉种群"""self.x = xself.v = vself.u = uclass DifferentialEvolution(object):"""差分进化算法"""def __init__(self, iter_num, fitness_end, x_min, x_max, NP, D, F0, CR):"""初始化:param iter_num: 迭代次数 进化代数:param fitness_end: 截止适应度:param x_min: 下限,变异交叉复制之后的染色体,不在上下限之间则重新初始化:param x_max: 上限:param NP(number population): 种群中个体数量:param D(dimension): 染色体维度 一条染色体一个解 解的维度:param F0: 初始变异因子:param CR: 交叉因子"""# 终止条件self.iter_num = iter_numself.fitness_end = fitness_end# 解空间self.x_min = x_minself.x_max = x_max# 求解者self.NP = NPself.D = D# 算法参数self.F0 = F0self.CR = CR# 存放个体目标函数值(父辈)self.fitnesss = np.zeros(self.NP)# 存放个体目标函数值(子代)self.fitnesss_son = np.zeros(self.NP)# 记录每次迭代的最小适应值self.fitness_list = []def initialize_population(self):"""初始化种群:return:"""# 初始种群x = np.zeros((self.NP, self.D))# 变异种群v = np.zeros((self.NP, self.D))# 选择种群u = np.zeros((self.NP, self.D))# 赋初值 [x_min,x_max)之间的符合均匀分布的随机数,(数量,维数)x = np.random.uniform(self.x_min, self.x_max, (self.NP, self.D))# 适应度计算for i in range(self.NP):self.fitnesss[i] = F1(x[i, :])self.fitness_list.append(np.min(self.fitnesss))return Population(x, v, u)def evolve(self, population):"""evolution 进化:param: population: 种群:return:"""for gen in range(self.iter_num):# 变异self.mutate(gen, population)# 交叉复制self.cross_copy(population)# 选择self.select(population)# 保存最佳适应度self.fitness_list.append(min(self.fitnesss))print('第', gen + 1, '迭代的最佳适应度:', self.fitness_list[-1])# 退出条件if self.fitness_list[-1] < self.fitness_end:break# 取出最佳基因best_chromosome = population.x[np.argmin(self.fitnesss), :]return best_chromosome, self.fitness_listdef mutate(self, gen, population):"""mutation 变异:param: gen: 当前代:param: population: 种群:return:"""# F自适应变异算子## 随着迭代次数增加f_gen趋近于0f_gen = np.exp(1 - self.iter_num / (self.iter_num + 1 - gen))## np.power(2, f_gen): 2的f_gen次方## 随着迭代次数增加np.power(2, f_gen)趋近于1, F从接近2倍F0到F0(F0=0.4)F = self.F0 * np.power(2, f_gen)# 变异每个个体for m in range(self.NP):# [0, self.NP) 1取一个值r1 = np.random.randint(0, self.NP, 1)# r1不取mwhile r1 == m:r1 = np.random.randint(0, self.NP, 1)r2 = np.random.randint(0, self.NP, 1)# r2不取m和r1while (r2 == m) or (r2 == r1):r2 = np.random.randint(0, self.NP, 1)r3 = np.random.randint(0, self.NP, 1)# r3不取m,r1和r2while (r3 == m) or (r3 == r2) or (r3 == r1):r3 = np.random.randint(0, self.NP, 1)# 存放变异后种群population.v[m, :] = population.x[r1, :] + F * (population.x[r2, :] - population.x[r3, :])def cross_copy(self, population):"""crossover_copy 交叉复制交叉所有基因,一列基因复制所有基因,一列基因:param: population: 种群:return:"""# 随机交叉染色体的某个维度j = np.random.randint(0, self.D, 1)for m in range(self.NP):for n in range(self.D):# cr输入 [0,1)cr = np.random.random()# 交叉if (cr < self.CR) or (n == j):# 赋值为变异维度元素population.u[m, n] = population.v[m, n]# 复制else:# 赋值为原始维度元素population.u[m, n] = population.x[m, n]# 边界处理for m in range(self.NP):for n in range(self.D):# 元素值(基因)不在最小值最大值之间,则重新初始化该元素if (population.u[m, n] < self.x_min) or (population.u[m, n] > self.x_max):population.u[m, n] = np.random.uniform(self.x_min, self.x_max)def select(self, population):"""selection 选择:param: population: 种群:return:"""# 遍历每一条基因,计算子代个体适应度值for m in range(self.NP):self.fitnesss_son[m] = F1(population.u[m, :])# 遍历每一条基因,for m in range(self.NP):# 子代染色体适应度<父代染色体适应度,使用交叉复制后的染色体uif self.fitnesss_son[m] < self.fitnesss[m]:population.x[m, :] = population.u[m, :]# 重新计算当代染色体适应度for m in range(self.NP):self.fitnesss[m] = F1(population.x[m, :])def show(self, best_chromosome, fitness_list):"""展示迭代过程:param best_chromosome: 最优染色体:param fitness_list: 每次迭代适应度值:return:"""print("最优基因:", str(best_chromosome))print("最优解:", str(fitness_list[-1]))plt.title("迭代过程")plt.xlabel("迭代次数")plt.ylabel("适应度")x = range(1, len(fitness_list) + 1)y = fitness_listplt.plot(x, y, label="DE")plt.legend()plt.show()if __name__ == '__main__':de = DifferentialEvolution(100, 10e-6, 20, -20, 50, 10, 0.4, 0.1)population = de.initialize_population()best_chromosome, fitness_list = de.evolve(population)de.show(best_chromosome, fitness_list)

启发式算法/差分进化算法相关推荐

  1. 差分进化算法_特邀嘉宾 | 科普差分进化算法(创新奇智运筹优化算法工程师朱小龙博士)...

    文案:段克邪 排版:随心390 hello,大家好.各位可点击此处,访问公众号官方店铺.谨防上当受骗,感谢各位支持! 今天我们有幸请到创新奇智运筹优化算法工程师朱小龙博士为大家科普差分进化算法,本次推 ...

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

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

  3. 【论文阅读】基于自适应小生境和 k 均值操作的数据聚类差分进化算法

    文章目录 原文题目 摘要 I. 引言 背景知识 Niching(小生境) 适应度共享 参考文献 提出 Niching Method 的动机 Niching Method 需要 Adaptive 的动机 ...

  4. 一文了解差分进化算法的前世今生

    文章目录 综合表现 流程概述 初始化 变异 交叉 选择 算法特点 算法改进 变异算子 种群数量 N P NP NP 缩放因子 F F F和变异率 C r Cr Cr 改进DE排名 发展方向 超参数改进 ...

  5. 2018-4-7 差分进化算法

    首先差分进化算法是进化算法的一种,它包括变异,交叉,选择,边界检测. 来源: 差分进化算法_百度百科 https://baike.baidu.com/item/%E5%B7%AE%E5%88%86%E ...

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

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

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

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

  8. 差分进化算法_OPTIMUS软件功能特性介绍【全局优化算法模块】

    导读:面向应用工程师的商业软件咨询.自研软件定制开发服务的仿真公众号,点击关注进入菜单,查看更多精彩内容. OPTIMUS提供自适应进化算法(Self-adaptive Evolution),从用户给 ...

  9. 遗传算法 差分进化算法 粒子群优化算法区别

    一 遗传算法 遗传算法(GA)作为一种经典的进化算法,自 Holland提出之后在国际上已经形成了一个比较活跃的研究领域. 人们对 GA 进行了大量的研究,提出了各种改进算法用于提高算法的收敛速度和精 ...

最新文章

  1. 2. 离散特征处理方法--特征交叉 feature crosses
  2. Java注解Annotation的基本概念
  3. ie网络集合代理无法启动_网络故障诊断70例!经典老文了!
  4. 桌面计算机硬盘打不开,我电脑的磁盘打不开,是什么问题?
  5. Bookshelf 2
  6. SQL注入问题及预防方法
  7. 九年级数学解方程50道_初中数学公式中考知识点总结,初三数学上册,九年级数学上册...
  8. android imageview图片旋转动画,Android 安卓动画 属性动画 - 旋转动画
  9. Golang-import-introduce
  10. mysql jsp分页技术_一个非常简单的分页技术MYSQL JSP 利用了mysql的LIMIT参数
  11. 关于static继承的问题
  12. 如何搭建一个spring boot项目
  13. SpringCloud--Eureka 注册中心原理及其搭建
  14. LeetCode--path sum ii
  15. Android笔记:触摸事件的分析与总结----TouchEvent处理机制
  16. 对软件未来走向的看法
  17. linux环境Mechanize安装,在linux下安装activepython2.5 setuptools ClientCookie
  18. Google桌面搜索和百度硬盘搜索索引停滞的原因
  19. h5侠客行服务器维护有更新什么,侠客行h5转生条件大全及转生激励说明
  20. 02139 计算机信息检索[成都理工大学自考复习]

热门文章

  1. Java习题练习:超大玉螺旋丸
  2. -3243:不能同时包含聚集KEY和大字段
  3. Python数据库操作(详细步骤)
  4. 这款QLED电视机实用性怎么样,一起来了解一下
  5. 关于缓存异常:缓存雪崩、击穿、穿透的解决方案
  6. css中设置首行文本缩进的属性是,css如何设置首行文字缩进?
  7. 普歌-码灵团队-System类,StringBuilder类的常用方法详解
  8. SpringBoot实战项目教程----springboot天猫整站
  9. iOS开发之如何不使用系统的密码自动填充(如何禁用系统键盘使用第三方搜狗键盘)
  10. ASM mov指令与lea指令的区别