差分进化算法及其Python实现
文章目录
- 初始化
- 变异
- 交叉
- 选择
- Python实现
- 测试
遗传算法: 纯Python实现遗传算法
DE基于GA,正如进化基于遗传。和遗传算法相比,差分进化引入了差分变异模式,相当于开辟了一条崭新的进化路径。
初始化
首先,初始种群随机产生解空间(L,R)(L,R)(L,R)范围的向量
x⃗i(0)=rand(L,R)\vec x_i(0)=\operatorname{rand}(L,R) xi(0)=rand(L,R)
(0)
表示第0
代。
变异
初始化后,进行变异操作,其第ttt代变异向量为
vi(t)=xr1(t)+rand⋅(xr2(t)−xr3(t))v_i(t)=x_{r_1}(t)+\operatorname{rand}\cdot (x_{r_2}(t)-x_{r_3}(t)) vi(t)=xr1(t)+rand⋅(xr2(t)−xr3(t))
其中r1,r2,r3r_1, r_2, r_3r1,r2,r3为随机挑选出的与iii互不相同的序号,相当于随机抽选三个值进行基因突变。
交叉
接下来,开始种群繁衍,即种群交叉
uij(t)={vij(t),r<crorj==rjxij(t)u^j_i(t)=\left\{\begin{aligned} &v^j_i(t), &r<cr\quad or\quad j==r_j\\ &x^j_i(t) \end{aligned}\right. uij(t)={vij(t),xij(t)r<crorj==rj
其中,rrr为随机数,crcrcr是预设的交叉概率因子;rjr_jrj为随机生成的某个整数,代表第rjr_jrj个分量必为突变分量。
选择
最后,进行下一代的选择,就是在目标个体和实验个体中,选择最优秀的那个。
xi(t+1)=arg min(ui(t),xi(t))x_i(t+1)=\argmin(u_i(t), x_i(t)) xi(t+1)=argmin(ui(t),xi(t))
Python实现
首先,做一个DE算法的迭代函数
import numpy as np
from random import sample, randint, randomdef evolve(xs,cr,func):# 变异vs = []N = len(xs[0])for _ in range(len(xs)):x = xs.pop(0)r1, r2, r3 = sample(xs, 3)xs.append(x)vs.append(r1 + random()*(r2-r3))# 交叉us = []for i in range(len(xs)):us.append(vs[i] if random() < cr else xs[i])j = randint(0, N-1)us[i][j] = vs[i][j]# 选择xNext = []for x,u in zip(xs, us):xNext.append(x if func(x)<func(u) else u)return xNext
其中,变异过程要求随机则取三个不同的个体,并且这个个体不能是当前个体,所以采取的方案是先弹出当前个体,再从里面随机挑选三个,最后再将当前个体放回去。
交叉过程通过两个随机数,来决定下一代的成分。首先是通过浮点型随机数来决定是用原有的解还是用新解;然后用一个整型随机数,来判定采取变异解的元素序号。
然后写出主循环
# N为个体数;nDim为解维度;nIter为迭代次数
def de(N, nDim, xRange, cr, func, nIter):xs = [uniRand(*xRange, nDim) for _ in range(N)]for _ in range(nIter):xs = evolve(xs, cr, func)fs = [func(x) for x in xs]xBest = xs[np.argmin(fs)]msg = f"当前最优结果为{np.min(fs)},参数为"msg += ", ".join([f"{x:.4f}" for x in xBest])print(msg)
测试
最后写个函数测试一下
def test(xs):_sum = 0.0for i in range(len(xs)):_sum = _sum + np.cos((xs[i]*i)/5)*(i+1)return _sumif __name__ == "__main__":de(20, 5, (-5,5), 0.5, test, 100)
最终效果为
>python de.py
当前最优结果为-12.864706361994342,参数为6.2566, 15.7407, 148.7103, 193.4160, 3.9136
差分进化算法及其Python实现相关推荐
- 差分进化算法python_差分进化算法Python实现
本文you清华大学硕士大神金天撰写,欢迎大家转载,不过请保留这段版权信息,对本文内容有疑问欢迎联系作者微信:jintianiloveu探讨,多谢合作~ 导语 差分进化算法是一种寻优算法,提出时间比遗传 ...
- 【进阶一】Python实现MDCVRP常见求解算法——差分进化算法(DE)
基于python语言,实现差分进化算法(DE)对多车场车辆路径规划问题(MDCVRP)进行求解. 目录 往期优质资源 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. 分步实现 6 ...
- Python实现VRP常见求解算法——差分进化算法(DE)
基于python语言,实现经典差分进化算法(DE)对车辆路径规划问题(CVRP)进行求解. 目录 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实现 6. 完整代码 参考 ...
- 【进阶二】Python实现VRPTW常见求解算法——差分进化算法(DE)
基于python语言,实现经典差分进化算法(DE)对带有时间窗的车辆路径规划问题( VRPTW )进行求解. 目录 往期优质资源 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. ...
- 【进阶四】Python实现(MD)HVRP常见求解算法——差分进化算法(DE)
差分进化算法+Split 求解异构车辆路径规划问题 碧海蓝天 吹吹风 目录 信息传递 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. 分步实现 6. 完整代码 参考 信息传递 p ...
- python差分进化算法_Python实现的差分进化算法源代码
使用Python实现的差分进化算法,引用到Numpy和Scipy,可以支持多核与集群并行计算.使用时只需继承DESolver并定义函数def error_func(self, indiv, *args ...
- Python实现DE差分进化算法优化支持向量机分类模型(SVC算法)项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 差分进化算法(Differential Evolution,DE ...
- 差分进化算法_特邀嘉宾 | 科普差分进化算法(创新奇智运筹优化算法工程师朱小龙博士)...
文案:段克邪 排版:随心390 hello,大家好.各位可点击此处,访问公众号官方店铺.谨防上当受骗,感谢各位支持! 今天我们有幸请到创新奇智运筹优化算法工程师朱小龙博士为大家科普差分进化算法,本次推 ...
- 智能优化算法之 差分进化算法
差分进化算法原理 差分进化算法是一种随机的启发式搜索算法,简单易用,有较强的鲁棒性和全局搜索能力. 差分进化算法是一种自组织最小化方法,利用种群中随机选择的不同向量来干扰一个现有向量,种群中的每个向量 ...
最新文章
- SAP MM 物料主数据MRP2 视图Rounding Value字段
- [PHP打野] 对pear-FSM的研究(一)基本了解
- java大文件 索引_JAVA 大文件上传解决方案(500M以上)
- 深入理解Spark 2.1 Core (七):Standalone模式任务执行的原理与源码分析
- Redis 与 Memcached的区别
- [css] 解释下css3的flexbox(弹性盒布局模型),以及它应用场景有哪些?
- 在Winform的DataGridView的单元格中同时显示文本和图标,以及树形结构的示例
- (动态规划 最长有序子序列)Monkey and Banana --HDU --1069
- Python人脸识别之——创建csv文件 create_csv.py 代码 Python3.7
- python3+selenium入门03-操作谷歌浏览器
- java经常用到的英文_Java中用到的英文单词,你知道多少?
- 修改浏览器的默认最小字号限制(以chrome为例)
- 乐高机器人巡线C语言程序,乐高机器人巡线原理.doc
- win10下虚拟机VMware极简安装PhoenixOS
- ArcGIS根据矢量图层范围裁剪影像
- Linux找回删除文件
- 实战sqlmap绕过WAF(中转注入)
- android edittext怎么输入中文,为什么android中edittext不能输入中文
- vbs整人简单实现大量弹窗+指定语句退出!
- 企业上云,如何给网站提速?CDN加速一定要知道