Mosek作为求解优化问题的软件,最大的迭代次数是软件的默认值,有时候我们希望看到没一次迭代的结果,那么怎么办呢?Mosek是没有设置输出迭代过程的功能,但是我们可以设置最大迭代次数来得到没一次迭代的结果。
我用的是Yalmip+mosek,所以下面给出一个例子:
下面是使用modek默认设置的计算日志:
MOSEK Version 8.0.0.60 (Build date: 2017-3-1 13:09:33)
Copyright (c) MOSEK ApS, Denmark. WWW: mosek.com
Platform: Windows/64-X86
Problem
Name :
Objective sense : min
Type : CONIC (conic optimization problem)
Constraints : 76
Cones : 59
Scalar variables : 269
Matrix variables : 0
Integer variables : 0
Optimizer started.
Conic interior-point optimizer started.
Presolve started.
Linear dependency checker started.
Linear dependency checker terminated.
Eliminator started.
Freed constraints in eliminator : 0
Eliminator terminated.
Eliminator - tries : 1 time : 0.00
Lin. dep. - tries : 1 time : 0.01
Lin. dep. - number : 0
Presolve terminated. Time: 0.03
Optimizer - threads : 2
Optimizer - solved problem : the primal
Optimizer - Constraints : 17
Optimizer - Cones : 60
Optimizer - Scalar variables : 211 conic : 179
Optimizer - Semi-definite variables: 0 scalarized : 0
Factor - setup time : 0.00 dense det. time : 0.00
Factor - ML order time : 0.00 GP order time : 0.00
Factor - nonzeros before factor : 153 after factor : 153
Factor - dense dim. : 0 flops : 4.88e+004
ITE PFEAS DFEAS GFEAS PRSTATUS POBJ DOBJ MU TIME
0 5.8e+001 1.0e+000 1.0e+000 0.00e+000 0.000000000e+000 0.000000000e+000 1.0e+000 0.05
1 2.8e+001 4.9e-001 7.4e-001 2.69e+000 -4.254048024e-001 -2.844728402e-001 4.9e-001 0.11
2 9.9e+000 1.7e-001 1.4e+000 1.42e+000 -2.952027207e-001 -3.496907606e-001 1.7e-001 0.11
3 2.7e+000 4.6e-002 8.0e-001 2.05e+000 -2.917533988e-001 -3.004520037e-001 4.6e-002 0.11
4 1.1e+000 1.9e-002 5.1e-001 1.25e+000 -2.945747896e-001 -2.977818412e-001 1.9e-002 0.13
5 4.5e-001 7.8e-003 3.4e-001 1.09e+000 -2.950900595e-001 -2.964001014e-001 7.8e-003 0.13
6 1.6e-001 2.8e-003 2.1e-001 1.04e+000 -2.944637949e-001 -2.949282232e-001 2.8e-003 0.13
7 3.3e-002 5.7e-004 9.7e-002 1.02e+000 -2.943788616e-001 -2.944751249e-001 5.7e-004 0.14
8 7.6e-003 1.3e-004 4.7e-002 1.00e+000 -2.944441319e-001 -2.944664877e-001 1.3e-004 0.14
9 1.2e-003 2.1e-005 1.9e-002 1.00e+000 -2.944543542e-001 -2.944579238e-001 2.1e-005 0.14
10 1.2e-004 2.1e-006 6.0e-003 1.00e+000 -2.944553323e-001 -2.944556878e-001 2.1e-006 0.16
11 3.2e-005 5.6e-007 3.1e-003 1.00e+000 -2.944554230e-001 -2.944555190e-001 5.6e-007 0.16
12 1.2e-005 2.1e-007 1.9e-003 1.00e+000 -2.944554811e-001 -2.944555166e-001 2.1e-007 0.16
13 2.2e-008 3.8e-010 8.4e-005 1.00e+000 -2.944554930e-001 -2.944554931e-001 3.8e-010 0.17
Interior-point optimizer terminated. Time: 0.17.
Optimizer terminated. Time: 0.31
Interior-point solution summary
Problem status : PRIMAL_AND_DUAL_FEASIBLE
Solution status : OPTIMAL
Primal. obj: -2.9445549304e-001 nrm: 1e+000 Viol. con: 5e-009 var: 0e+000 cones: 0e+000
Dual. obj: -2.9445549311e-001 nrm: 3e-001 Viol. con: 0e+000 var: 1e-010 cones: 0e+000
Optimizer summary
Optimizer - time: 0.31
Interior-point - iterations : 13 time: 0.17
Basis identification - time: 0.00
Primal - iterations : 0 time: 0.00
Dual - iterations : 0 time: 0.00
Clean primal - iterations : 0 time: 0.00
Clean dual - iterations : 0 time: 0.00
Simplex - time: 0.00
Primal simplex - iterations : 0 time: 0.00
Dual simplex - iterations : 0 time: 0.00
Mixed integer - relaxations: 0 time: 0.00
ans =
struct with fields:
yalmiptime: 3.5286
solvertime: 0.4354
info: 'Successfully solved (MOSEK)'
problem: 0
下面设置最大迭代次数:下面的ops是设置最大次数而添加的代码行。
ops = sdpsettings('solver','mosek','MSK_IPAR_INTPNT_MAX_ITERATIONS',10);
solvesdp(F,object_fun,ops)
这样就可以了。Mosek的相关参数可以参考:https://docs.mosek.com/7.0/toolbox/Parameters.html.