我正在使用Python GEKKO解决一个大规模优化问题。在优化过程中,模型的某些变量必须不发生变化。所以我想知道对我想要成为常数的变量(m.Var
(使用m.fix
GEKKO方法,或者用用m.Const
声明的常数替换变量,两者之间有什么区别。
我使用IMODE=3(默认值(,因为我不做任何需要模拟或估计、导数、时间等的事情。
在可能的情况下,对于大规模问题,最好在模型中使用int
或float
数字。也可以使用m.Const()
或m.Var()
并固定该值。m.Var()
选项效率最低,因为它在运算符重载的情况下构建一阶和二阶导数信息。如果确实需要包含简单的方程,例如与c4
定义一起使用,则使用m.options.REDUCE=1
进行预解,以识别和消除与简单预解约束相关联的变量。设置m.options.REDUCE=2
会扫描模型两次,并且可以进行额外的扫描。
from gekko import GEKKO
m = GEKKO()
c1 = 2.0
c2 = m.Const(3.0)
c3 = m.Var(); m.fix(c3,4.0)
c4 = m.Var(); m.Equation(c4==5)
v = m.Var()
m.Minimize((v-c1-c2-c3-c4)**2)
m.solve(disp=False)
print(c1,c2.value,c3.value[0],c4.value[0],v.value[0])
结果:
2.0 3.0 4.0 5.0 14.0
用于改进模型性能的恒定定义
- 最佳:
c1
-Python编号 - 第二名:
c2
-Gekko常数 - 第三名:
c3
-Gekko变量,固定 - 最差:
c4
-Gekko变量,方程式