python - 在 scipy 中为 fmin_cobyla 指定约束

标签 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。对于我的问题,这是一个非常重要的边界条件!

“在每次迭代中传递给我的函数 opt()x[2] 的值必须始终大于 x[3]"-- 如何实现这一目标?

我的边界(b1b9)定义有什么问题吗?

或者是否有更好的方法来定义我的边界?

请帮帮我。

最佳答案

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

您需要修复的是 b9b10 不是 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/

相关文章:

python - Tensorflow 高级索引 : Assign a smaller tensor into a bigger one into a position based on two index tensors

python - 多线程类(python)

创建我自己的计算器但程序不起作用

PHP 循环内函数内的函数 :S

c# - 我可以内联指定我的显式类型比较器吗?

python - 如何在 Odoo 中返回两个变量?

python - 什么时候使用 WSGI 中间件?

java - 始终返回 true 的内置 Java 8 谓词?

python - 使用 scipy.stats 拟合非标准化分布

C++11 - 捕获中的 lambda 函数传递向量并修改它