咨询Pyomo中Bonmin求解器迭代次数对应的存储变量
我在Pyomo中使用Bonmin求解器,设置
tee=True后求解模型,得到如下输出:
Cbc0001I Search completed - best objective 41573.30169699511, took 11448 iterations and 220 nodes (18.05 seconds)
Cbc0032I Strong branching done 18 times (570 iterations), fathomed 0 nodes and fixed 0 variables
Cbc0035I Maximum depth 11, 0 variables fixed on reduced cost。
请问哪个变量保存了该迭代次数(11448)?我推测它可能存在于solver_message中。
嘿,你猜的方向完全没错!solver_message确实能拿到这个信息,但其实还有更省心的方式——不用自己去解析日志字符串,Pyomo已经帮你把关键指标提取好了:
优先方案:直接从求解结果对象提取
当你调用Bonmin求解后,会得到一个solver_results对象(就是SolverFactory('bonmin').solve(model, tee=True)返回的那个)。由于Bonmin底层基于Cbc,你可以直接从结果的solver字段里读取总迭代次数:# 假设你已经执行了求解,结果存在solver_results里 total_iterations = solver_results.solver.iterations这个值就是你要的
11448,完全不用自己处理日志文本,靠谱又省事。备用方案:解析
solver_message
如果遇到求解器版本兼容或者其他特殊情况,上面的方法取不到值,你可以手动解析solver_message里的日志内容。solver_message是一个包含完整求解日志的字符串,用正则表达式就能匹配出迭代次数:import re # 从求解结果中拿到日志 solver_log = solver_results.solver.message # 匹配"took X iterations"格式的内容 match_result = re.search(r'took (\d+) iterations', solver_log) if match_result: total_iterations = int(match_result.group(1))
需要提醒的是,不同版本的Bonmin/Cbc输出格式可能略有微调,所以优先推荐第一种直接提取字段的方式,稳定性更高。
内容的提问来源于stack exchange,提问作者lymbot

