Инициализация переменных в gekko с помощью функции модели массива

Определение массива переменных Gekko не позволяет аргументам инициализировать переменные. Например, я не могу создать массив целочисленных переменных с помощью функции m.Array.

Я могу создать массив переменных, используя этот синтаксис: m.Array (m.Var, (42, 42)). Однако я не знаю, как сделать этот массив массивом целочисленных переменных, потому что m.Var, переданный в функцию m.Array, не принимает никаких аргументов.

  • У меня есть единственная переменная как целочисленная переменная: 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

person liamW    schedule 14.06.2019    source источник


Ответы (1)


Если вам нужно передать дополнительные аргументы при создании массива переменных, вы можете использовать один из следующих вариантов. Вариант 1 создает массив Numpy, а варианты 2 и 3 создают список Python.

Вариант 1 (предпочтительный) Создайте массив numpy с функцией m.Array с дополнительным аргументом 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 доступна только при инициализации. Не забудьте переключиться на решатель APOPT MINLP для решений с целочисленными переменными с m.options.SOLVER = 1. Ниже приведен полный пример, в котором используются все три параметра, но с массивом 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)

Цель состоит в том, чтобы минимизировать сумму всех элементов в 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]]]
person John Hedengren    schedule 14.06.2019