Gekko中目标函数外访问决策变量值的正确实现方法
Gekko中在目标函数外部访问决策变量实时值的解决方案
问题背景
需要在Gekko框架的目标函数外部访问决策变量的实时计算值,初始实现代码如下:
tc_var = {} for index in index_f_a: tc_var[index] = m.Var(value=25, name='tc_var_{}'.format(index), lb=15, ub=45, integer=False) def k1(i, z, j, a): a_dif = tce[(i, z, j, a)] - tc_var[(i, j)].VALUE return a_dif if a_dif > 0 else 0 m.Minimize(m.sum([k1(i, z, j, a)*KCA for i, z, j, a in index_f_h_a_v]))
但存在问题:使用.VALUE仅能获取变量的初始值,无法拿到求解过程中的实时值;如果直接访问变量本身(不使用.VALUE)则会触发报错。
解决方案
Gekko属于符号式建模工具,不能直接在自定义函数中使用Python原生的条件判断逻辑处理决策变量。正确的做法是引入辅助变量,通过约束方程实现所需逻辑,最终代码如下:
def k1(i, z, j, a): d = m.Var(lb=0) s = m.Var(lb=0) m.Minimize(1e-3*s) m.Equation(d == (tce[(i, z, j, a)] - tc_var[(i, j)])*KCA + s) return d m.Minimize( m.sum([k1(i, z, j, a) for i, z, j, a in index_f_h_a_v]))
逻辑说明
- 引入非负辅助变量
d和s,其中d用于替代原逻辑中max(0, tce[(i,z,j,a)] - tc_var[(i,j)])*KCA的结果 - 通过约束方程
d == (tce[(i,z,j,a)] - tc_var[(i,j)])*KCA + s,结合对s的极小化(系数1e-3是小权重,确保s仅在必要时取值),实现:- 当
(tce[(i,z,j,a)] - tc_var[(i,j)])*KCA > 0时,s会被优化至0,d等于该正值 - 当
(tce[(i,z,j,a)] - tc_var[(i,j)])*KCA <= 0时,s会取该值的绝对值,保证d始终非负,符合原逻辑中返回0的需求
- 当
内容的提问来源于stack exchange,提问作者Rita s
相关产品推荐
相关产品推荐

