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

2018-10-02  本文已影响364人  一念之动即是行

2018/11/1更新:

动机


做毕设的时候需要求一个这样的二次型最优化问题:
\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;
}

运行结果:


运行结果

注意事项


上一篇 下一篇

猜你喜欢

热点阅读