如何在JuMP中获取优化求解每次迭代的变量取值
解决方案
要获取Ipopt求解过程中每一轮迭代的变量值,可以通过设置Ipopt迭代回调函数实现,具体实现代码如下:
using JuMP import Ipopt model = Model(Ipopt.Optimizer) @variable(model, -2.0 <= x <= 2.0, start = -2.0) @NLobjective(model, Min, (x - 1.0) ^ 2) # 存储迭代历史的容器 iter_history = Int[] x_history = Float64[] # 定义迭代回调函数,参数列表为Ipopt固定要求格式 function ipopt_callback( alg_mod::Cint, iter_count::Cint, obj_value::Float64, inf_pr::Float64, inf_du::Float64, mu::Float64, d_norm::Float64, regularization_size::Float64, alpha_du::Float64, alpha_pr::Float64, ls_trials::Cint ) push!(iter_history, iter_count) push!(x_history, value(x)) # 返回true表示继续求解,返回false会提前终止优化 return true end # 为求解器挂载回调函数 MOI.set(model, Ipopt.CallbackFunction(), ipopt_callback) optimize!(model) # 输出结果校验 println("最终求解x值:", value(x)) println("迭代次数序列:", iter_history) println("各迭代步x值:", x_history)
补充说明
- 回调函数的参数列表为Ipopt官方约定的固定格式,不可随意修改参数顺序、数量或类型,否则会触发调用报错
- 若需要同时记录其他迭代信息(比如当前目标函数值、原/对偶不可行度等),可直接从回调的输入参数中提取存储
- 拿到
iter_history和x_history两个序列后,即可直接用绘图库绘制x随迭代次数变化的关系曲线
内容的提问来源于stack exchange,提问作者Piotr Pasza Storożenko
相关产品推荐
相关产品推荐

