我使用 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
。对于我的问题,这是一个非常重要的边界条件!
“在每次迭代中传递给我的函数 opt()
的 x[2]
的值必须始终大于 x[3]
"-- 如何实现这一目标?
我的边界(b1
到 b9
)定义有什么问题吗?
或者是否有更好的方法来定义我的边界?
请帮帮我。
最佳答案
fmin_cobyla()
不是内点方法。也就是说,它会在优化运行过程中将边界外的点(“不可行点”)传递给函数。
您需要修复的是 b9
和 b10
不是 fmin_cobyla()
期望的形式。如果绑定(bind)函数在边界内,则需要返回正数;如果正好在边界上,则返回 0.0;如果超出边界,则返回负数。理想情况下,这些函数应该是平滑的。 fmin_cobyla()
将尝试对这些函数进行数值导数,以便让它知道如何回到可行域。
b9 = lambda x: x[2] - x[3]
不过,我不确定如何以 fmin_cobyla()
能够使用的方式实现 b10
。
关于python - 在 scipy 中为 fmin_cobyla 指定约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1336777/