scipy.optimize.minimize.最小化(COBYLA和SLSQP)忽略在for循环中启动的约束

2024-10-04 03:26:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用scipy.optimize.minimize.最小化求解一个复杂的油藏优化模型(SQSLP和COBYLA,因为问题同时受到边界和约束方程的约束)。每天有一个决策变量(蓄水量),在目标函数内,水库的释放量作为蓄水量变化的函数进行计算。然后,基于释放和存储惩罚的惩罚以最小化惩罚为目标(目标函数是所有惩罚的总和)。我在这个模型中添加了一些约束条件,将存储的变化限制在物理系统限制范围内,这是决策变量x(t+1)和x(t)之间的差异,并且还取决于时间步骤I(t)的流入量。使用for循环将这些约束添加到约束字典列表中。在此for循环函数之外添加的约束。然而,在for循环中启动的涉及时间的约束则不会。在

显然这个问题很复杂,所以我重新创建了一个更简单的版本来说明这个问题。这个问题有四个决策变量,并寻求最小化目标函数(我称之为函数),约束条件为稳态(I=流入必须等于x=流出)和非负性(即流出x不能为负):

    import numpy as np
    from scipy.optimize import minimize

    def function(x):
        return -1*(18*x[0]+16*x[1]+12*x[2]+11*x[3])

    I=np.array((20,50,50,80))
    x0=I

    cons=[]
    steadystate={'type':'eq', 'fun': lambda x: x.sum()-I.sum() }
    cons.append(steadystate)


    for t in range (4):
        def const(x):    
            y=x[t]
            return y
        cons.append({'type':'ineq', 'fun': const})

    out=minimize(function, x0, method="SLSQP", constraints=cons)
    x=out["x"]

在for循环中启动的约束是非负约束,但优化为决策变量提供负值。但是,它确实遵守steadystate约束。在

当我使用以下代码计算问题时,值被适当地约束:

^{pr2}$

你知道我哪里出错了吗?我在其他应用程序中也看到过类似的约束,所以我无法理解,但假设它很简单。在这个代码的完整版本中,我有数百个约束要启动,所以像第二个示例那样编写它们并不理想。在


Tags: 函数模型import版本目标for时间scipy
1条回答
网友
1楼 · 发布于 2024-10-04 03:26:40

我不太懂Python,但我知道如何解决你的问题。在第一个代码片段中,const函数使用对t本身的引用(因为内部函数与外部函数共享作用域),因此产生了等效的:

cons[0] = {'type':'ineq', 'fun': lambda x: x[t]}
cons[1] = {'type':'ineq', 'fun': lambda x: x[t]} 
cons[2] = {'type':'ineq', 'fun': lambda x: x[t]} 
cons[3] = {'type':'ineq', 'fun': lambda x: x[t]}

这是错误的。这可以通过使用咖喱来解决:

^{pr2}$

在幕后,这种方法创建了一个对t持有的值的新引用(当您将它作为参数传递给f)并将该引用存储在g中使用,现在生成了一系列正确的函数。在

相关问题 更多 >