GEKKO:获取中间体列表的最大值

GEKKO: Get maximum value of list of Intermediates

我正在解决一个问题,我已经定义了几个中间体列表。我的限制之一取决于获得这些中间体列表之一的最大值和最小值。据我所知,内置的 max2 和 max3 函数不适合这项任务,因为列表不是连续可微的。我也尝试过使用 numpy 的 max 函数,但这会引发错误。我需要在每次求解器迭代时更新最大值和最小值,因为它们是重要的约束。我在这里缺少明显的解决方案吗?

gekko built-in max2max3 函数适用于从列表中查找最大值或最小值的任务,如果两个变量与列表的每个循环进行比较。这些函数只允许比较两个值,因为每次比较都会向问题添加额外的方程式和变量。 mx 是列表的最大值,mn 是列表的最小值。每次通过列表时,mxmn 值都会与列表中的下一个值与附加方程式和变量进行比较。考虑一个简单的问题,其中包含列表 [0,1,2,3,4,5,6] 和采用该列表的平方的中间计算。 max3min3 函数在循环中用于比较 t 列表中的下一个值。

from gekko import GEKKO
m=GEKKO(remote=False)
n=[0,1,2,3,4,5,6]
t=[m.Intermediate(i**2) for i in n]

mx = t[0] # max
mn = t[0] # min
for i in range(1,len(n)):
    mx = m.max3(mx,t[i])
    mn = m.min3(mn,t[i])

# initialize with IPOPT
#m.options.SOLVER = 3
#m.solve(disp=False)

# solve with APOPT
m.options.SOLVER = 1
m.solve(disp=False)

print(mx.value[0])
print(mn.value[0])

这个简单问题的解是 36 最大值和 0 最小值。中间列表 t 可以替换为包含中间、常量、参数或变量的任何类型的列表。对于此类问题,有时使用求解器 IPOPT(非线性规划求解器)进行初始化并使用 APOPT 求解器(混合整数非线性规划)完成以获得整数解有时会有所帮助。使用 m.options.SOLVER=3m.solve(disp=False) 取消注释预求解以使用此初始化。