【问题标题】:GEKKO: Array size as a model variableGEKKO:数组大小作为模型变量
【发布时间】: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 能够以这种方式改变数组的大小,那么在我看来这是更优雅的解决方案。

非常感谢任何帮助。

【问题讨论】:

    标签: 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]]
    

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2019-12-28
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2021-11-11
      • 2013-11-22
      • 1970-01-01
      • 2012-10-28
      相关资源
      最近更新 更多