在Python/Gurobi中向模型添加新约束

2024-07-03 06:54:27 发布

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

我建立了一个初始模型,然后尝试在第二个模型中使用该模型的结果,而第二个模型与初始模型有很多相似之处,它确实有更多的约束。我的方法是将初始模型复制到第二个模型,如下所示(mdl是我没有带到这里的初始模型,mdll是第二个模型):

mdll=Model('Boarding_test2')
Best_X_values= mdl.getAttr('x', X)
mdll.update()
mdll=mdl.copy()
mdll.getVars() 
mdll.getConstrs()

如您所见,我复制了初始模型以及约束和变量。 要删除初始模型中存在但我不希望在第二个模型中使用的约束,我实现了以下功能:

Del_cons=mdll.getConstrByName('Stefen')
Del_cons.__dict__
mdll.remove(Del_cons)
mdll.update()

最后,我尝试向第二个模型添加新约束,如下所示:

mdll.addConstrs((Y[k,p])==1 for k in K for p in P if k==p and p!=p_sim)   
mdll.addConstrs(quicksum(Y[k,p] for k in K if k==k_sim )==1  for p in P if p==p_sim)  
mdll.addConstrs(quicksum(Y[k,p] for p in P if p==p_sim)==1  for k in K if k==k_sim) 

但是我收到以下错误。有人能帮我吗

GurobiError                               Traceback (most recent call last)

  1 #mdll.remove(mdll.getConstrByName('Stefen'))
----> 2 mdll.addConstrs((Y[k,p])==1 for k in K for p in P if k==p and p!=p_sim)
  3 mdll.update()
  4 mdll.addConstrs(quicksum(Y[k,p] for k in K if k==k_sim )==1  for p in P if p==p_sim)
  5 mdll.update()

model.pxi in gurobipy.Model.addConstrs()

model.pxi in gurobipy.Model.addConstr()

model.pxi in gurobipy.Model.__addConstr()

GurobiError: Variable not in model

Tags: in模型formodelifupdatesimdel
1条回答
网友
1楼 · 发布于 2024-07-03 06:54:27

遇到Variable not in model,因为Gurobi中的方法Model.copy()正在执行初始模型的深度复制(https://www.geeksforgeeks.org/copy-python-deep-copy-shallow-copy/)。因此,在调用Model.copy()之后,两个模型都包含同名变量,但它们存储在完全不同的内存位置

浅拷贝与深拷贝的比较

浅拷贝

enter image description here

深度复制

enter image description here

古罗比例子

让我们考虑下面的示例脚本,创建一个模型(^ {CD4>}),然后复制它(^ {< CD5>}):

from gurobipy import *

# Create a new model
m = gp.Model("mip1")

# Create variables
x = m.addVar(vtype=GRB.BINARY, name="x")
y = m.addVar(vtype=GRB.BINARY, name="y")
z = m.addVar(vtype=GRB.BINARY, name="z")

# Set objective
m.setObjective(x + y + 2 * z, GRB.MAXIMIZE)

# Add constraints:
m.addConstr(x + 2 * y + 3 * z <= 4, "c0")
m.addConstr(x + y >= 1, "c1")

# Optimize model
m.optimize()

# Copy the model
m2 = m.copy()

#Check if variable "x" from the initial model is different from variable "x" in the copied model
print(x is m2.getVarByName("x")) #will print False => variable "x" from our code is different than the variable "x" in the copied model
print(m.getVarByName("x") is m2.getVarByName("x")) # will print False => variable "x" in the initial model is different than the variable "x" in the copied model

使用Pythonis操作符,如果操作符两侧的变量指向同一个对象,则其计算结果为True,否则False,我们可以轻松确认第二个模型中的变量x与代码中定义的变量x不同(并且隐式地与变量x)在初始模型中),如示例脚本的最后两行所示

这种行为很可能是由Gurobi开发人员选择的,以防止在两个模型共享相同变量时可能发生的不可预测的更改(例如:在一个模型中更改变量x,在另一个模型中也会更改它)

可能的解决办法

正如Why do I get "GurobiError: Variable not in model" after using Model.copy()?中所建议的,模型副本中的变量可以映射到代码中的变量,方法是getVarByName()帮助使用它们的名称访问它们

xInModelCopy = m2.getVarByName("x") # declare a variable for "x" in the copied model

相关问题 更多 >