scipy.optimize.minimize(COBYLA 和 SLSQP)忽略 for 循环内发起的约束

2024-03-19

我正在使用 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 循环中启动的约束是非负约束,但优化给出了决策变量的负值。然而,它确实遵守稳态约束。

当我使用以下代码计算问题时,值受到正确约束:

    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=[]
    steadystate1={'type':'eq', 'fun': lambda x: x.sum()-I.sum() }
    cons.append(steadystate1)


    nonneg0 = {'type':'ineq', 'fun': lambda x: x[0]}
    nonneg1= {'type':'ineq', 'fun': lambda x: x[1]} 
    nonneg2 = {'type':'ineq', 'fun': lambda x: x[2]} 
    nonneg3 = {'type':'ineq', 'fun': lambda x: x[3]} 
    cons.append(nonneg0)
    cons.append(nonneg1)
    cons.append(nonneg2)
    cons.append(nonneg3)

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

有什么想法我哪里出错了吗?我在其他应用程序中看到过类似的约束,所以我无法弄清楚,但假设它很简单。我在该代码的完整版本中需要启动数百个约束,因此像第二个示例中那样将它们写出来并不理想。


我不太懂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]}

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

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)

def f(a):
    def g(x):
        return x[a]
    return g

for t in range (4):
    cons.append({'type':'ineq', 'fun': f(t)})

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

在幕后,这种方法创造了对价值的新参考t(当你将它作为参数传递给f)并存储此引用以供使用g,现在生成一系列正确的函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scipy.optimize.minimize(COBYLA 和 SLSQP)忽略 for 循环内发起的约束 的相关文章

随机推荐

  • Doctrine2 ,通过多对多属性的计数获取实体顺序

    我有两个实体 Article User 文章与名为 likedByUsers 的用户相关 现在 我想按喜欢的数量排序文章 但是 我不想拥有 numberOfLikes 属性 因为更新它太麻烦了 我有太多文章 100k 无法在 PHP 端进行
  • 如何在c中给蒙版上色

    如何对红色 绿色和蓝色值的 32 位无符号整数进行颜色掩码 是这样的吗 要遮盖的颜色 gt gt 8 这应该会得到你想要的结果 short red color gt gt 16 0xFF short green color gt gt 8
  • 如何在javascript中将pdf文件上传到s3?

    我需要将 pdf 文件从 UI 用 Javascript 编写 上传到 Amazon S3 但我正在尝试将该文件上传到 S3 我收到一些 unicode 格式文本 当我将该文本复制到记事本时 或者说任何其他文本文本编辑器我可以人类可读的文本
  • AutoMapper:“忽略其余的”?

    有没有办法告诉 AutoMapper 忽略除了显式映射的属性之外的所有属性 我有外部 DTO 类 这些类可能会从外部发生更改 并且我希望避免显式指定要忽略的每个属性 因为在尝试将它们映射到我自己的对象中时添加新属性会破坏功能 导致异常 据我
  • MySQL触发器将字段更新为id的值

    我想要一个触发器来对插入的记录执行以下操作 pseudocode if new group id is null set new group id new id else don t touch it end 更清楚地说 假设我有一张包含三
  • 更改连接字符串并在运行时重新加载 app.config

    当我使用此代码更改连接字符串时 它不会重新加载app config在运行时 我希望它能够像我们重新加载一样重新加载app config config ConnectionStrings ConnectionStrings JVVNL NEW
  • Tensorflow 对象检测:ImportError:没有名为 nets 的模块

    我目前正在尝试在 Windows 7 上安装 tensorflow 对象检测应用程序 雇主要求 但距离最后几个步骤都失败了 基本上 当我运行安装测试命令时 出现以下错误 导入错误 没有名为 nets 的模块 我读过一些关于这个主题的解决方案
  • 计算并生成完全平方数

    我需要一些关于如何编写 Python 程序的建议 该程序以列表格式提供前 n 个完全平方数的列表 输出应如下所示 How many squares 5 1 4 9 16 25 这是我到目前为止所拥有的 n int raw input How
  • 如何在 WPF 4.0 中创建发光的 TextBox?

    我正在尝试创建一个文本框 当聚焦时它会发光 到目前为止我看到的所有如何执行此操作的示例都基于外发光位图效果 http msdn microsoft com en us library ms752037 28v vs 90 29 aspx 而
  • 配置更改后通知DataSetChanged

    我正在更改设备配置 更改语言 方向等 后进行一些测试 我注意到在此之后 方法 notifyDataSetChanged 不起作用 动作示例 每次我执行删除 保存等操作时 我都会调用 updateList 当我更改方向或更改方向时 用户单击删
  • 值对象模式和数据传输模式之间的区别

    在什么场景下我可以在n层架构中使用这些设计模式 DTO 是您可以在以下位置使用的对象边界系统的 例如 当您有 SOAP Web 服务并且想要返回响应时 您可以使用 DTO 它比必须通过网络返回的实际 XML 更容易处理 DTO 通常由工具生
  • 如何在超时的情况下迭代异步迭代器?

    我觉得用代码更容易理解 try async for item in timeout something timeout 60 await do something useful item except asyncio futures Tim
  • 使用“dotnet build”输出作为“dotnetpublish”输入

    I use dotnet build o somedir 我该如何做后续dotnet publish使用中的工件 somedir 文档不充分 包含 MSBuild 逻辑的 xml 文件简直就是地狱 我什至试图把头撞到桌子上 但没有帮助 您可
  • 在数据库中存储长整型日期是 Java 最佳实践吗?

    我这样做的原因是 在任何数据库中存储为日期对象的日期往往以特定格式编写 这可能与您需要在前端向用户呈现的内容有很大不同 我还认为 如果您的应用程序从不同类型的数据存储中提取信息 这会特别有用 一个很好的例子是 MongoDB 和 SQL 日
  • 无法更新命令行工具,因为 Xcode 告诉我无权访问它们

    我正在使用 Xcode 4 3 2 它尝试安装命令行工具的更新 我点击了更新按钮 Xcode 告诉我 my apple id does not have access to Command Line Tools Contact Apple
  • 自定义布局,使其内容圆角

    我想创建一个通用的 ViewGroup 然后可以在 XML 布局中重用它来圆化放入其中的任何内容的角 因为某些原因canvas clipPath 似乎没有效果 我究竟做错了什么 这是Java代码 package rounded import
  • JUnit @Rule 生命周期与 @Before 交互

    我有一些 JUnit 测试使用TemporaryFolder Rule 他们使用TemporaryFolder in a Before执行一些设置的方法 Rule public TemporaryFolder folder new Temp
  • 使用 res.locals.user 在所有前端视图中显示用户对象

    我正在尝试使用res locals user显示user前端的对象 下面你可以在我的主要看到app js将我创建的中间件归档 const passport require passport const auth require routes
  • Delphi 中的泛型会导致性能瓶颈吗?

    最近我一直在开发一个应用程序 想要拥有多种类型的集合 我不想为其类型声明和实现新的集合类 因此 我考虑使用泛型 但不确定泛型与普通类型实例相比的性能 性能是我关注的主要因素 我的应用程序对时间要求很高 甚至损失几百毫秒也是不可取的 我使用的
  • scipy.optimize.minimize(COBYLA 和 SLSQP)忽略 for 循环内发起的约束

    我正在使用 scipy optimize minimize 来求解复杂的油藏优化模型 SQSLP 和 COBYLA 因为问题受到边界和约束方程的约束 每天有一个决策变量 蓄水量 水库的释放量是根据目标函数内蓄水量变化的函数来计算的 然后应用