我建立了一个初始模型,然后尝试在第二个模型中使用该模型的结果,而第二个模型与初始模型有很多相似之处,它确实有更多的约束。我的方法是将初始模型复制到第二个模型,如下所示(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
遇到
Variable not in model
,因为Gurobi中的方法Model.copy()
正在执行初始模型的深度复制(https://www.geeksforgeeks.org/copy-python-deep-copy-shallow-copy/)。因此,在调用Model.copy()
之后,两个模型都包含同名变量,但它们存储在完全不同的内存位置浅拷贝与深拷贝的比较
浅拷贝
深度复制
古罗比例子
让我们考虑下面的示例脚本,创建一个模型(^ {CD4>}),然后复制它(^ {< CD5>}):
使用Python
is
操作符,如果操作符两侧的变量指向同一个对象,则其计算结果为True
,否则False
,我们可以轻松确认第二个模型中的变量x
与代码中定义的变量x
不同(并且隐式地与变量x
)在初始模型中),如示例脚本的最后两行所示这种行为很可能是由Gurobi开发人员选择的,以防止在两个模型共享相同变量时可能发生的不可预测的更改(例如:在一个模型中更改变量
x
,在另一个模型中也会更改它)可能的解决办法
正如Why do I get "GurobiError: Variable not in model" after using Model.copy()?中所建议的,模型副本中的变量可以映射到代码中的变量,方法是
getVarByName()
帮助使用它们的名称访问它们相关问题 更多 >
编程相关推荐