sim*_*ple 5 optimization python-2.7 ipopt pyomo
我正在使用 pyomo 的求解器运行优化问题ipopt。我的问题有点复杂,它是infeasible由IPOPT声明的。除非需要,我不会发布整个问题。但是,需要注意的一件事是,我为这个问题提供了一个温暖的开始,我认为这将有助于防止不可行的情况再次出现。
这是我在求解器内部设置pyomo时的输出:ipopttee=True
Ipopt 3.12.4:
******************************************************************************
This program contains Ipopt, a library for large-scale nonlinear optimization.
Ipopt is released as open source code under the Eclipse Public License (EPL).
For more information visit http://projects.coin-or.org/Ipopt
******************************************************************************
This is Ipopt version 3.12.4, running with linear solver mumps.
NOTE: Other linear solvers might be more efficient (see Ipopt documentation).
Number of nonzeros in equality constraint Jacobian...: 104
Number of nonzeros in inequality constraint Jacobian.: 0
Number of nonzeros in Lagrangian Hessian.............: 57
Total number of variables............................: 31
variables with only lower bounds: 0
variables with lower and upper bounds: 0
variables with only upper bounds: 0
Total number of equality constraints.................: 29
Total number of inequality constraints...............: 0
inequality constraints with only lower bounds: 0
inequality constraints with lower and upper bounds: 0
inequality constraints with only upper bounds: 0
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
0 0.0000000e+00 1.00e+01 1.00e+02 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0
WARNING: Problem in step computation; switching to emergency mode.
1r 0.0000000e+00 1.00e+01 9.99e+02 1.0 0.00e+00 20.0 0.00e+00 0.00e+00R 1
WARNING: Problem in step computation; switching to emergency mode.
Restoration phase is called at point that is almost feasible,
with constraint violation 0.000000e+00. Abort.
Restoration phase in the restoration phase failed.
Number of Iterations....: 1
(scaled) (unscaled)
Objective...............: 0.0000000000000000e+00 0.0000000000000000e+00
Dual infeasibility......: 9.9999999999999986e+01 6.0938999999999976e+02
Constraint violation....: 1.0000000000000000e+01 1.0000000000000000e+01
Complementarity.........: 0.0000000000000000e+00 0.0000000000000000e+00
Overall NLP error.......: 9.9999999999999986e+01 6.0938999999999976e+02
Number of objective function evaluations = 2
Number of objective gradient evaluations = 2
Number of equality constraint evaluations = 2
Number of inequality constraint evaluations = 0
Number of equality constraint Jacobian evaluations = 2
Number of inequality constraint Jacobian evaluations = 0
Number of Lagrangian Hessian evaluations = 2
Total CPU secs in IPOPT (w/o function evaluations) = 0.008
Total CPU secs in NLP function evaluations = 0.000
EXIT: Restoration Failed!
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
model, tee=True)
4
/Library/<path to solvers.pyc> in solve(self, *args, **kwds)
616 result,
617 select=self._select_index,
--> 618 default_variable_value=self._default_variable_value)
619 result._smap_id = None
620 result.solution.clear()
/Library/Frameworks<path to>/PyomoModel.pyc in load_from(self, results, allow_consistent_values_for_fixed_vars, comparison_tolerance_for_fixed_vars, ignore_invalid_labels, id, delete_symbol_map, clear, default_variable_value, select, ignore_fixed_vars)
239 else:
240 raise ValueError("Cannot load a SolverResults object "
--> 241 "with bad status: %s" % str(results.solver.status))
242 if clear:
243 #
ValueError: Cannot load a SolverResults object with bad status: error
Run Code Online (Sandbox Code Playgroud)
您实际上可以从上面输出的日志中看到,这一行只有 2 个约束评估:
Number of equality constraint evaluations = 2
Run Code Online (Sandbox Code Playgroud)
因此,它实际上很快就被宣布为不可行,所以我想找出违反了哪个约束并不困难。
如何找出违反了哪个约束?或者说哪一个限制使得它不可行?
这是一个不同的问题,但仍然提供了有关以下内容的信息IPOPT:IPOPT options for Preventing constrainviolation after less iterations
运行 Ipopt 并将选项 print_level 设置为 8 给出如下输出
DenseVector "modified d_L scaled" with 1 elements:
modified d_L scaled[ 1]= 2.4999999750000001e+01
DenseVector "modified d_U scaled" with 0 elements:
...
DenseVector "curr_c" with 1 elements:
curr_c[ 1]= 7.1997853012817359e-08
DenseVector "curr_d" with 1 elements:
curr_d[ 1]= 2.4999999473733212e+01
DenseVector "curr_d - curr_s" with 1 elements:
curr_d - curr_s[ 1]=-2.8774855209690031e-07
Run Code Online (Sandbox Code Playgroud)
curr_c 是等式约束的活动(对于 Ipopt,内部视为 c(x)=0),curr_d 是不等式约束的活动(内部视为 d_L <= d(x) <= d_U)。因此 curr_c 的绝对值违反了等式约束,而 max(d_L-curr_d,curr_d-d_U,0) 违反了不等式约束。
最后一次迭代(包括约束活动)也由 Ipopt 返回,并且可能会传递回 Pyomo,因此您可以将这些值与约束的左侧和右侧进行比较。
| 归档时间: |
|
| 查看次数: |
2482 次 |
| 最近记录: |