пожалуйста, дайте мне знать, как поместить параметр GEKKO в переменную - PullRequest
2 голосов
/ 12 марта 2020

Я хочу поместить параметр GEKKO 'N' в переменную 'Y', но я получил ошибку, как показано ниже. Я имею в виду, что параметр «N» должен непрерывно изменяться во время оптимизации. Есть ли другой способ изменить N?

from gekko import GEKKO
m = GEKKO()
k = 10
N = m.Param(value=[i+1 for i in range(6)])

Y = m.Array(m.Var, (N, k))
for i in range(N):
    for j in range(k):
        Y[i, j].value = 0
        Y[i, j].lower = 0
        Y[i, j].upper = 1
Traceback (most recent call last):
  File "C:\Users\johnh\Desktop\test.py", line 6, in <module>
    Y = m.Array(m.Var, (N, k))
  File "C:\Python37\lib\site-packages\gekko\gekko.py", line 1916, 
  in Array x = np.ndarray(dim,dtype=object)
TypeError: 'GKParameter' object cannot be interpreted
  as an integer

1 Ответ

2 голосов
/ 17 марта 2020

Гекко требует, чтобы структура задачи (уравнения) оставалась постоянной, но значения переменных и границы могут изменяться. Если вам не нужны последние строки переменных, вы можете установить матрицу stati c, а затем включить или выключить каждую строку с помощью lower=upper=0. Когда нижняя и верхняя границы равны, переменная фиксируется на этом значении и не используется оптимизатором.

from gekko import GEKKO
m = GEKKO()
k = 3
N = 6
Y = m.Array(m.Var, (N, k))

for i in range(N):
    for j in range(k):
        Y[i, j].value = 0
        Y[i, j].lower = 0
        if i<N:
            Y[i, j].upper = 1
        else:
            Y[i, j].upper = 0
        m.Maximize(Y[i,j])
    m.solve(disp=False)
    print('Problem: ' + str(i))
    print(Y)

Это дает 6 решений, в которых значение Y максимизировано.

Problem: 0
[[[1.0] [1.0] [1.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]]
Problem: 1
[[[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]]
Problem: 2
[[[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]]

Каждый раз через l oop она решается с помощью еще одного ряда переменных.

Problem: 3
[[[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0]]]
Problem: 4
[[[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[0.0] [0.0] [0.0]]]
Problem: 5
[[[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]
 [[1.0] [1.0] [1.0]]]
...