问题描述
我正在尝试使用 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
---------------------------------------------------