优化后如何获取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
相关产品推荐
相关产品推荐

