GEKKO:数组大小作为模型变量

Posted

技术标签:

【中文标题】GEKKO:数组大小作为模型变量【英文标题】:GEKKO: Array size as a model variable 【发布时间】:2022-01-19 17:44:15 【问题描述】:

我对 Gekko 很陌生。作为优化的一部分,是否可以改变模型数组的大小?我正在运行一个简单的问题,其中不同数量的扭转弹簧以不同的角度接合,我想允许模型改变接合角度的数量。每个弹簧都有几个组件变量,我也试图将它们定义为变量数组。但是,下面的数组 theta_engage 的大小定义尚未接受 int(n_engage.value)。我收到以下错误:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'GK_Value'

相关代码:

n_engage = m.Var(2, lb=1, ub=10, integer=True)

theta_engage = m.Array(m.Var, (int(n_engage.value)))
theta_engage[0].value = 0.0
theta_engage[0].lower = 0.0
theta_engage[0].upper = 85.0
theta_engage[1].value = 15.0
theta_engage[1].lower = 0.0
theta_engage[1].upper = 85.0

如果我尝试仅通过 n_engage.value 定义 theta_engage 的大小,则会收到此错误:

TypeError: expected sequence object with len >= 0 or a single integer

我想我可以将数组定义为我愿意接受的最大尺寸,并允许弹簧数的下限为 0,但我必须以某种方式在约束中强制执行最小总弹簧数。如果 Gekko 能够以这种方式改变数组的大小,那么在我看来这是更优雅的解决方案。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

无法逐次更改问题结构。但是,很容易定义一个二进制变量b 来激活或停用应该包含或排除的模型部分。

from gekko import GEKKO
import numpy as np
m = GEKKO()
# number of springs
n = 10
# number of engaged springs (1-10)
nb = m.Var(2, lb=1, ub=n, integer=True)
# engaged springs (binary, 0-1)
b = m.Array(m.Var,n,lb=0,ub=1,integer=True)
# angle of engaged springs
θ = m.Array(m.Param,n,lb=0,ub=85)
# initialize values
t0 = [0,15,20,25,30,15,30,25,10,50]
for i,ti in enumerate(t0):
    θ[i].value = ti
# contributing spring forces
F = [m.Intermediate(b[i]*m.cos((np.pi/180.0)*θ[i])) \
     for i in range(10)]
# force constraint
m.Equation(m.sum(F)>=3)
# engaged springs
m.Equation(nb==m.sum(b))
# minimize engaged springs
m.Minimize(nb)
# optimize with APOPT solver
m.options.SOLVER=1
m.solve()
# print solution
print(b)

这会在 0.079 秒内给出一个解决方案,即应接合弹簧 1、3、9 和 10。它选择了最少数量的弹簧 (4) 以达到相当于 0 角度的 3 个弹簧所需的力。

 Successful solution
 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :   7.959999999729916E-002 sec
 Objective      :    4.00000000000000     
 Successful solution
 ---------------------------------------------------
[[1.0] [0.0] [1.0] [0.0] [0.0] [0.0] [0.0] [0.0] [1.0] [1.0]]

【讨论】:

以上是关于GEKKO:数组大小作为模型变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Gekko 中减少我的方程式大小或在 APMonitor 中增加最大字符串长度

GEKKO 中的 MPC:错误代码“位置 4”解决方案

如何将 gekko 对象插入/附加到现有列表/数组?

Gekko 中间变量,错误:不等式或不等式的方程

GEKKO:未找到 options.json 和并行化问题

在过程模拟期间初始化状态变量的导数