Gekko优化中辅助变量是否需定义为变量?类型选择咨询
Gekko辅助变量E的定义与使用问题解答
核心结论
这类辅助变量需要定义为Gekko变量,用默认的连续型m.Var就合适——因为你要用它构建约束逻辑(通过大M法关联主决策变量),只有把E设为Gekko能识别的Var类型,求解器才能处理这些约束关系。
对现有写法的优化说明
你用大M法实现“车辆n分配给充电站i时,E等于累计充电能量;未分配时E为0”的逻辑是对的,但有两处需要调整:
- 别用
np.sum,Gekko有专属的m.sum函数,用numpy的求和会让Gekko无法识别变量的动态依赖,导致求解出错; - 大M的取值要合理,不能过大(引发数值不稳定)也不能过小(约束失效),建议基于车辆最大电池容量来设置,比如取最大容量的1.1倍。
修正后的代码示例
E = m.Array(m.Var,(I,T,N),lb=0) # 设定合理的大M值,示例为车辆最大电池容量的1.1倍 M = params.ev.max_battery * 1.1 for i in range(I): for n in range(N): for t in range(T): # 用Gekko的sum函数计算累计充电能量 cumulative_energy = m.sum(0.25 * availability[n, k] * p[i,k] for k in range(t)) # 大M约束:x=1时E绑定累计能量,x=0时E强制为0 m.Equation(E[i][t][n] >= cumulative_energy - M * (1 - x[i][n])) m.Equation(E[i][t][n] <= cumulative_energy + M * (1 - x[i][n])) m.Equation(E[i][t][n] <= M * x[i][n])
额外说明
如果E只是用来做中间计算、后续不参与约束或目标函数,那可以用m.Expression代替m.Var来减少变量数量,但你的场景里E是约束的核心部分,所以必须用m.Var。
内容的提问来源于stack exchange,提问作者Farhad Balali
相关产品推荐
相关产品推荐

