博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[MOSEK] Stupid things when using mosek
阅读量:5727 次
发布时间:2019-06-18

本文共 3563 字,大约阅读时间需要 11 分钟。

1.2016-8-14

我希望把一个qp问题的代码从conic constraints改为无外加约束,仅适用variable bounds的线性不等式约束

于是原来的约束代码为

if (r == MSK_RES_OK)

{
    if (_debug) { MYOUT << "Q: " << std::endl; }
    for (int i = 0; i < numvar/6; i++)
    {
        // the structure have (numvar/6) nodes
        MSKint32t qsubi[] = { 6 * i, 6 * i + 1, 6 * i + 2 };
        MSKint32t qsubj[] = { 6 * i, 6 * i + 1, 6 * i + 2 };
        double      qval[] = { 2 * x_w[i], 2 * x_w[i], 2 * x_w[i]};
        //double      qval[] = { 2, 2, 2};

        // Replaces all the quadratic entries in one constraint k

        // In our program, this specifies the deformation constrains:
        // d_{i}_t.norm < tol
        r = MSK_putqconk(task, i, 3, qsubi, qsubj, qval);
    }
}

 

for (j = 0; j<numvar && r == MSK_RES_OK; ++j)

{
    /* Set the bounds on variable j.
    blx[j] <= x_j <= bux[j] */
    if (r == MSK_RES_OK)
    {

        r = MSK_putvarbound(task,

            j,           /* Index of variable.*/
            MSK_BK_FR,      /* Bound key.*/
            -MYINF,      /* Numerical value of lower bound.*/
            MYINF);     /* Numerical value of upper bound.*/
    }
}

 

/* Set the bounds on constraints.

for i=1, ...,NUMCON : blc[i] <= constraint i <= buc[i] */
for (i = 0; i<numcon && r == MSK_RES_OK; ++i)
{
        r = MSK_putconbound(task,
            i,                            /* Index of constraint.*/
            MSK_BK_UP,    /* Bound key.*/
            -MYINF,            /* Numerical value of lower bound.*/
            pow(d_tol,2));            /* Numerical value of upper bound.*/
}

请注意上面的

        r = MSK_putvarbound(task,

            j,           /* Index of variable.*/
            MSK_BK_FR,      /* Bound key.*/
            -MYINF,      /* Numerical value of lower bound.*/
            MYINF);     /* Numerical value of upper bound.*/

虽然看起来无用,因为他是声明变量是free的,即无界变量,不要小看他哦!

 

okay我开始改代码,把上面的conic的约束换成简单的变量不等式约束:

/* variable bounds */

for (j = 0; j < numvar/6 && r == MSK_RES_OK; ++j)
{
    r = MSK_putvarbound(task,
        j * 6,           /* Index of variable.*/
        MSK_BK_RA,      /* Bound key.*/
        -temp_bound,      /* Numerical value of lower bound.*/
        temp_bound);     /* Numerical value of upper bound.*/

    r = MSK_putvarbound(task,

        j * 6 + 1,           /* Index of variable.*/
        MSK_BK_RA,      /* Bound key.*/
        -temp_bound,      /* Numerical value of lower bound.*/
        temp_bound);     /* Numerical value of upper bound.*/
   
    r = MSK_putvarbound(task,
        j * 6 + 2,           /* Index of variable.*/
        MSK_BK_RA,      /* Bound key.*/
        -temp_bound,      /* Numerical value of lower bound.*/
        temp_bound);     /* Numerical value of upper bound.*/

}

看起来很对对不?

 

但是程序崩了。

原因在于我们需要对每个变量都设置范围,

否则

/* Append 'NUMVAR' variables.

The variables will initially be b_fixed at zero (x=0). */
if (r == MSK_RES_OK)
    r = MSK_appendvars(task, numvar);

所以,正确的代码应该为:

/* variable bounds */

for (j = 0; j < numvar/6 && r == MSK_RES_OK; ++j)
{
    r = MSK_putvarbound(task,
        j * 6,           /* Index of variable.*/
        MSK_BK_RA,      /* Bound key.*/
        -temp_bound,      /* Numerical value of lower bound.*/
        temp_bound);     /* Numerical value of upper bound.*/

    r = MSK_putvarbound(task,

        j * 6 + 1,           /* Index of variable.*/
        MSK_BK_RA,      /* Bound key.*/
        -temp_bound,      /* Numerical value of lower bound.*/
        temp_bound);     /* Numerical value of upper bound.*/
   
    r = MSK_putvarbound(task,
        j * 6 + 2,           /* Index of variable.*/
        MSK_BK_RA,      /* Bound key.*/
        -temp_bound,      /* Numerical value of lower bound.*/
        temp_bound);     /* Numerical value of upper bound.*/

    r = MSK_putvarbound(task,

        j * 6 + 3,           /* Index of variable.*/
        MSK_BK_FR,      /* Bound key.*/
        -MYINF,      /* Numerical value of lower bound.*/
        MYINF);     /* Numerical value of upper bound.*/

    r = MSK_putvarbound(task,

        j * 6 + 4,           /* Index of variable.*/
        MSK_BK_FR,      /* Bound key.*/
        -MYINF,      /* Numerical value of lower bound.*/
        MYINF);     /* Numerical value of upper bound.*/

    r = MSK_putvarbound(task,

        j * 6 + 5,           /* Index of variable.*/
        MSK_BK_FR,      /* Bound key.*/
        -MYINF,      /* Numerical value of lower bound.*/
        MYINF);     /* Numerical value of upper bound.*/
}

 

#The end of 1.

转载于:https://www.cnblogs.com/duckie/p/5771425.html

你可能感兴趣的文章
Django如何使用Jinja2作为模板引擎
查看>>
LayoutInflater源码解析
查看>>
Feign Stub挡板和Mock
查看>>
iOS开发中的小Tips(一)
查看>>
如何优化程序性能
查看>>
【云吞铺子之专家来了】CDN的HTTPS相关问题及处理思路
查看>>
充电宝是如何盗取你的个人隐私的?
查看>>
《Ext JS模板与组件基本框架图----组件》
查看>>
英特尔收购人工智能创业公司Nervana
查看>>
新华三H3C服务器安装系统问题
查看>>
Java8-Collect收集Stream
查看>>
消除windows下的PyCharm中满屏的波浪线
查看>>
大数据学习资源最全版本(收藏)
查看>>
“水泊梁山“互联网有限公司一百单八将内部社交网络
查看>>
关于AI,程序员需要了解这些!
查看>>
spring+springmvc+mybatis构建系统
查看>>
Java并发编程笔记之ReentrantLock源码分析
查看>>
node_acl 权限管理路径通配
查看>>
Android重写onConfigurationChanged规避横竖屏切换时候重新进入onCreate生命周期
查看>>
图文分析ByteBuf是什么
查看>>