gpt4 book ai didi

python - 约束优化,其中约束作为目标函数的一部分进行计算

转载 作者:太空宇宙 更新时间:2023-11-03 14:24:56 25 4
gpt4 key购买 nike

我创建了一个需要很长时间才能运行的函数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 缓存

这是实现Paul Panzer的建议,它依赖@lru_cache这是 Python 3 的一项功能。我们不能直接将此装饰器应用于目标函数,因为它接收一个 NumPy 数组,该数组是可变的,因此不可散列。所以我们需要两个函数:

  • func_with_cons 在给定标量参数的情况下计算目标和约束。
  • f 调用 func_with_cons 并根据 returncons 参数返回目标或约束。

请注意,我们在调用 fmin_cobyla 时需要 consargs 参数,因为没有它,相同的额外参数 args 将传递给约束功能。

from scipy.optimize import fmin_cobyla as mini
from functools import lru_cache

@lru_cache(maxsize=32)
def func_with_cons(x0, x1):
return (x0 - 2)**2 + 4 * (x1 -x0**2)**2, x0 - x1

def f(x, returncons=True):
value, cons = func_with_cons(x[0], x[1])
return cons if returncons else value

func_with_cons.cache_clear()
x_opt = mini(f, (1., 1.), cons=f, args=(False,), consargs=())
print(x_opt)
print(func_with_cons.cache_info())

输出:

[ 1.14491021  1.14491021]
CacheInfo(hits=41, misses=32, maxsize=32, currsize=32)

所以,缓存起作用了。我将约束从 x1-x0 更改为 x0-x1 以表明它也有效(原始约束 x1-x0 满足该函数的全局最小值,因此不会对结果产生影响)。

缓存大小可以小得多:使用 maxsize=2 我们将有 40 次命中(而使用上述大小时为 41 次)。

全局变量

这是执行 Jakob Loven 的建议。函数 f 将约束存储在全局变量中,函数 cons 从中检索它。使用全局变量有明显的缺点,但话又说回来,这在 Python 2.7 中有效。

def f(x):
global stored_cons
stored_cons = x[0] - x[1]
return (x[0] - 2)**2 + 4 * (x[1] -x[0]**2)**2

def cons(x):
return stored_cons

x0 = [1., 1.]
f(x0) # called to initialize stored_cons
x_opt = mini(f, x0, cons=cons)

这将返回 [ 1.14491021, 1.14491021],因为约束不允许全局最小值 [2, 4]。

关于python - 约束优化,其中约束作为目标函数的一部分进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47706005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com