导航菜单
首页 >  533 C++ 的QP建模和优化  > 5.7.3. C++ 的SDP建模与优化

5.7.3. C++ 的SDP建模与优化

5.7.3. C++ 的SDP建模与优化¶

在本节中,我们将使用 MindOpt 的 C++ API 来建模以及求解 半定规划问题示例 中的问题。

5.7.3.1. SDP示例1¶

首先,需要引入头文件:

25#include "MindoptCpp.h"

第一步:创建优化模型:

先建立一空的MindOpt模型。

46MDOEnv env = MDOEnv();47MDOModel m = MDOModel(env);

第二步:SDP模型输入

我们利用 MDOModel::addPsdVar() 创建一个新的半正定矩阵变量,并同时设定其对应的目标函数中的矩阵系数。其中,第一个参数为 矩阵系数,这里它是通过 MDOMatrix::coo() 方法创建的一个 MDOMatrix 类的实例。注意到该系数矩阵的维度应与矩阵变量相同。第二个参数为该变量的名称。

54/* Add variables. */55MDOPsdVar psd_var = m.addPsdVar(MDOMatrix::coo(dim_mat, dim_mat, C_nnz, C_nz_indices, C_nz_values), "X0");

接着,我们输入第一个约束。我们利用 MDOModel::addPsdConstr() 建立一个带半正定矩阵变量的约束。其中,第一个参数分别为该约束中的 半正定表达式,即 \(\langle \mathbf{A},\mathbf{X} \rangle\)。我们通过 MDOPsdExpr 类的初始化方法 MDOPsdExpr::MDOPsdExpr() 创建。第二个系数为该约束的属性,MDO_EQUAL (‘=’) 代表等式约束。第三个参数为该约束的右侧值 (此处为1.0)。最后一个参数为该约束的名称。

57/* Add constraints. */58m.addPsdConstr(MDOPsdExpr(psd_var, MDOMatrix::coo(dim_mat, dim_mat, A_nnz, A_nz_indices, A_nz_values)), MDO_EQUAL, 1.0, "C0");

最后,我们利用 MDOModel::setObjective() 设定优化函数中的其余部分 (此处为0),并将优化方向改为maximization (-1)。

60/* Set objective function. */61MDOLinExpr objective = 0;62m.setObjective(objective, MDO.MAXIMIZE);

第三步:求解SDP模型

模型输入后,我们接着用 MDOModel::optimize() 来求解问题。

67// Optimize the model68m.optimize();

第四步: 取得SDP模型的解

我们利用泛用函数 MDOModel::get() 来取得最优的的目标函数值,即 PrimalObjVal 属性。

69if (m.get(MDO_IntAttr_Status) == MDO_OPTIMAL)70{71cout

相关推荐: