使用数组模型函数在Gekko中初始化变量

时间:2019-06-14 02:55:29

标签: optimization gekko

定义Gekko变量数组不允许使用任何参数来初始化变量。例如,我无法使用m.Array函数创建整数变量数组。

我可以使用以下语法制作变量数组:m.Array(m.Var,(42,42))。但是,我不知道如何使该数组成为整数变量的数组,因为传递给m.Array函数的m.Var不带任何参数。

  • 我有一个变量作为整数变量: my_var_is_an_integer_var = m.Var(0,lb = 0,ub = 1,integer = True)

  • 我有一个不是整数变量的变量数组: my_array_vars_are_not_integer_vars = m.Array(m.Var,(42,42))

  • 我想要一个整数变量数组: my_array_vars_are_integer_vars = m.Array(m.Var(0,lb = 0,ub = 1,integer = True),(42,42)) < strong>(抛出错误)

我如何将数组中的变量初始化为整数变量?

尝试将数组初始化为整数变量时出错:

Traceback (most recent call last):
  File "integer_array.py", line 7, in <module>
    my_array_vars_are_not_integer_vars = m.Array(m.Var(0, lb=0, ub=1, 
integer=True), (42,42))
  File "C:\Users\wills\Anaconda3\lib\site-packages\gekko\gekko.py", line 
 1831, in Array
    i[...] = f(**args)
TypeError: 'GKVariable' object is not callable

1 个答案:

答案 0 :(得分:0)

如果在创建变量数组时需要传递其他参数,则可以使用以下选项之一。选项1创建一个Numpy数组,而选项2和3创建一个Python列表。

选项1(首选) 使用带有附加参数integer=True的m.Array函数创建一个numpy数组:

y = m.Array(m.Var,(42,42),lb=0,ub=1,integer=True)

选项2 创建具有列表理解的二维变量列表:

y = [[m.Var(lb=0,ub=1,integer=True) for i in range(42)] for j in range(42)]

选项3 另外,您可以创建一个空列表(y)并将二进制值附加到该列表。

y = [[None]*42]*42
for i in range(42):
    for j in range(42):
        y[i][j] = m.Var(lb=0,ub=1,integer=True)

创建变量后可以更改上限和下限,但是integer选项仅在初始化时可用。不要忘记使用m.options.SOLVER = 1切换到APOPT MINLP solver以获得整数变量解决方案。下面是一个完整的示例,该示例使用所有三个选项,但为3x4xy使用z数组。

from gekko import GEKKO
import numpy as np

m = GEKKO()

# option 1
x = m.Array(m.Var,(3,4),lb=0,ub=1,integer=True)

# option 2
y = [[m.Var(lb=0,ub=1,integer=True) for i in range(4)] for j in range(3)]

# option 3
z = [[None]*4]*3
for i in range(3):
    for j in range(4):
        z[i][j] = m.Var(lb=0,ub=1,integer=True)

# switch to APOPT
m.options.SOLVER = 1

# define objective function
m.Obj(m.sum(x))
m.Obj(m.sum(np.array(y)))
m.Obj(m.sum(np.array(z)))

# define equation
m.Equation(x[1,2]==0)
m.Equation(m.sum(x[:,0])==2)
m.Equation(m.sum(x[:,1])==3)
m.Equation(m.sum(x[2,:])==1)

m.solve(disp=True)

print(x)

目标是使xyz中所有元素的总和最小,但是{{1}的元素,行和列上有某些约束}。解决方案是:

x