如何在pySCIPopt中通过变量名获取模型变量的解值?
在pySCIPopt中通过变量名获取解值的官方方法
pySCIPopt没有直接提供getSolByName这类一键获取变量解值的内置方法,但官方已经提供了通过变量名查找变量的API,结合解值获取方法就能实现你想要的功能,无需自行子类化Model。
官方实现方式
- 添加变量时指定名称:使用
addVar的name参数给变量命名(这是官方标准用法) - 通过名称获取变量:调用内置方法
model.getVarByName(var_name) - 获取变量解值:使用
model.getVal(var)(自动取最优解)或者先获取最优解对象sol = model.getBestSol(),再用sol[var]
示例代码:
from pyscipopt import Model model = Model("Example") # 官方标准方式添加带名称的变量 x = model.addVar(name="x") y = model.addVar(name="y", vtype="INTEGER") # 添加约束(官方支持直接指定name参数) model.addCons(2*x - y*y >= 3, name="cnst01") model.addCons(y >= 1) model.setObjective(x + y) model.setIntParam("display/verblevel", 1) model.optimize() print("Status:", model.getStatus()) # 通过名称获取变量并取值 x_var = model.getVarByName("x") y_var = model.getVarByName("y") print("x的解值 = %s" % model.getVal(x_var)) print("y的解值 = %s" % model.getVal(y_var)) # 或者通过最优解对象取值 sol = model.getBestSol() print("x的解值(通过sol对象) = %s" % sol[x_var])
关于你的自定义子类实现
你的子类实现是可行的,但存在几个可以优化的点:
- 无需自行维护
_varByName字典,因为官方getVarByName已经实现了变量名到变量的映射 addVar的参数处理不够严谨:官方addVar的第一个参数并非变量名,而是可选的varname(默认None),你的写法会覆盖其他参数的传入逻辑__add__重载的约束命名功能,官方addCons已经支持直接传入name参数,不需要额外重载运算符
如果还是想要类似solByName的便捷方法,可以给Model添加一个简单的扩展方法,而不用子类化:
def solByName(model, name): var = model.getVarByName(name) return model.getVal(var) # 使用方式 print("solByName('x') = %s" % solByName(model, "x"))
内容的提问来源于stack exchange,提问作者Michael Hecht
相关产品推荐
相关产品推荐

