【scipy】在Python中调用差分进化算法

本文介绍了Python中使用scipy库实现差分进化算法进行优化问题求解的过程。差分进化算法是一种基于变异策略的全局优化方法,核心思想包括变异、交叉和选择。在scipy.optimize.differential_evolution函数中,详细阐述了各个参数的意义,如func、bounds、strategy、maxiter等,并提供了12种不同的变异策略。通过一个简单的测试案例展示了如何运用该算法寻找多变量函数的全局最小值,最终得到解的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

差分进化算法

差分进化算法是广义的遗传算法的一种,核心思想是变异,具体原理可见: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)

其中,只有funcbound为必选参数,代表将要优化的函数和解的范围。由于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 算法执行完成后的迭代函数
  • polishTrue时,在迭代的最后,会调用L-BFGS-B算法对最优参数进一步优化

变异策略是差分进化算法的核心,在de函数中,共提供了12种方案:

向量选择方式binexp
bestbest1bin,best2binbest2exp, best1exp
randrand1bin,rand2binrand1exp, rand2exp
randtobestrandtobest1binrandtobest1exp,
currenttobestcurrenttobest1bincurrenttobest1exp

向量选择方式,选择的是在哪个向量的基础上进行变异,best表示在当前最佳样本上变异;rand表示随机选择个体进行变异;current-to-best表示对父个体进行偏向最佳值的修正,然后在此基础上进行变异;同理,rand-to-best表示在随机个体上进行偏向最佳值的修正,然后再变异。

binexp为随机数的生成方案,前者表示生成二项分布随机数,后者表示指数分布随机数。

中间的数字表示用于产生突变的个体数。

测试

接下来,测试一下

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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值