You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pySCIPopt中通过变量名获取模型变量的解值?

在pySCIPopt中通过变量名获取解值的官方方法

pySCIPopt没有直接提供getSolByName这类一键获取变量解值的内置方法,但官方已经提供了通过变量名查找变量的API,结合解值获取方法就能实现你想要的功能,无需自行子类化Model。

官方实现方式

  1. 添加变量时指定名称:使用addVar的name参数给变量命名(这是官方标准用法)
  2. 通过名称获取变量:调用内置方法model.getVarByName(var_name)
  3. 获取变量解值:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:07:25