Указание ограничений для fmin_cobyla в scipy

Я использую Python 2.5.

Я передаю границы оптимизации кобылы:

import numpy 
from numpy import asarray

Initial = numpy.asarray [2, 4, 5, 3]       # Initial values to start with

#bounding limits (lower,upper) - for visualizing

#bounds = [(1, 5000), (1, 6000), (2, 100000), (1, 50000)] 

# actual passed bounds

b1 = lambda  x: 5000 - x[0]      # lambda x: bounds[0][1] - Initial[0]

b2 = lambda  x: x[0] - 2.0       # lambda x: Initial[0] - bounds[0][0]

b3 = lambda  x: 6000 - x[1]      # same as above

b4 = lambda  x: x[1] - 4.0

b5 = lambda  x: 100000 - x[2]

b6 = lambda  x: x[2] - 5.0

b7 = lambda  x: 50000 - x[3]

b8 = lambda  x: x[3] - 3.0

b9 = lambda  x: x[2] >  x[3]  # very important condition for my problem!


opt= optimize.fmin_cobyla(func,Initial,cons=[b1,b2,b3,b4,b5,b6,b7,b8,b9,b10],maxfun=1500000)

На основе начальных значений Initial и в пределах/в пределах от b1 до b10 значения передаются в opt(). Но значения отклоняются, особенно с b9. Это очень важное граничное условие для моей задачи!

"Значение x[2], передаваемое моей функции opt() на каждой итерации, всегда должно быть больше, чем x[3]" -- Как этого можно добиться?

Что-то не так в моем определении границ (от b1 до b9)?

Или есть лучший способ определить мои границы?

Помогите пожалуйста мне.


person Community    schedule 26.08.2009    source источник
comment
Я бы пересмотрел заголовок, чтобы указать, что это вопрос о том, как указать ограничения для функции scipy fmin_cobyla, а не о том, как лямбды указываются в целом.   -  person Barry Wark    schedule 26.08.2009


Ответы (2)


fmin_cobyla() не является методом внутренней точки. То есть он будет передавать точки, выходящие за пределы («недопустимые точки»), в функцию в ходе выполнения оптимизации.

Вам нужно будет исправить то, что b9 и b10 не в той форме, которую ожидает fmin_cobyla(). Связанные функции должны возвращать положительное число, если они находятся в пределах границы, 0,0, если они точно находятся на границе, и отрицательное число, если они выходят за пределы. В идеале эти функции должны быть гладкими. fmin_cobyla() попытается получить числовые производные от этих функций, чтобы сообщить, как вернуться в допустимую область.

b9 = lambda x: x[2] - x[3]

Однако я не уверен, как реализовать b10 таким образом, чтобы fmin_cobyla() мог его использовать.

person Robert Kern    schedule 26.08.2009
comment
max(x) - min(x) может работать - он достаточно гладкий, › 0, чем больше x находится в пределах границ, == 0, когда точно на границе (я не вижу способа быть за пределами одномерной границы с четырехмерной точкой ;-). - person Alex Martelli; 27.08.2009
comment
x[2]-x[3] › 0 и x[2] › x[3] эквивалентны условиям - person fortran; 27.08.2009
comment
Спасибо, с лямбдой x становится лучше: x[2] - x[3], но я получаю этап, на котором значения x[2] и x[3] одинаковы, но если я хочу передать b9 = lambda x: x[2] › x[3] значение x[2] всегда должно быть больше значения x[3]. Для этого какие изменения я должен сделать? пожалуйста, смотрите отредактированный код. - person ; 28.08.2009

для b10 возможным вариантом может быть:

b10 = lambda x: min(abs(i-j)-d for i,j in itertools.combinations(x,2))

где d – это дельта, превышающая минимальную разницу между вашими переменными (например, 0,001).

person fortran    schedule 27.08.2009
comment
Отличная идея! к сожалению, я использую только python 2.5, основная проблема заключается в том, что opt() должен твердо придерживаться b9 = lambda x: x[2] › x[3] , x[2] всегда должен быть больше x[3], это условие очень важно для моей проблемы. Как закодировать условие b9? - person ; 28.08.2009