用scipy约束

问题描述 投票:0回答:1

我有一个约束条件下的多目标优化问题(最大化),其实我通过加权技术把它转化为单目标问题,我增加了2个变量x1,x2(要优化),约束条件是 0 <x1 + x2 <1 所以它们的总和必须严格小于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个回答
0
投票

文件 说。

同等约束是指约束函数的结果为零。而不等式则是指它要是非负的. 注意,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

也请记住,没有一个概念是... 严格不等式. 你需要介绍一些 ε 不断的先验一样。eps = 1e-6:

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

0
投票

我的理解是,你的问题是输出有 x1+x2>1. 我查过了 优化 文档中,它说:"不等式是指它要是非负数"。因此,你要求的东西与你认为的要求相反。

建议。

  • 你的函数非常简单 所以试着提供jacobian作为额外的参数。这样拟合的效率会高很多。

  • 试着提出 最低限度的重现性例子. 这样回答起来就容易多了。你的问题缺乏 f1, f2f3 定义。

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

© www.soinside.com 2019 - 2024. All rights reserved.