最优化方法:bfgs源码_bfgs算法代码

hacker|
93

文章目录:

Python怎么做最优化

一、概观scipy中的optimize子包中提供了常用的最优化算法函数实现。我们可以直接调用这些函数完成我们的优化问题。optimize中函数最典型的特点就是能够从函数名称上看出是使用了什么算法。下面optimize包中函数的概览:1.非线性最优化fmin -- 简单Nelder-Mead算法fmin_powell -- 改进型Powell法fmin_bfgs -- 拟Newton法fmin_cg -- 非线性共轭梯度法fmin_ncg -- 线性搜索Newton共轭梯度法leastsq -- 最小二乘2.有约束的多元函数问题fmin_l_bfgs_b ---使用L-BFGS-B算法fmin_tnc ---梯度信息fmin_cobyla ---线性逼近fmin_slsqp ---序列最小二乘法nnls ---解|| Ax - b ||_2 for x=03.全局优化anneal ---模拟退火算法brute --强力法4.标量函数fminboundbrentgoldenbracket5.拟合curve_fit-- 使用非线性最小二乘法拟合6.标量函数求根brentq ---classic Brent (1973)brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出这个算法的人名bisect ---二分法newton ---牛顿法fixed_point7.多维函数求根fsolve ---通用broyden1 ---Broyden’s first Jacobian approximation.broyden2 ---Broyden’s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixingexcitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.实用函数line_search ---找到满足强Wolfe的alpha值check_grad ---通过和前向有限差分逼近比较检查梯度函数的正确性二、实战非线性最优化fmin完整的调用形式是:fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不过我们最常使用的就是前两个参数。一个描述优化问题的函数以及初值。后面的那些参数我们也很容易理解。如果您能用到,请自己研究。下面研究一个最简单的问题,来感受这个函数的使用方法:f(x)=x**2-4*x+8,我们知道,这个函数的最小值是4,在x=2的时候取到。from scipy.optimize import fmin #引入优化包def myfunc(x):return x**2-4*x+8 #定义函数x0 = [1.3] #猜一个初值xopt = fmin(myfunc, x0) #求解print xopt #打印结果运行之后,给出的结果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]程序准确的计算得出了最小值,不过最小值点并不是严格的2,这应该是由二进制机器编码误差造成的。除了fmin_ncg必须提供梯度信息外,其他几个函数的调用大同小异,完全类似。我们不妨做一个对比:from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):return x**2-4*x+8x0 = [1.3]xopt1 = fmin(myfunc, x0)print xopt1printxopt2 = fmin_powell(myfunc, x0)print xopt2printxopt3 = fmin_bfgs(myfunc, x0)print xopt3printxopt4 = fmin_cg(myfunc,x0)print xopt4给出的结果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 531.99999999997Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 12Gradient evaluations: 4[ 2.00000001]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 15Gradient evaluations: 5[ 2.]我们可以根据给出的消息直观的判断算法的执行情况。每一种算法数学上的问题,请自己看书学习。个人感觉,如果不是纯研究数学的工作,没必要搞清楚那些推导以及定理云云。不过,必须了解每一种算法的优劣以及能力所及。在使用的时候,不妨多种算法都使用一下,看看效果分别如何,同时,还可以互相印证算法失效的问题。在from scipy.optimize import fmin之后,就可以使用help(fmin)来查看fmin的帮助信息了。帮助信息中没有例子,但是给出了每一个参数的含义说明,这是调用函数时候的最有价值参考。有源码研究癖好的,或者当你需要改进这些已经实现的算法的时候,可能需要查看optimize中的每种算法的源代码。在这里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聪明的你肯定发现了,顺着这个链接往上一级、再往上一级,你会找到scipy的几乎所有源码!

混沌优化算法可以求解全局最优解吗

非线性最优化问题的一种混合解法

摘 要:把BFGS方法与混沌优化方法相结合,基于混沌变量提出一种求解具有变量边界约束非线性最优化问题的混合优化方法。混合算法兼顾了混沌优化全局搜索能力强和BFGS方法收敛速度快的优点,成为一种求解非凸优化问题全局最优的有效方法。算例表明,当混沌搜索的次数达到一定数量时,混合优化方法可以保证算法收敛到全局最优解,且计算效率比混沌优化方法有很大提高。

关键词:混合法;BFGS方法;混沌优化方法;全局最优

1 引言

在系统工程、控制工程、统计学、反问题优化求解等领域中,很多问题是具有非凸性的。对此普通的优化技术只能求出局部最优解,因为这些确定性算法总是解得最近的一个极值点[1],只有能够给出很好的初始点才有可能得出所需要的全局最优解。为此,实际应用中通过在多个初始点上使用传统数值优化方法来求取全局解的方法仍然被人们所采用,但是这种处理方法求得全局解的概率不高,可靠性低,建立尽可能大概率的求解全局解算法仍然是一个重要问题。近年来基于梯度法的全局最优化方法已经有所研究[2],基于随机搜索技术的遗传算法和模拟退火算法等在全局优化问题中的应用也得到越来越大的重视[3-4]。本文则基于混沌优化和BFGS方法,提出一种求解具有简单界约束最优化问题(1)的混合算法。

混沌是存在于非线性系统中的一种较为普遍的现象。混沌运动宏观上无序无律,具有内随机性、非周期性和局部不稳定性,微观上有序有律,并不是完全的随机运动,具有无穷嵌套的自相似几何结构、存在普适性规律,并不是杂乱无章的。利用混沌变量的随机性、遍历性和规律性特点可以进行优化搜索[5],且混沌优化方法容易跳出局部最优点。但是某些状态需要很长时间才能达到,如果最优值在这些状态时,计算时间势必很长[5]。可以说混沌优化具有全局搜索能力,其局部搜索能力稍显不足,文[5]采用二次载波技术,文[6]考虑逐渐缩小寻优变量的搜索空间都是为了弥补这一弱点。而本文则采用混沌搜索与BFGS方法进行优化求解,一方面采用混沌搜索帮助BFGS方法跳出局部最优,另一方面利用BFGS增强解附近的超线性收敛速度和搜索能力,以提高搜索最优的效率。

2 混沌-BFGS混合优化方法

2.1 BFGS方法

作为求解无约束最优化问题的拟牛顿方法类最有代表性的算法之一,BFGS方法处理凸非线性规划问题,以其完善的数学理论基础、采用不精确线性搜索时的超线性收敛性和处理实际问题有效性,受到人们的重视[7-9]。拟牛顿方法使用了二阶导数信息,但是并不直接计算函数的Hesse矩阵,而是采用一阶梯度信息来构造一系列的正定矩阵来逼近Hesse矩阵。BFGS方法求解无约束优化问题min()的主要步骤如下:

(1) 给变量赋初值x0,变量维数n和BFGS方法收敛精度ε,令B0=I(单位阵),k=0,计算在点x0的梯度g0。

(2) 取sk=-Bk-1gk,沿sk作一维搜索,确定最优步长αk,,得新点xk+1=xk+αksk,计算xk+1点的梯度gk+1。

(3) 若||gk+1||≤ε,则令,,BFGS搜索结束,转步骤3;否则执行(4)。

(4) 计算Bk+1:

(2)

(3)

(5) k=k+1,转(2)。

2.2 混沌优化方法

利用混沌搜索求解问题(1)时,先建立待求变量与混沌变量的一一对应关系,本文采用。然后,由Logistic映射式(4)产生个轨迹不同的混沌变量()进行优化搜索,式(4)中=4。已经证明,=4是“单片”混沌,在[0,1]之间历遍。

(4)

(1)给定最大混沌变量运动次数M;给赋初值,计算和;置,。

(2) 。

(3) 。

(4) 若kM,

若,令,;

若,和保持不变;

然后令k=k+1,,转(2)。

若kM,则,,混沌搜索结束。

2.3 混合优化方法

混沌方法和BFGS方法混合求解连续对象的全局极小值优化问题(1)的步骤如下:

step1 设置混沌搜索的最大次数M,迭代步数iter=0,变量赋初值x0,。

step2 以为始点BFGS搜索,得当前BFGS方法最优解及=。

step3 若,取=;若,取;若,取,是相对于,较小的数。

step 4 以为始点进行混沌搜索M次,得混沌搜索后的最优解及=。

step5 若,iter=iter+1,,转step2;否则执行step6。

step6 改变混沌搜索轨迹,再次进行混沌搜索,即给加微小扰动,执行step 4,得搜索结果和。若,iter=iter+1,,转step2;否则计算结束,输出、。

对全局极大值问题,max ,可以转化为求解全局极小问题min 。

混合算法中混沌搜索的作用是大范围宏观搜索,使得算法具有全局寻优性能。而BFGS搜索的作用是局部地、细致地进行优化搜索,处理的是小范围搜索问题和搜索加速问题。

3 算例

图 1 函数-特性示意图 图 2 函数特性示意图

采用如下两个非常复杂的、常用于测试遗传算法性能的函数测试本文算法:

函数称为Camel 函数,该函数有6个局部极小点(1.607105, 0.568651)、(-1.607105, -0.568651)、(1.703607, -0.796084)、(-1.703607, 0.796084)、(-0.0898,0.7126)和(0.0898,-0.7126),其中(-0.0898,0.7126)和(0.0898,-0.7126)为两个全局最小点,最小值为-1.031628。函数称为 Schaffer's函数,该函数有无数个极大值,其中只有(0,0)为全局最大点,最大值为1。此函数的最大峰值周围有一圈脊,它们的取值均为0.990283,因此很容易停留在此局部极大点。文献[10]采用该函数对该文提出的基于移动和人工选择的改进遗传算法(GAMAS)其性能进行了考察,运行50次,40%的情况下该函数的唯一全局最优点能够找到。而采用本文混合算法,由计算机内部随机函数自动随机生产100个不同的初始点,由这些初始点出发,一般混合算法迭代2-4次即能够收敛。M取不同数值时对函数、的计算结果分别如表1和表2所示,表中计算时间是指在奔腾133微机上计算时间。

由表2可见,当M=1500时,本文方法搜索到最优解的概率即达到40%,而此时计算量比文献[10]小。同样由混合算法的100个起始点,采用文献[5]的算法对函数优化计算100次,以作为收敛标准,混沌搜索50000次,计算结果为67次搜索到最优解,概率为67%,平均计算时间为1.2369s。而即使保证混合算法100次全收敛到最优解所花费的平均计算时间也只为0.2142s(表1),可见混合算法优于文献[5]的方法。

表1 M取不同数值时函数的计算结果

_____________________________________________________________________

M 搜索到全局最优点的次数 搜索到最优的概率 平均计算时间

(-0.0898,0.7126) (0.0898,-0.7126)

_____________________________________________________________________________________________

1000 44 39 83% 0.1214s

3000 53 45 98% 0.1955s

5000 53 47 100% 0.2142s

________________________________________________________________________________________________

表2 M取不同数值时函数的计算结果

___________________________________________________________

M 搜索到全局最优点的次数 搜索到最优的概率 平均计算时间

____________________________________________________________________________________

1500 40 40% 0.1406s

5000 73 73% 0.2505s

10000 88 88% 0.4197s

50000 100 100% 1.6856s

____________________________________________________________________________________

4 计算结果分析

由表1和表2可见,混合算法全局寻优能力随M的增加而增大,当M达到某一足够大的数值Mu后,搜索到全局最优的概率可以达到100%。

从理论上说,Mu趋向无穷大时,才能使混沌变量遍历所有状态,才能真正以概率1搜索到最优点。但是,本文混沌运动M次的作用是帮助BFGS方法跳出局部最优点,达到比当前局部最优函数值更小的另一局部最优附近的某一点处,并不是要混沌变量遍历所有状态。由混沌运动遍历特性可知,对于某一具体问题,Mu达到某一具体有限数值时,混沌变量的遍历性可以得到较好模拟,这一点是可以满足的,实际算例也证实了这一点。

由于函数性态、复杂性不同,对于不同函数,如这里的测试函数、,数值Mu的大小是有差别的。对于同一函数,搜索区间增大,在相同混沌运动次数下,即使始点相同,总体而言会降低其搜索到全局最优的概率,要保证算法仍然以概率1收敛到全局最优,必然引起Mu 增大。跟踪计算中间结果证实,当M足够大时,混合算法的确具有跳出局部最优点,继续向全局最优进行搜索的能力;并且混合算法的计算时间主要花费在为使混合算法具有全局搜索能力而进行混沌搜索上。

5 结语

利用混沌变量的运动特点进行优化,具有非常强的跳出局部最优解的能力,该方法与BFGS方法结合使用,在可以接受的计算量下能够计算得到问题的最优解。实际上,混沌优化可以和一般的下降类算法结合使用,并非局限于本文采用的BFGS方法。采用的Logistic映射产生混沌变量序列,只是产生混沌变量的有效方式之一。

混沌运动与随机运动是不同的。混沌是确定性系统中由于内禀随机性而产生的一种复杂的、貌似无规的运动。混沌并不是无序和紊乱,更像是没有周期的秩序。与随机运动相比较,混沌运动可以在各态历经的假设下,应用统计的数字特征来描述。并且,混沌运动不重复地经过同一状态,采用混沌变量进行优化比采用随机变量进行优化具有优势。

混沌优化与下降类方法结合使用是有潜力的一种全局优化途径,是求解具有变量界约束优化问题的可靠方法。如何进一步提高搜索效率,以及如何把混沌优化有效应用于复杂约束优化问题是值得进一步研究的课题。

本文算法全局收敛性的严格数学证明正在进行之中。

参考文献

[1]胡山鹰,陈丙珍,何小荣,沈静珠.非线性规划问题全局优化的模拟退火法[J].清华大学学报,37(6),1997,5-9.

[2]C A Floudas, A Aggarwal, A R Ciric. Global optimum search for nonconvex NLP and MINLP problems[J]. Comput Chem Engng. 1989, 13(10), 1117~1132.

[3]康立山,谢云,尤矢勇等.非数值并行算法(第一册)――模拟退火算法[M].北京:科学出版社,1998.

[4]刘勇,康立山,陈琉屏.非数值并行算法(第二册)――遗传算法[M].北京:科学出版社,1998.

[5]李兵,蒋慰孙.混沌优化方法及其应用[J].控制理论与应用,14(4),1997,613-615.

[6]张彤,王宏伟,王子才.变尺度混沌优化方法及其应用[J].控制与决策,14(3),1999,285-287.

[7]席少霖.非线性最优化方法[M].北京:高等教育出版社,1992.

[8]席少霖,赵凤志.最优化计算方法[M].上海:上海科学技术出版社,1983.

[9]Press W H, Tenkolsky S A, Vetterling W T, Flannery B P.Numerical Recipes in C, The Art of Scientific Computing[M]. Second edition, Cambridge University Press, 1992.

[10]J C Ports.The development and evaluation of an improved genetic algorithm based on migration and artificial selection[J].IEEE Trans. Syst. Man and Cybern..1994, 24(1),73-85.

A Hybrid Approach for Nonlinear Optimization

Abstract:Combined BFGS method with chaos optimization method, a hybrid approach was proposed to solve nonlinear optimization problems with boundary restraints of variables. The hybrid method is an effective approach to solve nonconvex optimization problems, as it given both attentions to the inherent virtue to locate global optimum of chaos optimization method and the advantage of high convergence speed of BFGS method. Numerical examples illustrate that the present method possesses both good capability to search global optima and far higher convergence speed than that of chaos optimization method.

求解非线性方程的的最优化算法C++程序

j是复数单位吗?可以试试,下面是个示例,我没有提供导数什么的,所以不稳定。它的用法和matlab挺像,你应该能搞定。

#include dlib/optimization.h

#include iostream

using namespace std;

using namespace dlib;

typedef matrixdouble, 2, 1 column_vector;

typedef complexdouble complex_t;

int const M = 3;

static matrixdouble, 3, M a;

void init(){

    static bool tag = true;

    if (tag){

        a = 0, 1, 2, 3, 4, 5, 6, 7, 8;

        tag = false;

    }

}

double foo(const column_vector x){

    init();

    complex_t res;

    for (int i = 0; i != a.nc(); ++i){

        res += exp(complex_t(

            0,

            a(0, i) + a(1, i)*x(0) + a(2, i)*x(1)

            ));

    }

    return norm(res) / M;

}

int main(){

    try{

        column_vector starting_point;

        starting_point = 0, 0;

        double max_value = find_max_box_constrained(bfgs_search_strategy(),

            objective_delta_stop_strategy(1e-9),

            foo, derivative(foo), starting_point, -50, 50);

        cout  "x0 = \n"  starting_point  "\nfoo(x0) = "  max_value  "\n";

    }

    catch (std::exception const e){

        cerr  e.what()  "\n";

    }

    return 0;

}

运行结果:

最优化中的BFGS算法英文全称是什么?

BFGS是拟牛顿算法中构造矩阵方法的一种,这四个字母是四个人的名字的首字母合写,就好象PBE和PW91都算是GGA一样。。Broyden, Fletcher, Goldfarb和Shanno的姓氏首字母命名。

1条大神的评论

  • avatar
    访客 2022-07-08 上午 04:23:03

    算法(第一册)――模拟退火算法[M].北京:科学出版社,1998.[4]刘勇,康立山,陈琉屏.非数值并行算法(第二册)――遗传算法[M].北京:科学出版社,1998.[5]李兵,蒋慰孙.混沌优化方法及其应用[J].控制理论与应用,14(4),199

发表评论