Python SciPy.optimize.minimize SLSQP忽略边界和约束

Python SciPy.optimize.minimize SLSQP忽略边界和约束,python,numpy,scipy,mathematical-optimization,Python,Numpy,Scipy,Mathematical Optimization,我正在尝试使用SciPy.optimize.minimize最小化多变量函数 我试过几种方法。SLSQP似乎忽略了边界和/或约束。显然我打电话的方式有问题,但我不确定是什么 函数(代码中称为f)太复杂,无法在此处描述。 我没有f的梯度,也不知道形状 import numpy as np from scipy.optimize import minimize .... # fields is an argument (list of strings) indf1 = fields.index('

我正在尝试使用SciPy.optimize.minimize最小化多变量函数

我试过几种方法。SLSQP似乎忽略了边界和/或约束。显然我打电话的方式有问题,但我不确定是什么

函数(代码中称为f)太复杂,无法在此处描述。 我没有f的梯度,也不知道形状

import numpy as np
from scipy.optimize import minimize
....

# fields is an argument (list of strings)
indf1 = fields.index('f1')
indf2 = fields.index('f2')
methods=['Nelder-Mead','SLSQP','L-BFGS-B','COBYLA','Powell']
method_name = methods[1]
cons = ( {'type':'ineq','fun':lambda(x):np.array([x[indf1]])}, {'type':'ineq', 'fun':lambda(x):np.array([x[indf2]])}) 
bounds_pairs = [(None,None) for i in range(len(fields))]
bounds_pairs[indf1] =  (float_info.epsilon,1)
bounds_pairs[indf2] =  (float_info.epsilon,1)
minimize(f,np.array(initial_guess),method=method_name,bounds=bounds_pairs,jac=False,constraints=cons,tol=1e-12)
根据界限和限制,字段f1和f2都应该是非负的。然而,这是行不通的

以下是输出:

 status: 4
 success: False
 njev: 2
 nfev: 24
 fun: 1000000000000.0
   x: array([  0.00000000e+00,  -4.00000000e-04,  -1.00005897e-04,
    -6.09588623e-13,   1.00000014e-10])
 message: 'Inequality constraints incompatible'
 jac: array([  0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
    -6.71088639e+19,   0.00000000e+00,   0.00000000e+00])
 nit: 3
当我打印出参数值时,我可以看到负值赋值:

{'f4': 0.0, 'f1': 1.5001161208210954e-08, 'f3': -0.00010000589702911378, 'f2': -6.0958862304687526e-13, 'f5': -0.00040000000000000002} 
有线索吗


*附言:我以前也曾发布过类似的问题,但只得到了不具建设性和无关的评论。

它没有忽略边界和约束。优化失败:
success:False
。如果不知道f,我们就无能为力。你的初始猜测是有界的吗?数值优化是关于优化光滑函数的。你不能简单地用复杂的算法计算值,然后期望得到一个最小值。@cel-我看不出我的函数不平滑这一事实如何“允许”一个非常流行的软件包来解决一个非常常见的问题,即行为不当/错误信息/忽略它应该做的事情,等等。我在这里使用的优化方法是错误的吗?我知道人们一直在优化复杂的过程。@Zahy,这没有任何意义,你不能仅仅因为你使用的是一个通用库,就指望一个设计用于最小化平滑函数的算法能在任何函数上工作。这似乎是垃圾中垃圾的经典例子。@Zahy:数值最小化算法通常对函数的属性进行假设。对于SLSQP,除了平滑性之外,我还解释了上面需要的一个假设,以及如何避免这方面的问题。对于给定算法的收敛性质,数学上等价的问题公式不一定相同。它不忽略边界和约束。优化失败:
success:False
。如果不知道f,我们就无能为力。你的初始猜测是有界的吗?数值优化是关于优化光滑函数的。你不能简单地用复杂的算法计算值,然后期望得到一个最小值。@cel-我看不出我的函数不平滑这一事实如何“允许”一个非常流行的软件包来解决一个非常常见的问题,即行为不当/错误信息/忽略它应该做的事情,等等。我在这里使用的优化方法是错误的吗?我知道人们一直在优化复杂的过程。@Zahy,这没有任何意义,你不能仅仅因为你使用的是一个通用库,就指望一个设计用于最小化平滑函数的算法能在任何函数上工作。这似乎是垃圾中垃圾的经典例子。@Zahy:数值最小化算法通常对函数的属性进行假设。对于SLSQP,除了平滑性之外,我还解释了上面需要的一个假设,以及如何避免这方面的问题。对于给定算法的收敛特性,数学上等价的问题公式不一定相同。