Python 2.7 scipy.optimize.minimize()约束取决于成本函数

Python 2.7 scipy.optimize.minimize()约束取决于成本函数,python-2.7,scipy-optimize-minimize,Python 2.7,Scipy Optimize Minimize,我正在使用scipy.optimize.minimize(method='COBYLA')运行约束优化 为了评估代价函数,我需要运行一个相对昂贵的计算来从输入变量计算数据集,而代价函数是该数据集的一个属性(计算成本较低)。然而,我的两个限制也依赖于昂贵的数据。 到目前为止,我发现约束优化的唯一方法是让每个约束函数重新计算成本函数已经拥有的相同数据集 简化准代码: # universal cost function evaluator def criterion_from_x(x, cfun):

我正在使用
scipy.optimize.minimize(method='COBYLA')
运行约束优化

为了评估代价函数,我需要运行一个相对昂贵的计算来从输入变量计算数据集,而代价函数是该数据集的一个属性(计算成本较低)。然而,我的两个限制也依赖于昂贵的数据。 到目前为止,我发现约束优化的唯一方法是让每个约束函数重新计算成本函数已经拥有的相同数据集

简化准代码:

# universal cost function evaluator
def criterion_from_x(x, cfun):
    data = expensive_fun(x)
    return(cfun(data))

def costfun(data):
    return(cheap_fun1(data))

def constr1(data):
    return(cheap_fun2(data))

def constr2(data):
    return(cheap_fun3(data))


constraints = [{'type':'ineq', 'fun':criterion_from_x, 'args':(constr1,)},
               {'type':'ineq', 'fun':criterion_from_x, 'args':(constr2,)}

# initial guess
x0 = np.ones((6,))

opt_result = minimize(criterion_from_x, x0, method='COBYLA',
                      args=(costfun,), constraints=constraints)
所以我有一个通用的“评估某些成本”函数,它运行昂贵的计算,然后评估给定的任何标准。但它需要为优化器的每个迭代运行三次

我没有找到任何方法来设置使用
x
生成
数据
,然后将数据传递给目标函数和约束函数的内容

这样的东西存在吗?我注意到
minimize()
callback
参数,但这是一个在每个步骤后调用的函数。我需要某种预处理器,在每个步骤之前调用
x
,然后使用其结果而不是
x
。也许有办法把它偷偷带进去?我希望避免编写自己的优化器

解决这个问题的一个传统方法是在主成本函数中添加违反约束的惩罚函数,并在没有显式约束的情况下运行优化器,但我以前尝试过,发现在违反约束的情况下,主成本函数可能会变得有些混乱,因此,优化器可能会被困在违反约束的某个地方而无法再次发现

代码需要在Python v2.7.6到2.7.13以及scipy 0.13到0.17的机器上运行