【问题标题】:Python: how to create many constraints for fmin_cobyla optimization using lambda functionsPython:如何使用 lambda 函数为 fmin_cobyla 优化创建许多约束
【发布时间】:2011-09-26 01:00:29
【问题描述】:

我有一个包含几百个数字条目的向量(例如: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 的元素,以及所有奇数索引不等于 +2 或 -2 的元素?
  • 哇,很抱歉,一堆文字被截断了。我需要这个:所有 x(具有偶数索引的元素)都在 -1 和 1 之间。同样,所有 y(具有奇数索引的元素)都在 -2 和 2 之间。

标签: python optimization lambda constraints


【解决方案1】:

试试这个

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)], ())

【讨论】:

  • 感谢您的帮助。我想我明白你在这里说什么,但也许我错过了一些东西,因为我对 python 还很陌生。我插入的约束必须是一系列可调用函数。所以如果我需要 x[0]
【解决方案2】:

约束需要是连续的吗?如果没有,这里有一个简单的方法来使用一个函数。如果满足约束,它将返回 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)]

【讨论】:

  • 哇,它的工作原理!我之前曾尝试过类似的方法,但我的符号一定是不正确的。非常感谢!哦,顺便说一句,这是连续的情况。
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
相关资源
最近更新 更多