在本节中,我们将使用 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