brute

语法

brute(func, ranges, [ns=20], [finish=fmin])

详情

通过穷举法在给定范围内最小化一个函数。穷举法使用网格搜索,即计算多维网格点上每个点处的函数值,以找到函数的全局最小值。

注意:穷举法效率低下,其原因是网格点的数量呈指数级增加。因此,即使网格间距较粗、或者问题仅为中等大小等情况,也可能需要很长的运行时间,还可能遇到内存限制。

参数

func 函数名,表示需要最小化的目标函数。注意:其返回值须是数值标量类型。

ranges 元组类型,表示每个参数分量的数值范围。ranges 中每个元素为形如(low, high)(low, high, num)的元组。其中 lowhigh 都是数值类型,low 表示该参数分量的最低取值,high 表示该参数分量的最高取值;num 为正整数,表示沿轴线的网格点数量,即该参数分量在范围内的取值个数。

ns 可选参数,正整数标量,表示沿轴线的网格点数量。优先取 ranges 元素(low, high, num)中的 num 值;若 ranges 中未设置numns。该参数默认值为 20。

finish 可选参数,函数名,表示一个优化函数。其输入需满足 finish(func, X);输出应返回一个字典,包含键"xopt""fopt",且值为数值类型。默认值为函数 fmin。将穷举法网格搜索的结果作为初始猜测,使用该函数对目标函数进行优化。注意:也可传入“NULL”,表示直接返回穷举法网格搜索的结果,不进行优化。

返回值

返回一个字典,字典有以下成员:

  • xopt:浮点数向量,使目标函数最小化的参数值。
  • fopt:浮点数标量,目标函数最小值。fopt=func(xopt)。

例子

以下自定义一个函数 f,传入指定 rangesns 值,计算 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]

*/