【问题标题】:Constraint with scipy用 scipy 约束
【发布时间】:2020-08-18 00:19:19
【问题描述】:

我有一个约束条件下的多目标优化问题(最大化),实际上我通过加权技术将其转换为单目标问题,并添加了 2 个变量 x1, x2(用于优化)和约束 @987654321 @ 所以它们的总和必须严格小于 1 才能产生下面代码中描述的第三个目标函数。

当我执行时,总和总是大于 1。

    for i in range(len(f1)):
        def f(x):
            x1= x[0]
            x2= x[1]
            return -(x1*f1[i]+ x2*f2[i]+ (1-x1-x2)*f3[i])

        def constraint(x):
            return x[0]+x[1]-1

        b= (0.2, 0.8)
        bnds= (b, b)
        x0=[0.5,0.4]

        cons= ({'type': 'ineq','fun':constraint})

        res = minimize(f,x0, method= 'SLSQP', bounds=bnds, constraints=cons)

        print('Vect_ponderation : ', res.x)

输出:

Vect_ponderation :  [0.8 0.8]
Vect_ponderation :  [0.8 0.8]
Vect_ponderation :  [0.8 0.8]
Vect_ponderation :  [0.8 0.8]

【问题讨论】:

    标签: python optimization scipy constraints minimize


    【解决方案1】:

    documentation 说:

    等式约束意味着约束函数结果为零而不等式意味着它是非负的。请注意,COBYLA 仅支持不等式约束。

    def constraint(x):
        return x[0] + x[1] -1
    

    意思是:

    x0 + x1 - 1 >= 0  # non-negative
    <-> 
    x0 + x1 >= 1
    

    在您的解决方案中受到尊重。

    你可能想要:

    def constraint(x):
        return - x[0] - x[1] + 1
    

    还要记住,没有严格不等式的概念。您将需要引入一些 epsilon 常量先验,例如:eps = 1e-6:

    def constraint(x):
        return - x[0] - x[1] + 1 - EPS
    

    【讨论】:

      【解决方案2】:

      据我了解,您的问题是输出有x1+x2&gt;1。我检查了optimize 文档,上面写着:'不等式意味着它是非负的'。因此,您请求的内容与您认为自己请求的内容相反。

      建议:

      • 您的功能非常简单,因此请尝试提供 jacobian 作为附加参数。这样配合效率更高。

      • 尝试展示minimal reproducible example。这使得回答更容易。您的问题缺少f1f2f3 定义。

      • 尝试提出问题。我发现了一些可能是您要解决的问题,但我不确定,因为您的问题中没有问题(即带问号的句子)。

      【讨论】:

        猜你喜欢
        • 2013-12-03
        • 2019-09-26
        • 2014-07-13
        • 1970-01-01
        • 2016-05-27
        • 1970-01-01
        • 2021-06-22
        • 2019-02-10
        • 2021-12-18
        相关资源
        最近更新 更多