指定约束在SciPy的fmin_cobyla
-
20-09-2019 - |
题
我使用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
按/边界b1
内b10
的值传递给opt()
。但值偏离,尤其是b9
。这是我的问题,一个很重要的边界条件!
“x[2]
传递给我的功能opt()
在每次迭代的值必须始终大于x[3]
更大?” - 这怎么可能做到这一点。
这有什么错在我的范围(b1
到b9
)的定义?
还是有我的边界界定的一个更好的办法?
请帮我。
解决方案
fmin_cobyla()
不是内点方法。即,将在optmization运行过程中传递是外部边界(“不可行点”)的函数的点。
在你将需要解决的事情是,b9
和b10
不在形式fmin_cobyla()
预期。绑定的功能需要返回一个正数,如果它们绑定,0.0内,如果它们是完全相同的束缚,如果他们是出界的负数。理想情况下,这些职能应光滑。 fmin_cobyla()
将尝试利用这些功能的数值导为了让它知道如何回到可行域。
b9 = lambda x: x[2] - x[3]
我不知道怎样的方式,将b10
能够使用,但实现fmin_cobyla()
。
其他提示
有B10,一个可能的选项可以是:
b10 = lambda x: min(abs(i-j)-d for i,j in itertools.combinations(x,2))
,其中 d 是增量比你想你的变量之间的最小差值较大(例如0.001)
不隶属于 StackOverflow