- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 COBYLA 对具有约束的线性目标函数进行成本最小化。我通过为每个约束包含一个约束来实现下限和上限。
import numpy as np
import scipy.optimize
def linear_cost(factor_prices):
def cost_fn(x):
return np.dot(factor_prices, x)
return cost_fn
def cobb_douglas(factor_elasticities):
def tech_fn(x):
return np.product(np.power(x, factor_elasticities), axis=1)
return tech_fn
def mincost(targets, cost_fn, tech_fn, bounds):
n = len(bounds)
m = len(targets)
x0 = np.ones(n) # Do not use np.zeros.
cons = []
for factor in range(n):
lower, upper = bounds[factor]
l = {'type': 'ineq',
'fun': lambda x: x[factor] - lower}
u = {'type': 'ineq',
'fun': lambda x: upper - x[factor]}
cons.append(l)
cons.append(u)
for output in range(m):
t = {'type': 'ineq',
'fun': lambda x: tech_fn(x)[output] - targets[output]}
cons.append(t)
res = scipy.optimize.minimize(cost_fn, x0,
constraints=cons,
method='COBYLA')
return res
COBYLA 不遵守上限或下限约束,但它确实遵守技术约束。
>>> p = np.array([5., 20.])
>>> cost_fn = linear_cost(p)
>>> fe = np.array([[0.5, 0.5]])
>>> tech_fn = cobb_douglas(fe)
>>> bounds = [[0.0, 15.0], [0.0, float('inf')]]
>>> mincost(np.array([12.0]), cost_fn, tech_fn, bounds)
x: array([ 24.00010147, 5.99997463])
message: 'Optimization terminated successfully.'
maxcv: 1.9607782064667845e-10
nfev: 75
status: 1
success: True
fun: 239.99999999822359
为什么 COBYLA 不遵守第一个因素约束(即上限@15)?
最佳答案
COBYLA 是事实上尊重您给出的所有界限。
问题出在 cons
列表的构造上。也就是说,lambda 中变量的绑定(bind)和 Python(和 Javascript)中其他内部作用域函数是词法的,并且不会按照您假设的方式运行:http://eev.ee/blog/2011/04/24/gotcha-python-scoping-closures/循环结束后,变量lower
和upper
的值为0
和inf
,变量 factor
的值为 1
,这些值将被所有 lambda 函数使用。
一种解决方法是将变量的特定值显式绑定(bind)到虚拟关键字参数:
for factor in range(n):
lower, upper = bounds[factor]
l = {'type': 'ineq',
'fun': lambda x, a=lower, i=factor: x[i] - a}
u = {'type': 'ineq',
'fun': lambda x, b=upper, i=factor: b - x[i]}
cons.append(l)
cons.append(u)
for output in range(m):
t = {'type': 'ineq',
'fun': lambda x, i=output: tech_fn(x)[i] - targets[i]}
cons.append(t)
第二种方法是添加一个生成 lambda 的工厂函数。
关于scipy - 为什么 COBYLA 不尊重约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25985868/
我正在使用 COBYLA 对具有约束的线性目标函数进行成本最小化。我通过为每个约束包含一个约束来实现下限和上限。 import numpy as np import scipy.optimize de
我正在使用 COBYLA 对具有约束的线性目标函数进行成本最小化。我通过为每个约束包含一个约束来实现下限和上限。 import numpy as np import scipy.optimize de
我在使用带有 method='COBYLA' 的 basshopping 来指定约束时遇到问题。这是一个出现问题的测试用例。本质上,约束被忽略,并且存在超出指定范围的功能试验。我指定一个简单的二次方程
我有一个带有约束的优化问题,但 COBYLA 求解器似乎不遵守我指定的约束。 我的优化问题: cons = ({'type':'ineq', 'fun':lambda t: t},) # all va
我在 scipy 的 optimize.minimize 函数(v.0.11 为 cygwin 构建)中使用算法 'COBYLA'。我观察到在这种情况下似乎没有使用参数 bounds 。例如,简单的例
我正在使用 Accord.Net 的 Cobyla 解算器来解决一个相当简单的非线性问题。在某些情况下,该问题将没有可行点。当我运行一个明显不可行的简单问题时,即使解决方案不可行,求解器也会返回“成功
我正在使用 C++ 中的 NLopt 库、COBYLA 算法 来最小化基于对数的成本函数。我已经在 Matlab 中使用 fmincom 实现了相同的功能。Matlab 函数的性能比 NLopt 好得
我正在使用 scipy.optimize.minimize 来求解复杂的油藏优化模型(SQSLP 和 COBYLA,因为该问题同时受到边界和约束方程的约束)。每天有一个决策变量(存储),并且在目标函数
我是一名优秀的程序员,十分优秀!