0

我正在按照 Mosek 文档检索求解器的信息。特别是我想通过以下方式获得约束的数量:

Model::t M = new Model("cqo1");

Variable::t x  = M->variable("x", 3, Domain::greaterThan(0.0));
Variable::t y  = M->variable("y", 3, Domain::unbounded());

Variable::t z1 = Var::vstack(y->index(0),  x->slice(0, 2));
Variable::t z2 = Var::vstack(y->slice(1, 3), x->index(2));

auto aval = new_array_ptr<double, 1>({1.0, 1.0, 2.0});
M->constraint("lc", Expr::dot(aval, x), Domain::equalsTo(1.0));

Constraint::t qc1 = M->constraint("qc1", z1, Domain::inQCone());
Constraint::t qc2 = M->constraint("qc2", z2, Domain::inRotatedQCone());

M->objective("obj", ObjectiveSense::Minimize, Expr::sum(y));
int anaProNumCon = M->getSolverIntInfo("anaProNumCon");

但是它返回 anaProNumCon=0(应该是 3)。通话中可能有什么问题?

最好的

4

1 回答 1

1

M->solve() 仅在您调用https://docs.mosek.com/latest/cxxfusion/solver-infitems.html后才设置信息项,而问题分析器中的信息项可能直到您调用问题分析器后才设置,该问题可在仅优化器 API 而不是 Fusion。

此外,由于您的圆锥约束是多维的,因此此时返回的实际约束数量不是 3,而是类似于 1 (lc) + 3 (qc1 slacks) + 3 (qc2 slacks) = 7 if I我没有弄错。

我想说的是,这不是找出问题的有意义的方式。信息项始终与低级优化器任务相关,但您必须知道 Fusion 模型如何映射到该低级任务,并且该映射不是 Mosek 保证的 API 的一部分。

您可以M->writeTask("file.opf")查看低级模型的外观。另一方面,如果您想知道您的 Fusion 模型有多少 Fusion 约束,那么您必须在代码中跟踪它。

于 2021-10-08T03:44:44.730 回答