Python scipy实现差分进化算法
作者:微小冷
差分进化算法
差分进化算法是广义的遗传算法的一种,核心思想是变异,具体原理可见:Python实现差分进化算法,本文将要介绍的则是著名的scipy库中对差分进化算法的实现。
在scipy.optimize中实现了差分进化算法,其函数的封装形式为
scipy.optimize.differential_evolution(func, bounds, args=(), strategy='best1bin', maxiter=1000, popsize=15, tol=0.01, mutation=(0.5, 1), recombination=0.7, seed=None, callback=None, disp=False, polish=True, init='latinhypercube', atol=0, updating='immediate', workers=1, constraints=(), x0=None, *, integrality=None, vectorized=False)
其中,只有func和bound为必选参数,代表将要优化的函数和解的范围。由于differential_evolution太长,后文统一用加粗的de表示。
func:格式为func(x, *args)的函数,其中args即为de中输入的args
bounds为随机数的生成范围
strategy为变异策略
maxiter 最大代数
popsize 总体大小
tol 容忍度
atol 绝对容忍度
mutation 突变常数,当为元组**(a,b)时,表示突变常数是a,b**之间的随机数
recombination 交叉常数
seed 随机数种子,设置之后可保证结果的可复现性
disp 为True时可输出迭代信息
callback 算法执行完成后的迭代函数
polish 为True时,在迭代的最后,会调用L-BFGS-B算法对最优参数进一步优化
变异策略是差分进化算法的核心,在de函数中,共提供了12种方案:
向量选择方式 | bin | exp |
---|---|---|
best | best1bin,best2bin | best2exp, best1exp |
rand | rand1bin,rand2bin | rand1exp, rand2exp |
randtobest | randtobest1bin | randtobest1exp, |
currenttobest | currenttobest1bin | currenttobest1exp |
向量选择方式,选择的是在哪个向量的基础上进行变异,best表示在当前最佳样本上变异;rand表示随机选择个体进行变异;current-to-best表示对父个体进行偏向最佳值的修正,然后在此基础上进行变异;同理,rand-to-best表示在随机个体上进行偏向最佳值的修正,然后再变异。
bin和exp为随机数的生成方案,前者表示生成二项分布随机数,后者表示指数分布随机数。
中间的数字表示用于产生突变的个体数。
测试
接下来,测试一下
import numpy as np from scipy.optimize import differential_evolution as de def test(xs): _sum = 0.0 for i in range(len(xs)): _sum = _sum + np.cos((xs[i]*i)/5)*(i+1) return _sum bounds = [[-15,15] for _ in range(5)] ret = de(test, bounds) msg = f"全局最小值" + ", ".join([f"{x:.4f}" for x in ret.x]) msg += f"\nf(x)={ret.fun:.4f}" print(msg)
结果为
全局最小值-1.6584, -15.0000, -7.8540, -5.2360, -3.9270
f(x)=-12.9800
到此这篇关于Python scipy实现差分进化算法的文章就介绍到这了,更多相关Python scipy内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!