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

优化后如何获取Ipopt的互补不可行性、对偶不可行性与原始不可行性?

获取Ipopt优化后的不可行性指标

不需要额外编写回调函数,Ipopt本身通过求解器的结果对象/属性直接提供了这些指标的访问方式,以下分常用接口说明:

C++接口

求解完成后,通过IpoptApplication实例的GetIpoptResult()方法获取IpoptResult对象,即可访问对应指标:

  • 原始不可行性:result->primal_infeasibility
  • 对偶不可行性:result->dual_infeasibility
  • 互补不可行性:result->complementary_slackness

示例代码片段:

#include "IpIpoptApplication.hpp"
#include "IpIpoptResult.hpp"

// 初始化并配置Ipopt应用
Ipopt::SmartPtr<Ipopt::IpoptApplication> app = IpoptApplicationFactory();
// ... 设置问题、配置求解器参数 ...

// 执行优化
Ipopt::ApplicationReturnStatus status = app->OptimizeTNLP(your_tnlp_instance);

// 获取结果指标
Ipopt::SmartPtr<Ipopt::IpoptResult> result = app->GetIpoptResult();
if (result) {
    double primal_inf = result->primal_infeasibility;
    double dual_inf = result->dual_infeasibility;
    double comp_slack = result->complementary_slackness;
    // 输出或进一步处理指标值
}

Python接口(ipopt包)

使用ipopt.problem完成求解后,可直接通过求解器实例的属性获取这些指标:

  • 原始不可行性:problem.primal_infeasibility
  • 对偶不可行性:problem.dual_infeasibility
  • 互补不可行性:problem.compl_inf

示例代码片段:

import ipopt

# 定义自定义问题类(实现目标、约束等方法)
class MyProblem:
    def objective(self, x):
        return x[0]**2 + x[1]**2
    def gradient(self, x):
        return [2*x[0], 2*x[1]]
    def constraints(self, x):
        return [x[0] + x[1] - 1]
    def jacobian(self, x):
        return [1, 1]

# 初始化问题
n_vars = 2
n_constraints = 1
x0 = [0.5, 0.5]
lb = [0.0, 0.0]
ub = [1.0, 1.0]
cl = [0.0]
cu = [0.0]

problem = ipopt.problem(
    n=n_vars,
    m=n_constraints,
    problem_obj=MyProblem(),
    lb=lb,
    ub=ub,
    cl=cl,
    cu=cu
)

# 配置求解器并执行优化
problem.add_option('print_level', 1)
x, solve_info = problem.solve(x0)

# 获取不可行性指标
primal_inf = problem.primal_infeasibility
dual_inf = problem.dual_infeasibility
comp_slack = problem.compl_inf

额外说明

如果需要在优化迭代过程中实时监控这些指标,才需要使用回调函数(比如C++中TNLP的IntermediateCallBack方法),但优化完成后直接从结果对象/属性获取是最简便的方式。

内容的提问来源于stack exchange,提问作者Annaquest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:27:21