请考虑以下简单的MWE:
import numpy as np
from scipy.optimize import direct
def score(x):
parity_in_range = len([v for v in x if 4 <= v <= 6])%3
main_score = np.max(np.abs(np.diff(x)))
return main_score + parity_in_range
length = 20
bounds = [(0,10)] * length
result = direct(score, locally_biased=False, bounds=bounds, maxiter=10000, maxfun=10000)
print(result)
最佳解决方案是使所有参数相等,而不是介于4和6之间.例如,全部为3.这给出的函数值为0.对于不同的Scipy优化器,优化的成功程度各不相同,但使用DIRECT的优化几乎立即失败.它提供了:
message: The volume of the hyperrectangle containing the lowest function value found is below vol_tol=1e-16
success: True
status: 4
fun: 2.0
x: [ 5.000e+00 5.000e+00 ... 5.000e+00 5.000e+00]
nit: 2
nfev: 157
我不确定它是否应该报告成功,但真正的问题是,它在157次函数判断后放弃了,并发出了警告.
有什么方法可以直接优化这个函数吗?