我正在尝试使用scipy
来解决非平凡的优化问题。我有一个6维问题。我想要优化的功能不是线性的。
我认为这个非线性优化问题可以通过scipy.optimize.minimize
解决,请参阅https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html#constrained-minimization-of-multivariate-scalar-functions-minimize文档显示约束可以逐个处理:
cons = ({'type': 'eq',
'fun' : lambda x: np.array([x[0]**3 - x[1]]),
'jac' : lambda x: np.array([3.0*(x[0]**2.0), -1.0])},
{'type': 'ineq',
'fun' : lambda x: np.array([x[1] - 1]),
'jac' : lambda x: np.array([0.0, 1.0])})
在我的情况下,我需要12个约束:每个维度最多1分钟和1分钟。我也想要一些可以概括为更多或更少维度的东西,所以我不想手工输入所有约束。假设我的mins和maxs在两个数组中。如果我使用循环,例如:
for i in range(6):
grad_min = np.zeroes(6)
grad_max = np.zeroes(6)
grad_min[i] = +1.
grad_max[i] = -1
cons_min = {'type': 'ineq',
'fun' : lambda x: np.array([x[i] - min[i]),
'jac' : lambda x : grad_min})
cons_max = {'type': 'ineq',
'fun' : lambda x: np.array([-x[i] + max[i]),
'jac' : lambda x : grad_max})
cons = cons + (cons_min,cons_max)
但由于Python中缺少lambda
函数的关闭,这将失败,只会强制执行最后一个(i=5
)。我正在寻找另一种设计,我可以同时定义所有约束,我需要使用封闭的东西..