[MOSEK] Stupid things when using mosek
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.
[MOSEK] Stupid things when using mosek的更多相关文章
- [MOSEK] Mosek求解中遇到的奇葩内存问题
在使用mosek优化库的时候,使用http://docs.mosek.com/7.0/capi/MSK_getxx_.html的 MSKrescodee MSK_getxx ( MSKtask_t t ...
- yalmip + lpsolve + matlab 求解混合整数线性规划问题(MIP/MILP)
最近建立了一个网络流模型,是一个混合整数线性规划问题(模型中既有连续变量,又有整型变量).当要求解此模型的时候,发现matlab优化工具箱竟没有自带的可以求解这类问题的算法(只有bintprog求解器 ...
- Shogun网站上的关于主流机器学习工具包的比较
Shogun网站上的关于主流机器学习工具包的比较: http://www.shogun-toolbox.org/page/features/ created last updated main l ...
- SCIP | 数学规划求解器SCIP超详细的使用教程
前言 小伙伴们大家好呀!继上次lp_solve规划求解器的推文出来以后,大家都期待着更多求解器的具体介绍和用法.小编哪敢偷懒,这不,赶在考试周之际,又在忙里偷闲中给大家送上一篇SCIP规划求解的推文教 ...
- CVX安装使用
CVX下载 下载地址 使用手册 Using Gurobi with CVX Using MOSEK with CVX CVX安装 下载压缩文件后解压缩至任意地址,打开matlab,进入解压缩后的地址, ...
- 万字教你如何用 Python 实现线性规划
摘要:线性规划是一组数学和计算工具,可让您找到该系统的特定解,该解对应于某些其他线性函数的最大值或最小值. 本文分享自华为云社区<实践线性规划:使用 Python 进行优化>,作者: Yu ...
随机推荐
- 利用IDL将一个txt文档拆分为多个
测试.txt文档,每47行的格式相同,通过代码每47行存为一个txt,txt文档命名为其第一行数据. 代码如下: file='G:\data\测试.txt' openr,lun,file,/Get_L ...
- 学习一下mef
微软 http://msdn.microsoft.com/zh-cn/magazine/ee291628.aspx mef http://biancheng.dnbcw.info/net/370552 ...
- Ninject之旅之七:Ninject依赖注入
摘要 可以使用不同的模式向消费者类注入依赖项,向构造器里注入依赖项是其中一种.有一些遵循的模式用来注册依赖项,同时有一些需要避免的模式,因为他们经常导致不合乎需要的结果.这篇文章讲述那些跟Ninjec ...
- web.xml常用元素配置
tomcat服务器: tomcat是一个WEB服务器,所有的j2ee WEB程序可以在此处运行. tomcat服务器是一个符合j2ee标准的WEB服务器.则J2ee的EJB程序无法在此处运行. 如果要 ...
- html5 定位 获得当前位置的经纬度
if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition, showError, { // ...
- 使用spring手动获取Bean的时候,不能强转回它自己。
这个问题好像有点长,描述一下: 就是通过类名的方式获取Bean后,得到一个Object对象,但是这个Object不能再强转回Bean了.抛出的异常时类型转换异常. java.lang.ClassCa ...
- 【转载】 C++多继承中重写不同基类中相同原型的虚函数
本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...
- C++:名字查找先于类型检查
Sub-Title: Name Hiding. "In C++, there is no overloading across scopes - derived class scopes a ...
- pascal闪电入门系列目录
第一章 准备工作 第二章 Hello,world! 第三章 输出.输入 第四章 变量常量.基本数据类型 第五章 格式.注释 第六章 运算符.表达式.优先级 第七章 分支结构 第八章 数 ...
- 用sass写栅格系统
为了验证学习sass的效果,自己写了个简单的栅格系统.