使用python scipy.optimize.minimize

时间:2018-07-30 09:46:07

标签: python scipy mathematical-optimization

我已经在网上进行了一些搜索,但没有找到解决此问题的任何方法,因此我决定在这里正式提出。

我有一个具有多个输出的函数:

f(input1,input2,... ,inputn) = output1,ouput2,output3

我希望最小化output1约束其他输出,例如:

output2 >= 0 and output3 <= 7   (*constraints*)

我的想法是具有以下程序结构:

def function(input1,input2,...,inputn):
    #very secret part of code
    return(output1,ouput2,output3)

inputs=[1,31,22]
_res = optimize.minimize(function, inputs,  method='nelder-mead', 
options=options,*constraints*)

现在,我认为答案应该在Scipy minimize函数的文档中。

事实是,据我了解,我只能约束函数输入,而不能约束函数的某些输出。我想念什么吗?

1 个答案:

答案 0 :(得分:0)

这是有约束的优化示例:

from scipy.optimize import minimize

def f(xy):
    x, y = xy 
    return x**2 + y**2

def constraint1(xy):
    x, y = xy 
    return x-1

def constraint2(xy):
    x, y = xy 
    return y-2

constraints = ({'type': 'ineq', 'fun': constraint1},
               {'type': 'ineq', 'fun': constraint2})

xy_start = [0, 0]
res = minimize(f, xy_start, method='SLSQP', constraints=constraints)

给出:

     fun: 4.999999999999997
     jac: array([2., 4.])
 message: 'Optimization terminated successfully.'
    nfev: 13
     nit: 3
    njev: 3
  status: 0
 success: True
       x: array([1., 2.])

这个想法是,您要最小化的函数具有良好的标量:返回值必须仅为output1。为了定义每个约束,必须添加其他功能:constraint1(inputs)->output2constraint2(inputs)->output3 ...等等

也许您可以将代码的“非常秘密的部分”分成不同的功能,这将由目标功能和约束功能共同使用