Optimization 使用数组模型函数初始化gekko中的变量

Optimization 使用数组模型函数初始化gekko中的变量,optimization,gekko,Optimization,Gekko,定义Gekko变量数组不允许任何参数初始化变量。例如,我无法使用m.array函数生成整数变量数组 我可以使用以下语法创建一个变量数组:m.array(m.Var,(42,42))。但是,我不知道如何使这个数组成为整数变量数组,因为传递给m.array函数的m.Var不接受任何参数 我将单个变量作为整数变量: 我的变量是一个整数,变量=m.var(0,lb=0,ub=1,integer=True) 我有一个非整数变量的变量数组: my_array_vars_不是整数_vars=m.array(

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

我可以使用以下语法创建一个变量数组:m.array(m.Var,(42,42))。但是,我不知道如何使这个数组成为整数变量数组,因为传递给m.array函数的m.Var不接受任何参数

  • 我将单个变量作为整数变量: 我的变量是一个整数,变量=m.var(0,lb=0,ub=1,integer=True)

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

  • 我想要一个整数变量数组:我的数组变量是整数变量(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
回溯(最近一次呼叫最后一次):
文件“integer_array.py”,第7行,在
my_array_vars_不是整数_vars=m.array(m.Var(0,lb=0,ub=1,
整数=真,(42,42))
文件“C:\Users\wills\Anaconda3\lib\site packages\gekko\gekko.py”,第行
1831年,在阵列中
i[…]=f(**args)
TypeError:“GKVariable”对象不可调用

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

选项1(首选) 使用带有附加参数的m.array函数创建numpy数组
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)(对于范围(42)中的i)]对于范围(42)中的j]
选项3 或者,您可以创建一个空列表(y)并将二进制值附加到该列表中

y=[[None]*42]*42
对于范围(42)内的i:
对于范围(42)内的j:
y[i][j]=m.Var(lb=0,ub=1,integer=True)
创建变量后可以更改上限和下限,但
integer
选项仅在初始化时可用。不要忘记使用
m.options.SOLVER=1
切换到整数变量解决方案。下面是一个完整的示例,它使用了所有三个选项,但带有
x
y
z
3x4
数组

从gekko导入gekko
将numpy作为np导入
m=GEKKO()
#选择1
x=m.Array(m.Var,(3,4),lb=0,ub=1,integer=True)
#选择2
y=[[m.Var(lb=0,ub=1,integer=True)(对于范围(4)中的i)]对于范围(3)中的j]
#选择3
z=[[None]*4]*3
对于范围(3)中的i:
对于范围(4)内的j:
z[i][j]=m.Var(lb=0,ub=1,integer=True)
#切换到APOPT
m、 options.SOLVER=1
#定义目标函数
m、 Obj(m.sum(x))
m、 Obj(m.sum(np.array(y)))
m、 Obj(m.sum(np.array(z)))
#定义方程
m、 方程(x[1,2]==0)
m、 方程(m.sum(x[:,0])==2)
m、 方程(m.sum(x[:,1])==3)
m、 方程(m.sum(x[2,:])==1)
m、 求解(disp=True)
打印(x)
目标是最小化
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]]]