Julia中使用JuMP调用CbcSolver如何实时打印求解进度?
JuMP + CbcSolver:实时打印求解进度&修复超时失效问题
嘿,针对你遇到的这两个问题,我来给你拆解解决方案:
一、让求解进度实时打印出来
你说日志要等求解完才显示,这基本是输出缓冲搞的鬼——Julia默认会攒着输出内容,直到缓冲区满或者程序结束才一次性打印。解决方法有两种:
- 全局开启即时输出
在脚本最开头加一行,强制标准输出实时刷新:
Base.stdout = Base.TTY(Base.STDIN, Base.STDOUT, Base.STDERR, true)
之后Cbc的日志就会边跑边打,你能实时看到求解进度了。
- 局部手动刷新(不全局修改)
如果你不想改全局设置,也可以在求解前后手动刷新缓冲区,同时确保日志级别拉满:
# 用log=3获取最详细的进度日志 m = Model(solver = CbcSolver(log=3)) # 这里写你的模型构建代码... # 刷新缓冲区,确保日志实时输出 flush(stdout) status = solve(m) flush(stdout)
二、修复超时参数不生效的问题
你设置的sec=90是错的!JuMP里CbcSolver的超时参数叫seconds,不是sec——错误的参数会被求解器直接忽略,难怪设置大值后进程停不下来。
正确的写法应该是:
# 90秒超时+实时日志 m = Model(solver = CbcSolver(seconds=90, log=3))
要是你不确定参数有没有生效,可以打印求解器配置确认:
println(solverinstance(m))
这会列出所有已生效的参数,你能看到seconds是不是正确设成90了。
内容的提问来源于stack exchange,提问作者Carlos Eduardo Rossignolo
相关产品推荐
相关产品推荐

