Python:如何使用lambda函数为fmin_cobyla优化创建许多约束



我有一个由几百个数字项组成的向量(如下:Xo=[x1,y1,x2,y2,…,xN,yN](,其中N是任意数。我需要将这个向量传递给scipy fmin_cobyla优化器,并对每个条目进行简单的约束:1.所有的x(即x1,x2,…,xN(都是-1

我已经尝试使用lambda函数来指定像这样的约束

b0 = lambda Xo: 1 - Xo[n]
b1 = lambda Xo: Xo[n] + 1

然而,我完全不确定如何传递正确的索引n。我希望所有偶数n都服从b0和b1,但所有奇数n都服从b2和b3

b2 = lambda Xo: 2 - Xo[n]
b3 = lambda Xo: Xo[n] + 2

我可能需要在fmin_cobyla中使用consargs。任何帮助都将不胜感激。

约束是否需要连续?如果没有,这里有一个简单的方法用一个函数来完成。如果满足约束,它将返回1,如果不满足约束,则返回-1:

def checkall(xs):
    for j, x in enumerate(xs):
        if abs(x) > (2 if j % 2 else 1):
            return -1
    return 1
cons = (checkall,)

如果你需要连续约束,有很多方法可以做到。这里有一个2N个线性函数,N表示正约束,N表示负约束。

def checkpos(j):
    if j % 2:
        return lambda xs: 2 - xs[j]
    else:
        return lambda xs: 1 - xs[j]
def checkneg(j):
    if j % 2:
        return lambda xs: 2 + xs[j]
    else:
        return lambda xs: 1 + xs[j]
cons = [checkpos(j) for j in range(N)] + [checkneg(j) for j in range(N)]

尝试这个

even = lambda x: (x < 1 and x > -1)
odd = lambda x: (x < 2 and x > -2)
constraint = lambda index: (index % 2) and odd or even
filtered = [x for index, x in enumerate(Xo) if constraint(index)(x)]

老实说,我不知道fmin_cobyla是什么,但这是在阅读了David的评论之后的又一次尝试

even = lambda n: ((lambda x: 1 - x[n]), (lambda x: x[n] + 1))
odd = lambda n: ((lambda x: 2 - x[n]), (lambda x: 2 - x[n]))
constraint = lambda n: (n % 2) and odd(n) or even(n)
constraint_list = sum([constraint(i) for i in range(2 * N)], ())

最新更新