在scipy中指定fmin_cobyla的约束

时间:2009-08-26 18:53:38

标签: python function lambda scipy specifications

我使用Python 2.5。

我正在通过cobyla优化的界限:

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以及在b1b10的范围内/,将值传递给opt()。但价值观正在发生变化,尤其是b9。这是我问题的一个非常重要的条件!

“每次迭代时传递给我的函数x[2]的{​​{1}}的值必须始终大于opt()” - 如何才能实现此目标?

我的界限(x[3]b1)定义有什么不对吗?

或者有更好的方法来定义我的界限吗?

请帮帮我。

2 个答案:

答案 0 :(得分:3)

fmin_cobyla()不是内点法。也就是说,它会在优化运行过程中将超出边界的点(“不可行点”)传递给函数。

您需要解决的问题是b9b10不是fmin_cobyla()期望的形式。如果绑定函数在边界内,则绑定函数需要返回正数;如果它们正好在绑定范围内,则需要返回0.0;如果它们超出边界,则需要返回负数。理想情况下,这些功能应该是平滑的。 fmin_cobyla()会尝试对这些函数进行数值导数,以便让它知道如何返回可行区域。

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

我不确定如何以b10能够使用的方式实施fmin_cobyla()

答案 1 :(得分:2)

对于b10,可能的选项可能是:

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

其中 d 是一个大于变量之间所需最小差异的增量(例如0.001)