Python: как создать множество ограничений для оптимизации fmin_cobyla с помощью лямбда-функций - PullRequest
2 голосов
/ 30 июня 2011

У меня есть вектор из нескольких сотен числовых записей (например: Xo = [x1, y1, x2, y2, ..., xN, yN]), где N - произвольное число.Мне нужно передать этот вектор оптимизатору scipy fmin_cobyla с простыми простыми ограничениями на каждую запись: 1. Все x (то есть. X1, x2, ..., xN) таковы, что -1

I 'Мы пытались использовать лямбда-функции для определения таких ограничений

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

Мне может понадобиться использовать consargs в fmin_cobyla.Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Должны ли ограничения быть непрерывными? Если нет, вот простой способ сделать это с помощью одной функции. Он вернет 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)]
1 голос
/ 30 июня 2011

попробуйте

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, но это еще одна попытка после прочтения комментария Дэвида

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)], ())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...