定义优化约束:需要函数闭包

时间:2018-04-28 23:06:08

标签: python optimization scipy closures

我正在尝试使用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)。我正在寻找另一种设计,我可以同时定义所有约束,我需要使用封闭的东西..

0 个答案:

没有答案