使用数组模型函数初始化gekko中的变量
Initializing variables in gekko using the array model function
定义 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)) (抛出错误)
如何将数组中的变量初始化为整型变量???
尝试将数组初始化为整数变量时出错:
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 创建一个 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 以获得整数变量解决方案。下面是一个完整的示例,它使用所有三个选项,但使用 3x4
数组表示 x
、y
和 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)
objective是对x
、y
、z
中的所有元素求和,但是对一个元素、行、 x
列。解决方案是:
[[[1.0] [1.0] [0.0] [0.0]]
[[1.0] [1.0] [0.0] [0.0]]
[[0.0] [1.0] [0.0] [0.0]]]
定义 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)) (抛出错误)
如何将数组中的变量初始化为整型变量???
尝试将数组初始化为整数变量时出错:
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 创建一个 Numpy 数组,而选项 2 和 3 创建一个 Python 列表。
选项 1(首选)
使用带有附加参数 integer=True
:
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 以获得整数变量解决方案。下面是一个完整的示例,它使用所有三个选项,但使用 3x4
数组表示 x
、y
和 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)
objective是对x
、y
、z
中的所有元素求和,但是对一个元素、行、 x
列。解决方案是:
[[[1.0] [1.0] [0.0] [0.0]]
[[1.0] [1.0] [0.0] [0.0]]
[[0.0] [1.0] [0.0] [0.0]]]