新mosek学习笔记3.1:优化过程 (线性优化)

本文主要介绍了线性优化问题的一般形式,并通过实例详细解析了使用mosek进行线性优化的处理流程,包括创建环境、创建优化任务、载入问题、设置变量边界、定义线性约束矩阵以及优化和获取结果的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里就不扯咸蛋了,主要介绍两个优化问题,一个线性优化,一个就是让我蛋疼的二次优化。

Linear Optimization

一般形式:

通过实例来看:

处理流程:

1. 创建环境; 2. 创建一个优化任务; 3. 载入一个问题进入任务对象; 4. 优化; 5. 获取求解结果

按照处理流程我们来分析代码:

1. 创建环境

 r = MSK_makeenv(&env, NULL);

2. 创建优化任务

/* Create the optimization task. */
r = MSK_maketask(env, numcon, numvar, &task);
/* Directs the log task stream to the 'printstr' function. */
if (r == MSK_RES_OK)
r = MSK_linkfunctotaskstream(task, MSK_STREAM_LOG, NULL, printstr);

3. 载入一个优化问题进入任务对象

变量与限制条件必须被加入到优化问题。

 /* Append 'numcon' empty constraints. The constraints will initially have no bounds. */
 if (r == MSK_RES_OK)
 r = MSK_appendcons(task, numcon);
 /* Append 'numvar' variables. The variables will initially be fixed at zero (x=0). */
 if (r == MSK_RES_OK)
 r = MSK_appendvars(task, numvar);

这样,新的变量能够引入通过索引:index 0,...,numvar - 1

新的约束能够被引入通过索引:index 0,...,numcon - 1

通过索引,循环的输入数据,来设置问题数据。我们首先设置对象参数cj = c[j]

 /* Set the linear term c_j in the objective.*/
      if (r == MSK_RES_OK)
        r = MSK_putcj(task, j, c[j]);

4. 设置变量边界

const MSKboundkeye bkx[]  = {MSK_BK_LO,     MSK_BK_RA, MSK_BK_LO,     MSK_BK_LO     };
const double       blx[]  = {0.0,           0.0,       0.0,           0.0           };
const double       bux[]  = { +MSK_INFINITY, 10.0,      +MSK_INFINITY, +MSK_INFINITY };
/* 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.*/
                            bkx[j],      /* Bound key.*/
                            blx[j],      /* Numerical value of lower bound.*/
                            bux[j]);     /* Numerical value of upper bound.*/

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值