[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 ...
随机推荐
- ubuntu修改设备名称
按住ctrl+alt+t打开终端 输入 sudo gedit /etc/hostname 出现一个打开的文件,显示的就是你的设备名字,也就是终端@的那个名字.将其修改成你想显示的名字,保存重启系统就可 ...
- 关于Oracle数据库字符集
我们现在使用的字符集有以下两种: 推荐使用 AL32UTF8,避免以后数据导入导出字符集不同的麻烦. 推荐数据库设置参考图:
- spring IOC核心原理
下面来了解一下Spring到底是怎么运行的. public static void main(String[] args) { ApplicationContext context = new Fil ...
- HTTP权威协议笔记-7.集成点:网关、隧道及中继
.8.1 网关 定义:网关类似与翻译器,它抽象出了一种能够到达资源的方法. 实用:网关可以自动将HTTP流量转换为其他协议,这样使用HTTP协议的一方就不需要了解其他协议,也可实现与其他程序或设备交互 ...
- iOS图片加载到内存中占用内存情况
我的测试结果: 图片占用内存 图片尺寸 .png文件大小 1MB 512*512 316KB 4MB 10 ...
- Getting Started
https://developers.google.com/v8/get_started Getting Started This document introduces some key V8 co ...
- UVa 694 - The Collatz Sequence
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=94&page=s ...
- Java 名词
Plain Ordinary Java Object pojo 简单java对象 Constant 常量 Business Object BO 业务对象 Framework 框架
- MVC 基础和增删改、登录
一.什么是MVC?1.了解MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: Model(模型)表示应用程序核心 ...
- sql group by datetime on day
SELECT DATEADD(dd, DATEDIFF(dd, 0, postDate), 0)FROM tableWHERE (postDate > ...