GEKKO - оптимизация в матричной форме - PullRequest
4 голосов
/ 07 мая 2020

Я пытаюсь решить проблему оптимизации, когда мне нужно указать проблему и ограничения, используя 2D-матрицу. Я использовал SCIPY, где требуются одномерные массивы. Я хочу проверить, позволяет ли GEKKO указать целевую функцию, границы и ограничения с помощью 2D-матрицы.

Я предоставил подробности и воспроизводимую версию проблемы в сообщении здесь: SCIPY - построение ограничений без перечисления каждой переменной отдельно

Спасибо C

1 Ответ

4 голосов
/ 07 мая 2020

Вы можете использовать функцию m.Array в gekko . Я не рекомендую вам использовать np.triu() с массивом Gekko, потому что исключенные переменные все равно будут решать, но потенциально будут скрыты от результатов. Вот решение:

import numpy as np
import scipy.optimize as opt
from gekko import GEKKO

p= np.array([4, 5, 6.65, 12]) #p = prices
pmx = np.triu(p - p[:, np.newaxis]) #pmx = price matrix, upper triangular

m = GEKKO(remote=False)
q = m.Array(m.Var,(4,4),lb=0,ub=10)
# only upper triangular can change
for i in range(4):
    for j in range(4):
        if j<=i:
            q[i,j].upper=0 # set upper bound = 0

def profit(q):
    profit = np.sum(q.flatten() * pmx.flatten())
    return profit

for i in range(4):
    m.Equation(np.sum(q[i,:])<=10)
    m.Equation(np.sum(q[:,i])<=8)
m.Maximize(profit(q))

m.solve()

print(q)

Это дает решение:

[[[0.0] [2.5432017412] [3.7228765674] [3.7339217013]]
 [[0.0] [0.0] [4.2771234426] [4.2660783187]]
 [[0.0] [0.0] [0.0] [0.0]]
 [[0.0] [0.0] [0.0] [0.0]]]
...