本文介绍了如何从pyomo的ipopt界面中找到违反了哪个约束?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 pyomo 的 ipopt 求解器运行优化问题.我的问题有点复杂,IPOPT 声明它不可行.除非需要,否则我不会发布整个问题.但是,需要注意的一件事是,我为这个问题提供了一个温暖的开始,我认为这将有助于防止不可行性抬头.

I am running an optimization problem using pyomo's ipopt solver. My problem is sort of complicated, and it is declared infeasible by IPOPT. I will not post the entire problem unless needed. But, one thing to note is, I am providing a warm start for the problem, which I thought would help prevent infeasibility from rearing its ugly head.

这是当我在求解器中设置 tee=Truepyomoipopt 的输出:

Here's the output from pyomo and ipopt when I set tee=True inside of the solver:

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

您实际上可以从上面输出的日志中看到,这一行只有 2 个约束评估:

You can actually see from the log outputted above, that there were only 2 constraint evaluates from this line:

Number of equality constraint evaluations            = 2

所以,它实际上很快就被宣布为不可行,所以我想不难找出违反了哪个约束.

So, it actually was declared infeasible pretty quickly, so I imagine it won't be difficult to figure out which constraint was violated.

如何找出违反了哪个约束?或者哪个限制使它不可行?

How do I find out which constraint was violated? Or which constraint is making it infeasible?

这是一个不同的问题,但仍然提供有关 IPOPT 的信息:减少迭代次数后减少约束违反的IPOPT选项

Here is a different question, but one that still is informative about IPOPT: IPOPT options for reducing constraint violation after fewer iterations

推荐答案

运行 Ipopt,选项 print_level 设置为 8给我输出像

Running Ipopt with option print_level set to 8gives me output like

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

curr_c 是等式约束的活动(对于 Ipopt 内部视为 c(x)=0),curr_d 是不等式约束的活动(内部视为 d_L

curr_c are the activity of equality constraints (seen as c(x)=0 internally for Ipopt), curr_d are the activites of inequality constraints (seen as d_L <= d(x) <= d_U internally).So absolute values of curr_c are violations of equality constraints and max(d_L-curr_d,curr_d-d_U,0) are violations of inequality constraints.

最后一次包含约束活动的迭代也由 Ipopt 返回,并且可能会传递回 Pyomo,因此您可以将这些值与约束的左侧和右侧进行比较.

The last iterate including constraint activites is also returned by Ipopt and may be passed back to Pyomo, so you can just compare these values with the left- and right-hand-side of your constraints.

这篇关于如何从pyomo的ipopt界面中找到违反了哪个约束?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-11 18:02