Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带SLSQP的Scipy优化不考虑约束_Python_Optimization_Scipy_Constraints - Fatal编程技术网

Python 带SLSQP的Scipy优化不考虑约束

Python 带SLSQP的Scipy优化不考虑约束,python,optimization,scipy,constraints,Python,Optimization,Scipy,Constraints,我希望通过scipy添加x[0]-x[1]>0的约束来优化以下公式。在目标函数中打印此表达式时,它也会给出负值,而优化会成功终止。最终目标类似于最小化由于数学错误而失败的sqrt(0.1*x[0]*x[1]) import numpy as np from scipy.optimize import minimize def f(x): print x[0] - x[1] #return sqrt(0.1*x[0]*x[1]) return 0.1*x[0]*x[1

我希望通过scipy添加x[0]-x[1]>0的约束来优化以下公式。在目标函数中打印此表达式时,它也会给出负值,而优化会成功终止。最终目标类似于最小化由于数学错误而失败的sqrt(0.1*x[0]*x[1])

import numpy as np
from scipy.optimize import minimize


def f(x):

    print x[0] - x[1]
    #return sqrt(0.1*x[0]*x[1])
    return 0.1*x[0]*x[1]

def ineq_constraint(x):

    return x[0] - x[1]


con = {'type': 'ineq', 'fun': ineq_constraint}
x0 = [1, 1]
res = minimize(f, x0, method='SLSQP', constraints=con)

print res
以及输出:

0.0
0.0
1.49011611938e-08
-1.49011611938e-08
0.0
0.0
1.49011611938e-08
-1.49011611938e-08
0.0
0.0
1.49011611938e-08
-1.49011611938e-08
4.65661176285e-10
4.65661176285e-10
1.53668223701e-08
-1.44355000176e-08
     fun: 1.7509862319755833e-18
     jac: array([  3.95812066e-10,   4.42378184e-10,   0.00000000e+00])
 message: 'Optimization terminated successfully.'
    nfev: 16
     nit: 4
    njev: 4
  status: 0
 success: True
       x: array([  4.42378184e-09,   3.95812066e-09])

在一般情况下,我们不知道您的整个任务,并非所有步骤都强制执行约束(如观察到的)!如果不更改优化器,就没有多少事情要做。甚至找到一个合适的优化器也不容易

对于您的情况,如果您的变量是非负的,它将起作用!如果这是你可以在其他任务中使用的东西,我们不知道

现在有两种非负性方法:

  • 不平等
  • 界限
使用边界,将使用显式处理(据我所知),并且在优化过程中不会违反这些边界

例如:

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

def f(x):
    print(x)
    return sqrt(0.1*x[0]*x[1])

def ineq_constraint(x):
    return x[0] - x[1]

con = {'type': 'ineq', 'fun': ineq_constraint}

x0 = [1, 1]
res = minimize(f, x0, method='SLSQP', constraints=con, bounds=[(0, None) for i in range(len(x0))])
print(res)
输出:

[1. 1.]
[1. 1.]
[1.00000001 1.        ]
[1.         1.00000001]
[0.84188612 0.84188612]
[0.84188612 0.84188612]
[0.84188613 0.84188612]
[0.84188612 0.84188613]
[0.05131671 0.05131669]
[0.05131671 0.05131669]
[0.05131672 0.05131669]
[0.05131671 0.0513167 ]
[0. 0.]
[0. 0.]
[1.49011612e-08 0.00000000e+00]
[0.00000000e+00 1.49011612e-08]
     fun: 0.0
     jac: array([0., 0.])
 message: 'Optimization terminated successfully.'
    nfev: 16
     nit: 4
    njev: 4
  status: 0
 success: True
       x: array([0., 0.])

在您的解决方案
x[0]-x[1]>=0
中,出了什么问题?就您的最终目标而言,最小值0.1*x[1]*x[1]也是此函数的最小平方根。你真走运!谢谢大家的评论@BillBell,这是我正在研究的一个多变量问题的虚拟简化-在这种情况下,不幸的是,运气不是一个选项。@sascha,我的问题是我想做操作(例如,返回sqrt中的sqrt(0.1*x[0]*x[1])在某些条件下,这可能会导致数学错误。我想在优化过程中使用约束来忽略这些情况,但显然,条件只适用于最终的解决方案?我如何解决这个问题?我很讽刺。只要平方根包含整个优化函数,就可以忽略它。结果是我也一样。你不需要加入任何约束,试图将函数保持在平方根的范围内。非常感谢你的回复-了解约束并非在所有步骤都强制执行是非常有用的。我也考虑过边界,但我也找不到解决它们的方法我必须拿sqrt(还有日志)在目标函数中是一个由6个变量组成的复杂非线性函数。根据scipy docs的说法,边界只适用于我们正在优化的变量。我曾想过在f中出现MathError时捕捉异常,然后在返回之前通过,但这似乎很肤浅。@MilánJanosov当然,你可以尝试捕捉这些并输出s有些值作为代理。但这需要一些平滑度假设。但值得一试。