Если вам нужно передать дополнительные аргументы при создании массива переменных, вы можете использовать один из следующих параметров.Опция 1 создает массив Numpy, а опции 2 и 3 - список Python.
Опция 1 (предпочтительный вариант) Создание массива с функцией m.Array с дополнительным аргументом integer=True
:
y = m.Array(m.Var,(42,42),lb=0,ub=1,integer=True)
Опция 2 Создание 2D-списка переменных с пониманием списка:
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)
Границы UPPER и LOWER можно изменить после создания переменной, но опция integer
доступна только при инициализации.Не забудьте переключиться на APOPT MINLP solver для решений с целочисленными переменными с помощью 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]]]