我试图找到一种(相对)快速的方法来最小化给定约束和界限的自然数集上的函数。我知道函数的数学形式及其约束,所以蛮力方法似乎很慢而且不是很优雅。解决这个问题的最佳方法是什么?
基本上,我试图从使用 scipy.optimize.minimize 对实数进行功能最小化到自然数上的一个。(我知道这要困难得多)
让事情变得容易。我在想这样的例子:
from scipy import optimize
x0 = [0,0]
cons = ({'type': 'ineq', 'fun': lambda x: 0.4 - x[1]})
bounds = ((0,None),(0,None))
fun = lambda x: (x[0]-1.5)**2 + (x[1]-0.5)**2 + 3
res = optimize.minimize(fun, x0=x0, bounds=bounds, constraints=cons)
print(res)
换句话说,我希望添加约束和界限
fun = lambda x: (x[0]-1.5)**2 + (x[1]-0.5)**2 + 3
xr = [(0,0),(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3),(3,0),(3,1),(3,2),(3,3),]
min_idx = min(xr, key=fun)
min_val = fun(min_idx)
print(min_idx,min_val)
(我知道我可以通过从 xr 中排除这些值来强加它们,但这对于我所想到的实际情况来说似乎不太优雅且不太实用)
所以我期待有一些不同的最小化器,比如 scipy.optimize.basinhopping 或者神秘的东西来做这个把戏?有什么建议么?