为什么 Gekko 无法找到给定变量初始值的解决方案

问题描述

我正在尝试使用 Gekko 解决一个优化问题。 当我为变量设置初始值时,使用满足约束的可能解决方案的值,Gekko 找不到解决方案。如何找到根本原因?

我收到此错误

Error: Exception: Access Violation
At line 1341 of file MUMPS/src/dmumps_part2.F
Traceback: not available,compile with -ftrace=frame or -ftrace=full

Error: 'results.json' not found. Check above for additional error details
did not managed to solve
((1)*((d_t200_3_1-d_t100_3_1)))

这是我正在运行的优化模型

m = GEKKO(remote=False)
m.options.MAX_ITER=1000
m.options.IMODE=3 

d_t200_3_0 = m.Var(540,name='d_t200_3_0')
d_t200_3_2 = m.Var(180,name='d_t200_3_2')
d_t200_3_1 = m.Var(360,name='d_t200_3_1')
d_t100_3_0 = m.Var(60,name='d_t100_3_0')
d_t100_3_2 = m.Var(20,name='d_t100_3_2')
d_t100_3_1 = m.Var(40,name='d_t100_3_1')
m.Equation(m.abs2(d_t100_3_0) >= 0.0)
m.Equation(200 > m.abs2(d_t100_3_0))
m.Equation(m.abs2(d_t100_3_2) >= 0.0)
m.Equation(200 > m.abs2(d_t100_3_2))
m.Equation(m.abs2(d_t100_3_1) >= 0.0)
m.Equation(200 > m.abs2(d_t100_3_1))
m.Equation(m.abs2(-1.0*m.abs2(d_t100_3_0) - -1.0*m.abs2(d_t100_3_2)) >= 0.0)
m.Equation(200 > m.abs2(-1.0*m.abs2(d_t100_3_0) - -1.0*m.abs2(d_t100_3_2)))
m.Equation(m.abs2(-1.0*m.abs2(d_t100_3_0) - -1.0*m.abs2(d_t100_3_1)) >= 0.0)
m.Equation(200 > m.abs2(-1.0*m.abs2(d_t100_3_0) - -1.0*m.abs2(d_t100_3_1)))
m.Equation(m.abs2(-1.0*m.abs2(d_t100_3_2) - -1.0*m.abs2(d_t100_3_1)) >= 0.0)
m.Equation(200 > m.abs2(-1.0*m.abs2(d_t100_3_2) - -1.0*m.abs2(d_t100_3_1)))
m.Equation(m.abs2(d_t200_3_0) >= 200.0)
m.Equation(600 > m.abs2(d_t200_3_0))
m.Equation(m.abs2(d_t200_3_2) >= 0.0)
m.Equation(200 > m.abs2(d_t200_3_2))
m.Equation(m.abs2(d_t200_3_1) >= 200.0)
m.Equation(400 > m.abs2(d_t200_3_1))
m.Equation(m.abs2(-1.0*m.abs2(d_t200_3_0) - -1.0*m.abs2(d_t200_3_2)) >= 200.0)
m.Equation(400 > m.abs2(-1.0*m.abs2(d_t200_3_0) - -1.0*m.abs2(d_t200_3_2)))
m.Equation(m.abs2(-1.0*m.abs2(d_t200_3_0) - -1.0*m.abs2(d_t200_3_1)) >= 0.0)
m.Equation(200 > m.abs2(-1.0*m.abs2(d_t200_3_0) - -1.0*m.abs2(d_t200_3_1)))
m.Equation(m.abs2(-1.0*m.abs2(d_t200_3_2) - -1.0*m.abs2(d_t200_3_1)) >= 0.0)
m.Equation(200 > m.abs2(-1.0*m.abs2(d_t200_3_2) - -1.0*m.abs2(d_t200_3_1)))

m.Obj(d_t200_3_2 - d_t100_3_2)
m.solve(debug =1,disp=True)

在没有初始值的情况下解决这个问题时,我得到了一个解决方案,但有时会出现不一致,即同一问题的不同解决方案。任何提示为什么会发生这种情况?我认为有一些随机启动并且种子正在改变,但根据文档,初始认值为 0。

谢谢!

只是为了更新我还没有发现问题,但是如果查看优化变量和相应约束的子集,我确实能够获得优化结果。 这是子集:

d_t200_1_0 = m.Var(180,name='d_t200_1_0')
d_t200_1_2 = m.Var(180,name='d_t200_1_2')
d_t100_1_0 = m.Var(20,name='d_t100_1_0')
d_t100_1_2 = m.Var(20,name='d_t100_1_2')
m.Equation(m.abs2(d_t100_1_0) >= 0.0)
m.Equation(200 > m.abs2(d_t100_1_0))
m.Equation(m.abs2(d_t100_1_2) >= 0.0)
m.Equation(200 > m.abs2(d_t100_1_2))
m.Equation(m.abs2(-1.0*m.abs2(d_t100_1_0) - 1.0*m.abs2(d_t100_1_2)) >= 0.0)
m.Equation(200 > m.abs2(-1.0*m.abs2(d_t100_1_0) - 1.0*m.abs2(d_t100_1_2)))
m.Equation(m.abs2(d_t200_1_0) >= 0.0)
m.Equation(200 > m.abs2(d_t200_1_0))
m.Equation(m.abs2(d_t200_1_2) >= 0.0)
m.Equation(200 > m.abs2(d_t200_1_2))
m.Equation(m.abs2(-1.0*m.abs2(d_t200_1_0) - 1.0*m.abs2(d_t200_1_2)) >= 200.0)
m.Equation(400 > m.abs2(-1.0*m.abs2(d_t200_1_0) - 1.0*m.abs2(d_t200_1_2)))

解决方法

切换到 abs3() 有助于解决问题。另外,有些方程是不需要的,因为它们总是满足的。

from gekko import GEKKO
m = GEKKO(remote=False)
m.options.MAX_ITER=1000
m.options.IMODE=3 

d_t200_3_0 = m.Var(540,name='d_t200_3_0')
d_t200_3_2 = m.Var(180,name='d_t200_3_2')
d_t200_3_1 = m.Var(360,name='d_t200_3_1')
d_t100_3_0 = m.Var(60,name='d_t100_3_0')
d_t100_3_2 = m.Var(20,name='d_t100_3_2')
d_t100_3_1 = m.Var(40,name='d_t100_3_1')

# these equations are not needed
# all values will satisfy the equation
#m.Equation(m.abs3(d_t100_3_0) >= 0.0)
#m.Equation(m.abs3(d_t100_3_2) >= 0.0)
#m.Equation(m.abs3(d_t100_3_1) >= 0.0)
#m.Equation(m.abs3(d_t200_3_2) >= 0.0)

# reform to eliminate absolute value with simple inequalities
#m.Equation(200 > m.abs3(d_t100_3_0))
#m.Equation(200 > m.abs3(d_t100_3_2))
#m.Equation(200 > m.abs3(d_t100_3_1))
#m.Equation(200 > m.abs3(d_t200_3_2))
#m.Equation(600 > m.abs3(d_t200_3_0))
#m.Equation(400 > m.abs3(d_t200_3_1))
v = [d_t100_3_0,d_t100_3_2,d_t100_3_1,d_t200_3_2,d_t200_3_0,d_t200_3_1]
b = [200,200,600,400]
for i,vi in enumerate(v):
    vi.LOWER = -b[i]
    vi.UPPER =  b[i]

m.Equation(m.abs3(d_t200_3_0) >= 200.0)
m.Equation(m.abs3(d_t200_3_1) >= 200.0)
m.Equation(m.abs3(-1.0*m.abs3(d_t100_3_0) - -1.0*m.abs3(d_t100_3_2)) >= 0.0)
m.Equation(200 > m.abs3(-1.0*m.abs3(d_t100_3_0) - -1.0*m.abs3(d_t100_3_2)))
m.Equation(m.abs3(-1.0*m.abs3(d_t100_3_0) - -1.0*m.abs3(d_t100_3_1)) >= 0.0)
m.Equation(200 > m.abs3(-1.0*m.abs3(d_t100_3_0) - -1.0*m.abs3(d_t100_3_1)))
m.Equation(m.abs3(-1.0*m.abs3(d_t100_3_2) - -1.0*m.abs3(d_t100_3_1)) >= 0.0)
m.Equation(200 > m.abs3(-1.0*m.abs3(d_t100_3_2) - -1.0*m.abs3(d_t100_3_1)))
m.Equation(m.abs3(-1.0*m.abs3(d_t200_3_0) - -1.0*m.abs3(d_t200_3_2)) >= 200.0)
m.Equation(400 > m.abs3(-1.0*m.abs3(d_t200_3_0) - -1.0*m.abs3(d_t200_3_2)))
m.Equation(m.abs3(-1.0*m.abs3(d_t200_3_0) - -1.0*m.abs3(d_t200_3_1)) >= 0.0)
m.Equation(200 > m.abs3(-1.0*m.abs3(d_t200_3_0) - -1.0*m.abs3(d_t200_3_1)))
m.Equation(m.abs3(-1.0*m.abs3(d_t200_3_2) - -1.0*m.abs3(d_t200_3_1)) >= 0.0)
m.Equation(200 > m.abs3(-1.0*m.abs3(d_t200_3_2) - -1.0*m.abs3(d_t200_3_1)))

m.Minimize(d_t200_3_2 - d_t100_3_2)
m.solve(disp=True)

这是一个成功的解决方案。

 --------- APM Model Size ------------
 Each time step contains
   Objects      :  0
   Constants    :  0
   Variables    :  172
   Intermediates:  0
   Connections  :  0
   Equations    :  129
   Residuals    :  129
 
 Number of state variables:    172
 Number of total equations: -  128
 Number of slack variables: -  90
 ---------------------------------------
 Degrees of freedom       :    -46
 
 * Warning: DOF <= 0
 ----------------------------------------------
 Steady State Optimization with APOPT Solver
 ----------------------------------------------
Iter:     1 I:  0 Tm:      0.02 NLPi:    8 Dpth:    0 Lvs:    3 Obj: -2.00E+02 Gap:       NaN
--Integer Solution:  -2.00E+02 Lowest Leaf:  -2.00E+02 Gap:   0.00E+00
Iter:     2 I:  0 Tm:      0.02 NLPi:    1 Dpth:    1 Lvs:    3 Obj: -2.00E+02 Gap:  0.00E+00
 Successful solution
 
 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :  0.0469 sec
 Objective      :  -200.0000000002
 Successful solution
 ---------------------------------------------------