文章目录
- SHGO算法
- 参数说明
- 测试
SHGO算法
SHGO,即simplicial homology global optimize,来自2018年的文章,是一种基于组合拓扑学的优化方法,是一个非常新的算法。
这种算法适用于CDFO(constrained deriviate free optimisation)问题,所谓无导数优化,就是把目标函数当作黑箱子处理,而无法获取其一阶导数,自然也不能通过导数来判断优化方向。而约束则是框定了优化参数的选择范围,可以有等式约束和不等式约束。
SHGO算法建立在同调群的理论之上,关键概念是同调群增长,这玩意太数学了,属于连插图都很难看懂的程度
所以就不详细介绍了,总之其函数定义如下
scipy.optimize.shgo(func, bounds, args=(), constraints=None, n=100, iters=1, callback=None, minimizer_kwargs=None, options=None, sampling_method='simplicial', *, workers=1)
参数说明
在shgo函数中,func, bounds, args
是我们的老朋友了,func(x, *args)
是待优化函数,args
即为shgo中输入的args
,bounds
表示变量范围。
其他参数含义如下
- constraints 约束条件,以字典或者字典列表的形式被调用。
- n 抽样点数,一般是维度的二倍加1
- iters 迭代次数
- callback 每次迭代之后的回调函数,可以用来存储或打印单次迭代结果
- minimizer_kwargs 传递给minimize函数的额外的参数
- options是一个参数字典,包括一些常用的参数设置
- sampling_method 抽样方法
- workers 线程数
测试
抛开理论不谈,算法具体行不行,还是得跑个分才知道,下面仍以形如 y = ∑ i ( i + 1 ) cos i x i 5 y=\sum_i(i+1)\cos\frac{ix_i}{5} y=∑i(i+1)cos5ixi的非线性函数做测试
import numpy as np
from scipy.optimize import shgodef test(xs):_sum = 0.0for i in range(len(xs)):_sum = _sum + np.cos((xs[i]*i)/5)*(i+1)return _sumbounds = [[0,15] for _ in range(5)]
ret = shgo(test, bounds)
msg = f"全局最小值" + ", ".join([f"{x:.4f}" for x in ret.x])
msg += f"\nf(x)={ret.fun:.4f}"
print(msg)
优化结果为
全局最小值7.5000, 15.0000, 7.8540, 5.2360, 3.9270
f(x)=-12.9800
这个结论与其他优化算法得到的结果相当,但shgo算法在优化时有个问题,即bound的下界必须大于0,否则无法得到正常的优化结果。