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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:18:03