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

能否直接从PyScipOpt的Model对象中获取SCIP的统计输出数值?

解决方案

PySCIPOpt 4.0及以上版本已经内置了结构化获取统计数据的接口,无需解析文本或文件输出,具体用法如下:


1. 全局求解统计(含原始对偶积分等核心指标)

调用model.getStatistics()方法会返回Statistics对象,直接通过属性读取所需指标即可,示例:

import pyscipopt as pso

model = pso.Model()
# 模型构建、求解逻辑省略
model.optimize()

stats = model.getStatistics()
# 常用指标示例
solve_time = stats.solving_time  # 求解总耗时
primal_dual_integral = stats.primal_dual_integral  # 原始对偶积分
final_gap = stats.gap  # 最终Gap
total_nodes = stats.n_nodes  # 总分支节点数
lp_iterations = stats.n_lp_iterations  # LP迭代总次数

如果需要查询所有支持的统计字段,直接执行print(dir(stats))即可查看完整属性列表。


2. 分支规则、原始启发式的单独统计

可以直接调用对应接口获取所有组件的单独统计数据:

# 获取所有原始启发式的统计
for heur in model.getHeuristics():
    print(f"启发式名称:{heur.name}")
    print(f"调用次数:{heur.ncalls}")
    print(f"找到可行解数量:{heur.nsolsfound}")
    print(f"耗时:{heur.time}")

# 获取所有分支规则的统计
for rule in model.getBranchrules():
    print(f"分支规则名称:{rule.name}")
    print(f"调用次数:{rule.ncalls}")
    print(f"新增分支割数量:{rule.ncutsadded}")
    print(f"耗时:{rule.time}")

旧版本兼容方案(PySCIPOpt <4.0)

如果使用的是未支持上述接口的旧版本,可以用内存流捕获打印输出,避免落盘再解析:

import io
from contextlib import redirect_stdout

# 捕获printStatistics的输出到内存
buffer = io.StringIO()
with redirect_stdout(buffer):
    model.printStatistics()
stats_text = buffer.getvalue()

# 后续可用正则匹配提取所需字段即可,效率远高于读本地文件

内容的提问来源于stack exchange,提问作者Inquisitive

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:45:02