#优化 #二次 #线性 #编程

osqp-rust

OSQP(算子分裂二次规划)求解器

1 个不稳定版本

0.6.2 2023年3月7日

#1876算法


用于 2 crate

Apache-2.0

1.5MB
33K SLoC

Rust 25K SLoC // 0.0% comments C 6K SLoC // 0.3% comments Python 699 SLoC // 0.2% comments Bitbake 318 SLoC // 0.8% comments Shell 242 SLoC // 0.2% comments Batch 126 SLoC // 0.2% comments

osqp.rs

Rust 对 OSQP 的包装:算子分裂QP求解器。

OSQP(算子分裂二次规划)求解器是一个数值优化包,用于解决以下形式的优化问题:

minimize        0.5 x' P x + q' x

subject to      l <= A x <= u

其中 x in R^n 是优化变量。

目标函数由正定矩阵 P in S^n_+ 和向量 q in R^n 定义。

线性约束由矩阵 A in R^{m x n} 和向量 l in R^m U {-inf}^mu in R^m U {+inf}^m 定义。

Rust 接口文档

求解器文档


lib.rs:

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

OSQP(算子分裂二次规划)求解器是一个数值优化包,用于解决以下形式的凸二次规划问题:

\[\begin{split}\begin{array}{ll} \mbox{minimize} & \frac{1}{2} x^T P x + q^T x \\ \mbox{subject to} & l \leq A x \leq u \end{array}\end{split}\]

其中 \(x\) 是优化变量,\(P \in \mathbf{S}^{n}_{+}\) 是一个正定矩阵。

关于求解器的更多信息可在 osqp.org 找到。

示例

考虑以下QP

\[\begin{split}\begin{array}{ll} \mbox{minimize} & \frac{1}{2} x^T \begin{bmatrix}4 & 1\\ 1 & 2 \end{bmatrix} x + \begin{bmatrix}1 \\ 1\end{bmatrix}^T x \\ \mbox{subject to} & \begin{bmatrix}1 \\ 0 \\ 0\end{bmatrix} \leq \begin{bmatrix} 1 & 1\\ 1 & 0\\ 0 & 1\end{bmatrix} x \leq \begin{bmatrix}1 \\ 0.7 \\ 0.7\end{bmatrix} \end{array}\end{split}\]
use osqp_rust::{CscMatrix, Problem, Settings};

// Define problem data
let P = &[[4.0, 1.0],
          [1.0, 2.0]];
let q = &[1.0, 1.0];
let A = &[[1.0, 1.0],
          [1.0, 0.0],
          [0.0, 1.0]];
let l = &[1.0, 0.0, 0.0];
let u = &[1.0, 0.7, 0.7];

// Extract the upper triangular elements of `P`
let P = CscMatrix::from(P).into_upper_tri();

// Disable verbose output
let settings = Settings::default()
    .verbose(false);

// Create an OSQP problem
let mut prob = Problem::new(P, q, A, l, u, &settings).expect("failed to setup problem");

// Solve problem
let result = prob.solve();

// Print the solution
println!("{:?}", result.x().expect("failed to solve problem"));
#

依赖项