能否直接从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
相关产品推荐
相关产品推荐

