为什么在使用 Model.copy() 后出现“GurobiError:变量不在模型中”?

2023-11-27

我需要优化具有不同约束集的模型,但这些约束的子集对于每个模型都是相同的。我的想法是构建一个包含每次都需要的所有变量和所有约束的基本模型。但是,它看起来并不像 Gurobi Model.copy() 方法按照我想象的方式复制变量。这是我希望做的事情的一个非常简化的版本,它显示了我遇到的错误。

>>> from gurobipy import Model
>>> m0 = Model("test")
>>> v = m0.addVar(lb=-1, ub=1)
>>> m0.update()
>>> print m0
<gurobi.Model Continuous instance test: 0 constrs, 1 vars, Parameter changes: LogFile=gurobi.log>
>>> print v in m0.getVars()
True

>>> m = m0.copy()
>>> print m
<gurobi.Model Continuous instance test_copy: 0 constrs, 1 vars, Parameter changes: LogFile=gurobi.log>
>>> print v in m.getVars()
True

>>> m0.addConstr(v <= 0)
<gurobi.Constr *Awaiting Model Update*>
>>> m0.update()
>>> print m0
<gurobi.Model Continuous instance test: 1 constrs, 1 vars, Parameter changes: LogFile=gurobi.log>

>>> m.addConstr(v >= 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "model.pxi", line 2196, in gurobipy.Model.addConstr (../../src/python/gurobipy.c:66304)
  File "model.pxi", line 2089, in gurobipy.Model.__addConstr (../../src/python/gurobipy.c:64663)
gurobipy.GurobiError: Variable not in model

>>> print m
<gurobi.Model Continuous instance test_copy: 0 constrs, 1 vars, Parameter changes: LogFile=gurobi.log>
  1. 为什么 m.getVars() 时 m.addConstr(v >= 0) 找不到变量 v 清楚地表明 v 在模型中?
  2. 有没有其他方法可以重用同一组变量和约束 为了避免从头开始重建每个模型?

软件:OS X El Capitan 上的 Python 2.7.11 和 Gurobi 6.5(也在 Ubuntu 15.04 上进行了测试)


对于问题 1,我找不到关于为什么 m.getVars() 中的 v 在原始示例中返回 True 的明确答案。我想“in”只是比较对象内的值而不是对象本身,但我没有这方面的来源。

对于问题2,我找到了解决办法:

  1. 创建带有名称的变量,保存名称。
  2. 复制模型。
  3. 使用名称映射副本中的变量。

简单的例子:

from gurobipy import Model
m0 = Model("test")
v_name = 'v'
v0 = m0.addVar(lb=-1, ub=1, name=v_name)
m0.update()

m = m0.copy()
# returns True
print v0 in m.getVars()

m0.addConstr(v0 <= 0)
m0.update()
# won't work
#m.addConstr(v0 >= 0)
# will work
v = m.getVarByName(v_name)
m.addConstr(v >= 0)
m.update()

更复杂的例子:

from gurobipy import Model
v_name = {}
m0 = Model("test")
v0 = {}
for i in range(10):
    v_name[i] = "v{0}".format(i)
    v0[i] = m0.addVar(lb=-1, ub=1, name=v_name[i])
m0.update()

m = m0.copy()
v = {}
for i in range(10):
    m0.addConstr(v0[i] <= 0)
    v[i] = m.getVarByName(v_name[i])
    m.addConstr(v[i] >= 0)
m0.update()
m.update()

... 等等。

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

为什么在使用 Model.copy() 后出现“GurobiError:变量不在模型中”? 的相关文章

随机推荐

  • 尽管通过 FBSDKLoginButton 登录,ios Facebook SDK v4.x 访问令牌仍为空

    尽管按钮显示我已登录 但我的 Facebook 访问令牌为空 有人知道为什么会这样吗 来自 RootViewController m void viewDidLoad super viewDidLoad self gt login butt
  • 浏览器显示比原始尺寸更大的图像

    我的网站显示的图像大于其原始尺寸 这些图像比用 Photoshop 创建的原始图像大 20 例如 如果图像的宽度为 200 像素 则浏览器显示为 240 像素 所以我所有的图像都变得模糊了 你知道为什么吗 我找到了解决方案 Windows
  • sql搜索查询多个可选参数

    我正在尝试为我的文档归档系统上的高级搜索页面编写查询 我正在尝试通过多个可选参数进行搜索 我有大约 5 个参数 它们可以是空字符串或搜索字符串 我知道我不必将每个检查为字符串或空 并为每个组合创建单独的存储过程 编辑 最终使用 ISNULL
  • 强制在 C# 中实现通用接口

    无论如何 是否有强制通用定义的约束来实现 通用接口 也就是说 我希望该类支持传递接口和约束它的通用类 以便该类实现该接口 例如 如果我说 MyGenericClass
  • PHP限制文本字符串不包括html标签?

    这是对我不起作用的 我想将可见文本限制为 100 个字符 但使用substr 还包括限制中的不可见文本 a href http www a
  • Neo4j 中的基元计数

    我一直在阅读文档 for neo4j这是成分并且还没有遇到让我查询图中基元 节点 关系和属性 总数的功能 这个功能是否存在于某处 或者我是否必须编写遍历整个图表并进行计数的代码 谢谢你的提问 我是 Neo4j 团队的成员 我们目前拥有报告此
  • Spring Security在发送授权标头时允许所有拒绝访问

    我的安全配置如下 http authorizeRequests antMatchers authenticate fullyAuthenticated anyRequest permitAll and httpBasic 它可以工作并且所有
  • Rails:.m4v 文件的 MIME 类型问题

    在我的 Rails 应用程序中 我尝试获取文件的 MIME 类型 如下所示 MIME Types type for example m4v to s 但它不认识它 我尝试添加以下内容config initializers mime type
  • PyQt 4.7 - 在 Windows 上安装后出现导入错误

    我一直在尝试安装PyQt 4 7在 Vista 上 但当我尝试执行以下操作时遇到导入错误 from PyQt4 import QtCore QtGui ImportError DLL 加载失败 找不到指定的模块 我检查了我的系统路径 并且C
  • “实例 <服务器位于 0x2298c...> 未持久化”

    全新安装 postgreSQL15 后 看起来好像安装正确 因为我可以通过 psql 很好地访问服务器 但是 当我尝试通过 pgAdmin4 访问它时 它不会自动检测服务器 因此 我尝试通过 注册 服务器 对话框手动添加服务器 但随后提示我
  • 32 位处理器真的可以寻址 2^32 个内存位置吗?

    我觉得这可能是一个奇怪 愚蠢的问题 但这里是 在问题中C 中的 NULL 是否需要 定义为零 已经确定NULL指针指向不可寻址的内存位置 而且NULL is 0 现在 据说 32 位处理器可以寻址2 32记忆位置 2 32只是可以使用以下方
  • Java keyTool - 将主要/辅助中间证书附加到密钥存储[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我已经创建了一个密钥库 图中的 server jks 并导入了相关密钥对 keytool importkeystore srckeystore server p12 destkeys
  • 使用数据映射器模式,实体(域对象)是否应该了解映射器?

    我是第一次使用 Doctrine2 但我认为这个问题足够通用 不依赖于特定的 ORM 数据映射器模式中的实体是否应该意识到 以及use 地图绘制者 我有一些具体的例子 但它们似乎都可以归结为同一个普遍问题 如果我正在处理来自外部源的数据 例
  • 使用 processBuilder 执行 shell 命令并与其交互

    我正在尝试创建一个程序 允许我通过带有参数的终端 如果您想知道 则为树莓派的 OmxPlayer 执行命令 但我希望在启动后能够与它进行交互命令 例如我想做 omxplayer win x1 y1 x2 y2 然后可以按 p 暂停视频 音频
  • 如何只制作注册邀请函?

    使用 Meteor 帐户 以及accounts ui 有没有一种简单的方法可以只邀请新用户注册 例如 通过提供邀请链接或邀请码 我在 Meteor 文档中能找到的唯一相关内容是Meteor sendEnrollmentEmail但这并不能解
  • 如何通过连接表填充 has_many 中的字段

    我有一个关于活动记录关联的问题 参考 Rails 文档的这一部分 http guides rubyonrails org association basics html the has many through association 如果
  • 关闭 stdout 和 stdin 文件描述符后重新打开它们

    我正在编写一个函数 给定一个参数 该函数会将标准输出重定向到文件或从文件读取标准输入 为此 我关闭与 stdout 或 stdin 关联的文件描述符 以便当我打开文件时 它会在我刚刚关闭的描述符下打开 这是可行的 但问题是一旦完成 我需要将
  • 计算船只到海岸或海岸线的距离

    对于船只的 200M GPS 经度 纬度 坐标数据集 我想计算到最近陆地或海岸线的近似距离 作为一个名为 distance to shore 的函数 它将返回该海岸的距离和国家 地区 我使用的国家边界和海岸线形状文件来自 http www
  • 在这种情况下SQLite线程安全吗?

    我需要通过一个拥有数据库连接的单例对象从多个线程进行数据库访问操作 我从 SQLite3 的网站上读到 它说 sqlite3 结构只能在调用 sqlite3 open 来创建它的同一线程中使用 您无法在一个线程中打开数据库 然后将句柄传递给
  • 为什么在使用 Model.copy() 后出现“GurobiError:变量不在模型中”?

    我需要优化具有不同约束集的模型 但这些约束的子集对于每个模型都是相同的 我的想法是构建一个包含每次都需要的所有变量和所有约束的基本模型 但是 它看起来并不像 Gurobi Model copy 方法按照我想象的方式复制变量 这是我希望做的事