IPOPT工具解决非线性规划最优化问题使用案例

IPOPT工具解决非线性规划最优化问题使用案例

By Andrew( [email protected] )

2013-08-07

简介

ipopt是一个解决非线性规划最优化问题的工具集,当然,它也可以用于解决线性规划问题的求解。它提供了c/c++接口,非常易于使用。

问题

解决类似下面的非线性问题:

Ipopt工具采用内点法求解非线性优化问题。

求解前的准备

需要计算

1. 梯度

计算目标函数的梯度,和约束条件Jacobian矩阵

2. Hessian矩阵

delta and lambda are parameters for object function and constraints functions (lambda is multiplier of  Lagrangian)

示例

求解下面的最优化问题:

第一步:

求解目标函数的梯度:

第二步:

求解约束条件的Jacobian矩阵:

第三步:

求解目标函数和约束条件的Hessian矩阵,即求解

得到

至此,准备工作已经就绪,接下来调用Ipopt 的API接口进行计算。

1.get_nlp_info设置下面的参数

a)         n=4;//变量x个数

b)        m=2;//约束条件个数

c)         nnz_jac_g=8;//Jacobian非零个数

d)        Nnz_h_lag=10;//Hessian非零个数

2.get_bounds_info 设置下面的参数

a)         x_l[i]设置xi的下界值

b)        x_u[i]设置xi的上界值

c)         g_l[i]设置约束i的下界值

d)        g_u[i]设置约束i的上界值

3.get_start_point设置下面参数

a)         x[i]设置第i个变量的初始迭代值

4.eval_f设置下面参数

a)         object_value设置目标函数计算方式(本例:object_value=x0*x3*(x0+x1+x2) + x2)

5.eval_grad_f设置目标函数的梯度

a)         grad_f[i]设置目标函数对第i个变量的偏导,本例如下:

6.eval_g设置约束条件

a)         G[i]约束条件i,本例如下:

7.eval_jac_g设置Jacobian矩阵

a)         iRow和jCol设置非零行列的坐标

b)        Values设置矩阵迭代值,如果values==NULL,即尚未初始化时,需要设置Jacobian矩阵哪些下标位置非零,如下图:

        

Value==NULL(左);value != NULL(右)

8.eval_h设置Hessian矩阵

a)         iRow和jCol设置非零行列的坐标

b)        obj_factor为目标函数系数

c)         lambda[i]为第i个约束的拉格朗日乘子

d)        values设置矩阵的迭代求值,本例只有目标函数和两个约束条件,因此如所示。

i.          目标函数

ii.        约束1

iii.      约束2

9.finalize_solution求解

a)         status为返回的求解状态

b)        obj_value:最优值

c)         x:最优解变量取值

d)        z_l 拉格朗日乘子下界

e)         z_u 拉格朗日乘子上届

f)         lambda 最优解拉格朗日乘子取值

C++ API

Svn地址:https://projects.coin-or.org/svn/Ipopt/stable/3.11

示例程序位于源代码:Ipopt/test路径下。

自定义类继承于TNLP (public TNLP),使用命名空间:Ipopt (using namespace Ipopt)

程序实现以下虚函数即可。

/**@name Overloaded from TNLP */

//@{

/** Method to return some info about the nlp */

virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,

Index& nnz_h_lag, IndexStyleEnum& index_style);

/** Method to return the bounds for my problem */

virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u,

Index m, Number* g_l, Number* g_u);

/** Method to return the starting point for the algorithm */

virtual bool get_starting_point(Index n, bool init_x, Number* x,

bool init_z, Number* z_L, Number* z_U,

Index m, bool init_lambda,

Number* lambda);

/** Method to return the objective value */

virtual bool eval_f(Index n, const Number* x, bool new_x, Number& obj_value);

/** Method to return the gradient of the objective */

virtual bool eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f);

/** Method to return the constraint residuals */

virtual bool eval_g(Index n, const Number* x, bool new_x, Index m, Number* g);

/** Method to return:

*   1) The structure of the jacobian (if "values" is NULL)

*   2) The values of the jacobian (if "values" is not NULL)

*/

virtual bool eval_jac_g(Index n, const Number* x, bool new_x,

Index m, Index nele_jac, Index* iRow, Index *jCol,

Number* values);

/** Method to return:

*   1) The structure of the hessian of the lagrangian (if "values" is NULL)

*   2) The values of the hessian of the lagrangian (if "values" is not NULL)

*/

virtual bool eval_h(Index n, const Number* x, bool new_x,

Number obj_factor, Index m, const Number* lambda,

bool new_lambda, Index nele_hess, Index* iRow,

Index* jCol, Number* values);

//@}

/** @name Solution Methods */

//@{

/** This method is called when the algorithm is complete so the TNLP can store/write the solution */

virtual void finalize_solution(SolverReturn status,

Index n, const Number* x, const Number* z_L, const Number* z_U,

Index m, const Number* g, const Number* lambda,

Number obj_value,

const IpoptData* ip_data,

IpoptCalculatedQuantities* ip_cq);

//@}

IPOPT工具解决非线性规划最优化问题使用案例

时间: 2024-10-25 07:08:51

IPOPT工具解决非线性规划最优化问题使用案例的相关文章

OAF_OAF Debug And Log调试和记录工具的详解(案例)

2014-06-16 BaoXinjian 一.摘要 在需求后期,对实现该需求的代码进行调试时一个不可忽略的步骤,可以确保代码在上线后尽可能避免出现bug和异常 在OAF开发中一般相关的部分主要有 1. 使用OAF Bug工具调试代码 设定Breakpoint断电 查看Exception Stack Trace 设定Exception Breakpoint断点 进行Debug,查看Call Stack和Data在断点上 2. 使用OAF Diagnostic工具产生log 确认调试项目启动了Di

PLSQL_性能优化效能跟踪工具SQL Trace分析(案例)

2014-06-25 BaoXinjian 一.摘要 SQL TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL TRACE是非常常用的方法.一般,一次跟踪可以分为以下几步:1.界定需要跟踪的目标范围,并使用适当的命令启用所需跟踪.2.经过一段时间后,停止跟踪.此时应该产生了一个跟踪结果文件.3.找到跟踪文件,并对其进行格式化,然后阅读或分析. 另文已介绍了其他的跟踪工具DBMS_PROFILER, Form Trace, Re

他们在工具的选择上投入了过多的时间精力,却忽略了应该用工具解决的问题

大坑3:对早期产品技术选型过分纠结 今年5月14.15两天,我作为PHP创始人Rasmus的随身翻译,去北京国际会议中心参加了第2届PHP全球开发者大会.虽然我对自己的英语比较有信心,但当得知Rasmus原籍是欧洲之后,也担心这哥们的口音太重,我听不懂,所以提前在网上搜了一些他的资料,看看听听,稍作了解. 在会议的宣传文案2里,我看到Rasmus的介绍是这么写的: 编程语言PHP的创始人,编写了PHP的头两个版本,并参与PHP后续版本的开发.2002年9月至2009年11月6日间,在Yahoo!

cocos2d-x封装一个转码的工具解决中文乱码可以直接拖过去用通用跨平台

今天白白给大家分享一个转码的工具函数,如果大家需要在项目中显示中文,可以直接使用,Android和IOS部分都是通用的,不用太麻烦的分平台操作. 转载请注明地址http://blog.csdn.net/u010229677 首先,这个函数是这样的,可以直接拖进去用 <span style="font-size:18px;"><span style="font-size:18px;">#ifndef __TRANSFORMUTF__ #defi

SQL邮件服务(解决各种疑难杂症)+案例

首先你需要知道你要做的几部: 1 每个数据库都有自己的 SERVICE BROKER 很多SQL SERVER内部服务依赖它 2 启动 SERVICE BROKER 需要 1 STOP 你的 SQL SERVER AGENT (就是说SQL server 代理)  2 alter database helpdesk2 set enable_broker  ( 在脚本中运行这个脚本) 有的时候启动不了你的SERVICE BROKER原因就在于你没有关闭你的SQL SERVER AGENT 另外如果

iOS/OS X 借助工具解决内存问题

InstrumentsARC内存管理悬挂指针 上 一篇博客iOS/OS X内存管理(一):基本概念与原理主要讲了iOS/OSX 内存管理中引用计数和内存管理规则,以及引入ARC新的内存管理机制之后如何选择ownership qualifiers(__strong.__weak.__unsafe_unretained和__autoreleasing)来管理内存.这篇我 们主要关注在实际开发中会遇到哪些内存管理问题,以及如何使用工具来调试和解决. 在往下看之前请下载实例MemoryProblems,

配置静态监听解决ORA-12514错误的案例

今天做Linux下DG配置的时候,遇到一个现象,tnsname.ora文件配置都正常,tnsping也正常,监听也正常,但是仍然报ORA-12514错误: SQL> set lin 130 pages 130 SQL> select dest_id,error from v$archive_dest; DEST_ID ERROR ---------- ----------------------------------------------------------------- 1 2 OR

NiceTool工具解决微信中下载APP

微信是目前超高活跃度的app稳稳第一名,是目前最具营销价值的营销渠道之一. 很多朋友应该都遇到过这样的问题,微信中是无论是扫描二维码下载还是下载页链接下载apk(APP),都是无法下载的,我们要怎么解决这个问题呢?NiceTool工具可以非常简单就可以实现.使用教程: 1.在NiceTool官网:输入需要在微信中打开的网址链接. 2.点击“一键生成” 按钮,生成转换后的链接和二维码. 3.复制生成后的链接或者扫一扫二维码即可打开链接,微信后会自动启动手机浏览器,打开指定的页面,无需任何手工操作.

用NiceTool工具解决微信内链接或二维码可直接用外部浏览器打开

很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们实现微信跳转功能即可. 下面给大家推荐NiceTool工具(http://www.nicejump.cn/) 使用步骤 1. 用浏览器打开我们的工具地址 2. 将你的推广链接输入工具框,点击生成 3. 复制新生成的跳转链接和二维码 4. 微信内打开跳转链接或扫码识别二维码 功能效果功能实现后, 苹果用户即可在微信内直接下载app也可以跳转浏览器下载,安卓用户则自动打开手机浏览器下载app