Docplex克隆模型变量修改问题:如何获取克隆模型中的对应变量
解决Docplex克隆模型后无法用原变量添加约束的问题
嘿,这个问题我之前也踩过坑!咱们先搞明白为啥会报错:你定义的变量x是属于mdl_1的专属对象,Docplex里每个模型的变量都是独立实例——哪怕克隆后的mdl_2里有个和x同名同范围的变量,它也是另一个全新的对象,直接拿原x给mdl_2加约束,系统自然会说“这个变量不属于当前模型”。
下面给你三种靠谱的解决办法,按需选就行:
方法1:按变量名直接查找
最简单的方式就是用find_var方法,在克隆模型里通过变量名找到对应的克隆变量:
from docplex.mp.model import Model mdl_1 = Model('Model 1') x = mdl_1.integer_var(0, 10, 'x') mdl_1.add_constraint( x <= 10) mdl_1.maximize(x) mdl_1.solve() # 克隆模型 mdl_2 = mdl_1.clone(new_name='Model 2') # 从克隆模型里找名为'x'的变量 x_clone = mdl_2.find_var('x') # 现在就可以正常加约束了 mdl_2.add_constraint( x_clone <= 9) mdl_2.solve()
方法2:克隆时直接获取变量映射
如果你的模型变量比较多,一个个找太麻烦,可以在克隆的时候让系统返回原变量和克隆变量的映射字典:
from docplex.mp.model import Model mdl_1 = Model('Model 1') x = mdl_1.integer_var(0, 10, 'x') mdl_1.add_constraint( x <= 10) mdl_1.maximize(x) mdl_1.solve() # 克隆模型同时拿到变量映射 mdl_2, var_mapping = mdl_1.clone(new_name='Model 2', return_variable_map=True) # 用原变量x当键,直接取克隆后的变量 x_clone = var_mapping[x] mdl_2.add_constraint( x_clone <= 9) mdl_2.solve()
这种方法批量处理变量的时候特别方便,不用记每个变量的名字。
方法3:遍历模型变量(适合小模型)
如果你的模型变量很少,也可以直接遍历克隆模型的变量列表,筛选出目标变量:
# 从克隆模型的整数变量里找名为x的那个 x_clone = next(var for var in mdl_2.iter_integer_vars() if var.name == 'x')
不过变量多的时候这种方法效率就不高了,还是前两种更实用。
最后提醒一句:一定要确保克隆后的变量名称和原变量一致,如果克隆时改动了命名规则,那查找逻辑也要跟着调整哦!
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

