brute
语法
brute(func, ranges, [ns=20], [finish=fmin])
详情
通过穷举法在给定范围内最小化一个函数。穷举法使用网格搜索,即计算多维网格点上每个点处的函数值,以找到函数的全局最小值。
注意:穷举法效率低下,其原因是网格点的数量呈指数级增加。因此,即使网格间距较粗、或者问题仅为中等大小等情况,也可能需要很长的运行时间,还可能遇到内存限制。
参数
func 函数名,表示需要最小化的目标函数。注意:其返回值须是数值标量类型。
ranges 元组类型,表示每个参数分量的数值范围。ranges 中每个元素为形如(low,
high)
或(low, high, num)
的元组。其中 low
和
high
都是数值类型,low
表示该参数分量的最低取值,high
表示该参数分量的最高取值;num
为正整数,表示沿轴线的网格点数量,即该参数分量在范围内的取值个数。
ns 可选参数,正整数标量,表示沿轴线的网格点数量。优先取 ranges 元素(low, high,
num)
中的 num
值;若 ranges 中未设置,则
num
为 ns。该参数默认值为 20。
finish 可选参数,函数名,表示一个优化函数。其输入需满足 finish(func,
X)
;输出应返回一个字典,包含键"xopt"
和"fopt"
,且值为数值类型。默认值为函数
fmin
。将穷举法网格搜索的结果作为初始猜测,使用该函数对目标函数进行优化。注意:也可传入“NULL”,表示直接返回穷举法网格搜索的结果,不进行优化。
返回值
返回一个字典,字典有以下成员:
- xopt:浮点数向量,使目标函数最小化的参数值。
- fopt:浮点数标量,目标函数最小值。fopt=func(xopt)。
例子
以下自定义一个函数 f
,传入指定 ranges 和 ns 值,计算 f
函数在 ranges 内最小化的参数值和对应的最小值。
def f(z) {
a = 2
b = 3
c = 7
d = 8
ee = 9
f = 10
g = 44
h = -1
i = 2
j = 26
k = 1
l = -2
scale = 0.5
x = z[0]
y = z[1]
f1 = a * square(x) + b * x * y + c * square(y) + d * x + ee* y + f
f2 = -g * exp(-(square(x-h)+square(y-i)) / scale)
f3 = -j * exp(-(square(x-k)+square(y-l)) / scale)
return f1+f2+f3
}
ranges=((-4, 3.75),(-4, 3.75))
brute(f, ranges, 32)
/* Ouput:
fopt->-3.408581876799
xopt->[-1.056651921797,1.808348429512]
*/