美文网首页
不等式约束的二次型最优化问题VS2015+qpOASES+Cpp

不等式约束的二次型最优化问题VS2015+qpOASES+Cpp

作者: 一念之动即是行 | 来源:发表于2018-10-02 14:07 被阅读364次

2018/11/1更新:

  • qpOASES采用的是可行集策略
  • 要求H为正定(半正定)矩阵
  • 规模较大时耗时较长

动机


做毕设的时候需要求一个这样的二次型最优化问题:
\begin{aligned} f(x)=\frac{1}{2} x^THx + g^Tx, \qquad 0\le x \le 2 \end{aligned}

查过资料后得知可以运用罚函数内点法来解决,但是自己写的代码一直效果不是很理想,于是上网搜了一下二次型最优化的C++库,找了很久终于找到了一个专门处理二次型问题的库,qpOASES,特此记录。

下载


开源项目主页:https://projects.coin-or.org/qpOASES/wiki
点击Download进入下载界面,选择对应项目下载即可,
这里我我下载的是qpOASES-3.2.1.zip。

Download

编译


工具:CMake + VS2015

首先将qpOASES-3.2.1.zip解压缩,然后用CMake进行编译:
Where is the source code选择项目根目录,即\qpOASES-3.2.1\qpOASES-3.2.1,在这个目录下有CMakeLists.txt文件。
Where to build the binaries随便指定一个路径,如.\qp,用来存放编译后的文件。
然后点击两次Configure,一次Generate,生成包含如下文件的文件夹:

qb文件夹

在VS2015中打开ALL_BUILD.vcxproj,右键ALL_BUILD->生成,生成成功后退出,发现\qp\libs\Debug\路径下生成了qpOASES.lib,这就是我们需要的库文件(这里要注意平台,如果生成的是x64下的lib,使用的时候就要选择x64平台。

qpOASES.lib和头文件拷贝到需要的位置,在VS2015中修改库路径和头文件路径,则完成配置。

测试


官方测试代码:

#include "include\qpOASES.hpp"

int main()
{
    USING_NAMESPACE_QPOASES
    /* Setup data of first QP. */
    real_t H[2 * 2] = { 1.0, 0.0, 0.0, 0.5 };
    real_t A[1 * 2] = { 1.0, 1.0 };
    real_t g[2] = { 1.5, 1.0 };
    real_t lb[2] = { 0.5, -2.0 };
    real_t ub[2] = { 5.0, 2.0 };
    real_t lbA[1] = { -1.0 };
    real_t ubA[1] = { 2.0 };
    /* Setup data of second QP. */
    real_t g_new[2] = { 1.0, 1.5 };
    real_t lb_new[2] = { 0.0, -1.0 };
    real_t ub_new[2] = { 5.0, -0.5 };
    real_t lbA_new[1] = { -2.0 };
    real_t ubA_new[1] = { 1.0 };
    /* Setting up QProblem object. */
    QProblem example(2, 1);
    /* Solve first QP. */
    int_t nWSR = 10;
    example.init(H, g, A, lb, ub, lbA, ubA, nWSR);
    /* Solve second QP. */
    nWSR = 10;
    example.hotstart(g_new, lb_new, ub_new, lbA_new, ubA_new, nWSR);
    /* Get and print solution of second QP. */
    real_t xOpt[2];
    example.getPrimalSolution(xOpt);
    printf("\n xOpt = [ %e, %e ]; objVal = %e\n\n",
        xOpt[0], xOpt[1], example.getObjVal());
    return 0;
}

运行结果:


运行结果

注意事项


  • real_t的定义为typedef double;
  • H是对称的正定(半正定)矩阵;
  • 使用时注意平台,x86和x86对应,x64和x64对应,否则会报error LNK2019: 无法解析的外部符号错误.

相关文章

  • SVM-part1-KKT条件

    从三类优化问题开始: 1 无约束优化。 2 带等式约束带优化。 3 不等式约束优化。 而SVM的优化问题,即不等式...

  • 不等式约束的二次型最优化问题VS2015+qpOASES+Cpp

    2018/11/1更新: qpOASES采用的是可行集策略 要求H为正定(半正定)矩阵 规模较大时耗时较长 动机 ...

  • list

    项目+知识点项目:3个左右 1.凸优化(1)等式约束条件最优化问题、带不等式约束条件的最优化问题(2)2.机器学习...

  • SVM

    目录 - 带约束的优化问题(等式与不等式约束) - 拉格朗日乘子 - KKT条件与对偶 - 线性不可分与松弛变量 ...

  • CppAD和Ipopt的非线性规划

    使用CppAD和Ipopt的非线性规划:示例和测试 最优化问题,等式约束/不等式约束 代码: 设置参数、初始状态、...

  • SVM系列第七讲--KKT条件

    上一讲我们介绍了最优化问题的两种形式,无约束的和等式约束条件下的,这一讲,我们主要介绍不等式约束条件下的最优化问题...

  • 目标优化注记

    目标优化主要考虑以下几点: 参数空间 等式(刚性)约束 不等式约束 优化目标 基本处理原则有: 参数空间中的等式约...

  • 算法基本功:SVM part3 对偶问题 2019-03-03

    给定一般不等式约束优化问题,f 不一定是凸函数。 subject to 其对应拉格朗日函数: L...

  • SVM中的拉格朗日算子

    SVM是一个凸线性空间上寻找最优解的问题(凸二次规划问题)。由于,SVM中约束条件为一系列的不等式,其二次规划求解...

  • 最优化问题04|不等式约束

    一、非负约束 考虑对选择变量有非负约束问题,但是没有其他约束。考虑单变量情况,有: 这样将会有三种情况: f'(x...

网友评论

      本文标题:不等式约束的二次型最优化问题VS2015+qpOASES+Cpp

      本文链接:https://www.haomeiwen.com/subject/wctaoftx.html