优化算法研究Rastrigin函数
使用optimtool库的方法
定义Rastrigin函数,本文重点研究方法的局部开发能力,函数在全局极小值附近有很多局部极小值,设置初始点为(0.5,-0.3),
import optimtool.unconstrain as ou
from optimtool.base import sp
x = sp.symbols("x1:3")
A = 10
sum_term = (x[0]**2 - A * sp.cos(2 * sp.pi * x[0])) + (x[1]**2 - A * sp.cos(2 * sp.pi * x[1]))
rastrigin = A * 2 + sum_term
x_0 = (0.5, -0.3)
信赖域方法的训练结果和可视化
ou.trust_region.steihaug_CG(rastrigin, x, x_0, verbose=True, draw=True)
(0.5, -0.3) 33.430169943749476 0
(0.5, -0.3) 33.430169943749476 1
(0.5, -0.3) 33.430169943749476 2
[ 0.49585852 -0.05003431] 20.735094807492853 3
[0.13531621 0.05308815] 3.9741075141269517 4
[-0.04558432 -0.00204971] 0.4102820555806389 5
[1.28201395e-03 1.12757902e-07] 0.00032606750446062375 6
[-2.75888328e-08 -3.63981485e-12] 1.5024374593316442e-13 7
L_BFGS训练结果和可视化
ou.newton_quasi.L_BFGS(rastrigin, x, x_0, verbose=True, draw=True)
(0.5, -0.3) 33.430169943749476 0
[ 0.49609375 -0.06423186] 21.05061587716868 1
[ 0.49540553 -0.03394355] 20.46897979380196 2
[0.49089607 0.00173255] 20.225218762652215 3
[0.490644 0.00120956] 20.223748098509294 4
[ 0.46559824 -0.02448895] 20.10282411064895 5
[ 0.15439562 -0.32475773] 19.003441057801915 6
[ 0.25376874 -0.21970435] 18.45738637665312 7
[ 0.3439645 -0.07807552] 16.87063276869083 8
[ 0.11471468 -0.17770738] 8.144098648171822 9
[ 0.0060908 -0.16881321] 5.153110356206469 10
[-0.00588779 0.00291503] 0.008562465730363785 11
[ 0.00050293 -0.00056868] 0.00011434117888674131 12
[2.32706011e-05 4.28990140e-05] 4.7253945653447976e-07 13
[-5.61985987e-06 -4.40772858e-06] 1.0120160730610205e-08 14
[ 4.14953189e-08 -2.53413392e-08] 4.666437717145493e-13 15
[-4.62768595e-10 5.97824247e-10] 1.1281917205678543e-16 16
[2.18391301e-13 3.53260480e-13] 3.4047712591437506e-23 17
可以看到信赖域方法和LBFGS方法能很好地跳过局部最优值20,现在设置初始点为(0.4,-0.3),观察结果,
barzilar_borwein训练结果和可视化
x_0 = (0.4, -0.3)
ou.gradient_descent.barzilar_borwein(rastrigin, x, x_0, verbose=True, draw=True)
(0.4, -0.3) 31.43033988749895 0
[0.17185122 0.06495354] 6.13976171835116 1
[-0.20974784 -0.10661683] 9.714240474120007 2
[-0.01717213 0.01670725] 0.11377287169869504 3
[ 0.00486217 -0.00473276] 0.009133222904602967 4
[-6.53981222e-06 6.40427278e-06] 1.66220534617351e-08 5
[ 9.8504651e-10 -9.6463122e-10] 3.7520880612188806e-16 6
[-2.70225224e-19 2.64624797e-19] 2.823653449819599e-35 7
barzilar_borwein_ZhangHanger训练结果和可视化
x_0 = (0.4, -0.3)
ou.gradient_descent.barzilar_borwein(rastrigin, x, x_0, verbose=True, draw=True, method="ZhangHanger")
(0.4, -0.3) 31.43033988749895 0
[0.17185122 0.06495354] 6.13976171835116 1
[-0.05710822 -0.03798868] 0.9251057077803212 2
[0.00653816 0.00485932] 0.013163852514273213 3
[-1.02617867e-04 -7.68865311e-05] 3.261955745256119e-06 4
[2.37657913e-08 1.78088663e-08] 1.7409361445869945e-13 5
[-1.37967600e-15 -1.03385853e-15] 5.867221914198997e-28 6