我做了一个函数f
,它需要很长时间才能运行。约束在f
的例程末尾计算。如何在不计算f
两次的情况下将这些约束返回给cobyla?在
import numpy as np
from scipy.optimize import fmin_cobyla as mini
def f(x, returncons=True):
if returncons: return x[1] - x[0]
else: return (x[0] - 2)**2 + 4 * (x[1] -x[0]**2)**2
x_opt = mini(f, [1., 1.], args=(False,), cons=f)
LRU缓存
这是实现paulpanzer的建议,它依赖于python3的特性@lru_cache。我们不能直接将这个decorator应用于目标函数,因为它接收一个NumPy数组,它是可变的,因此不能散列。所以我们需要两个函数:
func_with_cons
计算给定标量参数的目标和约束。在f
调用func_with_cons
,并根据returncons
参数返回目标或约束。在注意,我们在调用
fmin_cobyla
时需要consargs
参数,因为没有它,相同的额外参数args
将传递给约束函数。在输出:
^{pr2}$所以,缓存起作用了。我将约束从x1-x0更改为x0-x1,以证明它也有效(原始约束x1-x0是由该函数的全局最小值满足的,因此它不会对结果产生任何影响)。在
缓存大小可以小得多:使用
maxsize=2
我们将有40次命中(而上面的大小是41次)。在全局变量
这是在执行雅各布·洛文的建议。函数f将约束存储在一个全局变量中,cons从中检索约束。全局函数的使用有明显的缺点,但是同样,这在Python2.7中是可行的。在
这将返回
[ 1.14491021, 1.14491021]
,因为约束不允许全局最小值[2,4]。在相关问题 更多 >
编程相关推荐