python人工智能算法之差分进化算法的实现
作者:微小冷
DE基于GA,正如进化基于遗传,和遗传算法相比,差分进化引入了差分变异模式,相当于开辟了一条崭新的进化路径,下面就来看看差分优化算法是如何实现的吧
遗传算法: 纯Python实现遗传算法
DE基于GA,正如进化基于遗传。和遗传算法相比,差分进化引入了差分变异模式,相当于开辟了一条崭新的进化路径。
初始化
首先,初始种群随机产生解空间(L,R)范围的向量
(0)表示第0代。
变异
初始化后,进行变异操作,其第t tt代变异向量为
vi(t)=xr1(t)+rand⋅(xr2(t)−xr3(t))
其中r1,r2,r3为随机挑选出的与i ii互不相同的序号,相当于随机抽选三个值进行基因突变。
交叉
接下来,开始种群繁衍,即种群交叉
其中,r为随机数,cr是预设的交叉概率因子;rj为随机生成的某个整数,代表第rj个分量必为突变分量。
选择
最后,进行下一代的选择,就是在目标个体和实验个体中,选择最优秀的那个。
xi(t+1)=argmin(ui(t),xi(t))
Python实现
首先,做一个DE算法的迭代函数
import numpy as np from random import sample, randint, random def 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.0 for i in range(len(xs)): _sum = _sum + np.cos((xs[i]*i)/5)*(i+1) return _sum if __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差分进化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!