MOSEK 学习笔记(2)

Chapter 4 Installation

在这部分我们讨论如何安装 M O S E K \bf MOSEK MOSEK优化器

两个重要步骤

  • 正确安装
  • 获取licence

重要文件位置

搭建工程

CMakeLists.txt

//库文件位置
file(GLOB MOSEK_LIBRARIES_DIR LIBDIR)
//头文件位置
set(MOSEK_INCLUDE_DIR HEADERDIR)
link_directories(${MOSEK_LIBRARIES_DIR})
//链接库
target_link_libraries(result mosek64)

其中:

  • HEADERDIR是头文件的位置
  • LIBDIR是库文件位置

Licence

Licence文件从官网获取,具体参考
https://docs.mosek.com/10.0/licensing/index.html

Chapter 5 Design Overview

5.1 Modeling

优化器C语言API 是一个直接以矩阵形式定义优化问题的接口。它意味着一个形如:
minimize  c T x subject to  A x ≤ b , x ∈ k \begin{aligned} \text{minimize } & c^Tx\\ \text{subject to } & Ax \leq b,\\ & x \in \cal k \end{aligned} minimize subject to cTxAxbxk
的优化问题,被一个矩阵A,向量b和一个锥表 K \cal K K描述。

这个接口的主要特性为

  • 简洁:一旦这个问题数据被组织为一个矩阵形式,输入到优化器里就简单了
  • 利用稀疏性:数据是以稀疏格式输入的,从而可以将巨大的稀疏问题有效地定义和解决。
  • 效率:这个优化器API在用户表示问题和MOSEK
    内部表示问题之间几乎没有任何开销

优化器C语言API对建模没有帮助,表示问题为MOSEK的标准形式是用户的职责如果有必要,引入辅助的变量和约束。MOSEK解决问题的精确公式请参考第12章

“Hellow World” in MOSEK

这里我们提供一个使用优化器C语言API最基础的工作流程

创建一个环境(environment)和任务(task)

可选择地,一个使用C语言API和MOSEK的交互可以以创建一个 M O S E K e n v i r o n m e n t \bf MOSEK \quad environment MOSEKenvironment 开始,它负责协调从当前进程到 M O S E K \bf MOSEK MOSEK的访问。

在大多数情况下使用者不会直接与environment交互,除了创建优化任务,它包含了实际问题的规范和优化发生的位置。在这种情况下,使用者可以直接创建一个任务而不用调用环境,正如我们现在做的。

定义任务

一个任务被创建以后,输入的数据可以被确定,一个优化问题包含许多组成部分

  • objective 优化对象
  • objective sense 目标方向(最小化还是最大化)
  • constraints 约束
  • variable bounds 变量边界

如何定义并解决不同种类的优化问题请参考第六章

求解

当模型被建立,优化器通过MSK_optimize被调用,优化结束,使用者可以检查结果并检索数值,具体细节请参考第七章,了解更多有关优化器的更高级机制请参考第七节。

原码示例

下面是一个最基本的代码示例,定义并求解一个平凡的优化问题
minimize x subject to 2.0 ≤ x ≤ 3.0. \begin{aligned} \text{minimize} \quad & x \text{subject to} \quad & 2.0 \leq x \leq 3.0. \end{aligned} minimizexsubject to2.0x3.0.
因为优化问题很简单,这个示例不包含error或状态的检测

#include "mosek.h"
#include <stdio.h>

/* Error checking not included */
int main() {
  MSKrescodee      r, trmcode;
  MSKenv_t         env  = NULL;
  MSKtask_t        task = NULL;
  double           xx = 0.0;

  MSK_maketask(NULL, 0, 1, &task);      // 创建一个task

  MSK_appendvars(task, 1);                             // 1 variable x
  MSK_putcj(task, 0, 1.0);                             // c_0 = 1.0
  MSK_putvarbound(task, 0, MSK_BK_RA, 2.0, 3.0);       // 2.0 <= x <= 3.0
  MSK_putobjsense(task, MSK_OBJECTIVE_SENSE_MINIMIZE); // 最小化

  MSK_optimizetrm(task, &trmcode);         // 优化

  MSK_getxx(task, MSK_SOL_ITR, &xx);       // Get solution
  printf("Solution x = %f\n", xx);         // Print solution

  MSK_deletetask(&task); // Clean up task
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值