为什么IPOPT和Scipy使用相同的输入、约束和目标函数得到不同的结果?

2024-10-03 15:34:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我对优化领域很陌生,所以如果我的问题太简单了,请原谅我。我使用Scipy(方法SLSQP)和Pyomo(IPOPT solver)运行了一个优化。在

Pyomo不到一分钟就跑完,Scipy需要4个小时。两者具有相同的输入、约束和目标函数。然而,我得到了不同的结果,我的最终结果在平昌低了3%。在

不存在违反约束的情况,所以我想知道在引擎盖下是否发生了任何事情来证明这种差异是正确的?在

我把求解者的日志放在下面。在

非常感谢!在

Pyomo(IPOPT):

Number of nonzeros in equality constraint Jacobian...:        0
Number of nonzeros in inequality constraint Jacobian.:     2328
Number of nonzeros in Lagrangian Hessian.............:     5796

Total number of variables............................:     1656
                     variables with only lower bounds:        0
                variables with lower and upper bounds:     1656
                     variables with only upper bounds:        0
Total number of equality constraints.................:        0
Total number of inequality constraints...............:     1164
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:        0
        inequality constraints with only upper bounds:     1164

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr ls
 0 1.2175516e-001 2.00e-003 1.10e+000  -1.0 0.00e+000    -  0.00e+000 0.00e+000   0
 1 1.7159127e-001 4.64e-004 2.68e+001  -1.0 9.89e-002    -  1.00e+000 2.99e-002f  1
 2 1.4757673e-001 1.02e-006 4.63e-001  -1.0 1.18e-002    -  1.00e+000 9.90e-001h  1
 3 1.4578777e-001 0.00e+000 1.91e+001  -1.7 1.13e-003    -  7.16e-001 1.00e+000f  1
 4 1.4522458e-001 0.00e+000 3.57e-004  -1.7 4.35e-004    -  1.00e+000 1.00e+000f  1
 5 1.4516754e-001 0.00e+000 5.01e-008  -3.8 5.97e-006    -  1.00e+000 1.00e+000f  1
 6 1.3779755e-001 0.00e+000 2.13e-001  -5.7 1.10e-003    -  5.33e-001 1.00e+000f  1
 7 1.2833665e-001 0.00e+000 8.20e-002  -5.7 1.50e-003    -  6.14e-001 1.00e+000f  1
 8 1.2186589e-001 0.00e+000 3.96e-002  -5.7 1.58e-003    -  5.14e-001 8.75e-001f  1
 9 1.1779793e-001 0.00e+000 1.98e-002  -5.7 1.26e-003    -  5.80e-001 9.20e-001f  1
 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 10 1.1546554e-001 0.00e+000 8.06e-003  -5.7 1.29e-003    -  7.18e-001 1.00e+000f  1
 11 1.1457517e-001 0.00e+000 6.17e-005  -5.7 7.62e-004    -  1.00e+000 1.00e+000f  1
 12 1.1440512e-001 0.00e+000 5.72e-006  -5.7 2.98e-004    -  1.00e+000 1.00e+000f  1
 13 1.1285677e-001 0.00e+000 3.15e-003  -8.6 1.37e-003    -  6.05e-001 7.84e-001f  1
 14 1.1237444e-001 0.00e+000 1.24e-003  -8.6 1.35e-003    -  6.37e-001 6.43e-001f  1
 15 1.1214949e-001 0.00e+000 1.70e-003  -8.6 1.54e-003    -  4.40e-001 6.26e-001f  1
 16 1.1203489e-001 0.00e+000 1.40e-003  -8.6 2.82e-003    -  4.49e-001 7.18e-001f  1
 17 1.1200180e-001 0.00e+000 4.97e-004  -8.6 1.21e-003    -  6.60e-001 5.89e-001f  1
 18 1.1197130e-001 0.00e+000 2.65e-004  -8.6 1.62e-003    -  6.69e-001 9.46e-001f  1
 19 1.1196671e-001 0.00e+000 1.70e-004  -8.6 8.83e-004    -  1.00e+000 8.58e-001f  1
 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 20 1.1196558e-001 0.00e+000 8.21e-007  -8.6 7.88e-004    -  1.00e+000 1.00e+000f  1
 21 1.1196558e-001 0.00e+000 4.69e-009  -8.6 3.18e-005    -  1.00e+000 1.00e+000h  1

Number of Iterations....: 21

                               (scaled)                 (unscaled)
Objective...............:  1.1196557946295761e-001   1.1196557946295761e-001
Dual infeasibility......:  4.6902322746109060e-009   4.6902322746109060e-009
Constraint violation....:  0.0000000000000000e+000   0.0000000000000000e+000
Complementarity.........:  2.5450573136704817e-009   2.5450573136704817e-009
Overall NLP error.......:  4.6902322746109060e-009   4.6902322746109060e-009


Number of objective function evaluations             = 22
Number of objective gradient evaluations             = 22
Number of equality constraint evaluations            = 0
Number of inequality constraint evaluations          = 22
Number of equality constraint Jacobian evaluations   = 0
Number of inequality constraint Jacobian evaluations = 22
Number of Lagrangian Hessian evaluations             = 21
Total CPU secs in IPOPT (w/o function evaluations)   =      3.105
Total CPU secs in NLP function evaluations           =     64.320

EXIT: Optimal Solution Found.

Scipy(SLSQP):

^{pr2}$

Tags: ofinalphanumberwithprinftotal