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:数组大小作为模型变量的主要内容,如果未能解决你的问题,请参考以下文章