Используйте модель APMonitor в Python Gekko - PullRequest
2 голосов
/ 28 мая 2020

Есть ли способ использовать модель APMonitor непосредственно в Gekko? Например, могу ли я решить задачи теста Hock Schittkowski , не переписывая их в Gekko, но все же решать их с помощью Gekko? Примером является задача 43, проблема Розена-Судзуки. В APMonitor это:

Файл: hs043.apm

Model hs43
  Variables
    x[1:4] = 0
    obj
  End Variables

  Equations
    x[1]^2 +x[2]^2 +x[3]^2 +x[4]^2 +x[1] -x[2] +x[3] -x[4] <= 8
    x[1]^2 +2*x[2]^2 +x[3]^2 +2*x[4]^2 -x[1] -x[4] <= 10
    2*x[1]^2 +x[2]^2 +x[3]^2 +2*x[1] -x[2] -x[4] <= 5          

    ! best known objective = -44
    ! best known solution
    ! x[1] = 0
    ! x[2] = 1
    ! x[3] = 2
    ! x[4] = -1
    obj = x[1]^2 + x[2]^2 + 2*x[3]^2 + x[4]^2 - 5*x[1] - 5*x[2] - 21*x[3] + 7*x[4]
  End Equations
End Model

Модель в Gekko аналогична:

Python Gekko

from gekko import GEKKO
m = GEKKO(remote=False)
x1,x2,x3,x4 = m.Array(m.Var,4)
m.Equation(x1**2+x2**2+x3**2+x4**2+x1-x2+x3-x4<=8)
m.Equation(x1**2+2*x2**2+x3**2+2*x4**2-x1-x4<=10)
m.Equation(2*x1**2+x2**2+x3**2+2*x1-x2-x4<=5)
m.Minimize(x1**2+x2**2+2*x3**2+x4**2-5*x1-5*x2-21*x3+7*x4)
m.solve()
print(x1,x2,x3,x4)
print('Objective: ',m.options.OBJFCNVAL)

Когда я открываю папку запуска с m.open_folder() с помощью приложения Gekko, я вижу, что Gekko пишет файл APMonitor gk_model0.apm.

Model
Variables
    v1 = 0
    v2 = 0
    v3 = 0
    v4 = 0
End Variables
Equations
    (((((((((v1)^(2))+((v2)^(2)))+((v3)^(2)))+((v4)^(2)))+v1)-v2)+v3)-v4)<=8
    (((((((v1)^(2))+((2)*(((v2)^(2)))))+((v3)^(2)))+((2)*(((v4)^(2)))))-v1)-v4)<=10
    (((((((2)*(((v1)^(2))))+((v2)^(2)))+((v3)^(2)))+((2)*(v1)))-v2)-v4)<=5
    minimize (((((((((v1)^(2))+((v2)^(2)))+((2)*(((v3)^(2)))))+((v4)^(2)))-((5)*(v1)))-((5)*(v2)))-((21)*(v3)))+((7)*(v4)))
End Equations

End Model

Могу ли я использовать hs043.apm вместо

1 Ответ

1 голос
/ 28 мая 2020

Функция m.Raw() позволяет вам использовать код APMonitor в Gekko, хотя это не рекомендуется, за исключением опытных пользователей. Вот hs043.apm в gekko.

model = '''
Model hs43
  Variables
    x[1:4] = 0
    obj
  End Variables

  Equations
    x[1]^2 +x[2]^2 +x[3]^2 +x[4]^2 +x[1] -x[2] +x[3] -x[4] <= 8
    x[1]^2 +2*x[2]^2 +x[3]^2 +2*x[4]^2 -x[1] -x[4] <= 10
    2*x[1]^2 +x[2]^2 +x[3]^2 +2*x[1] -x[2] -x[4] <= 5          

    ! best known objective = -44
    ! best known solution
    ! x[1] = 0
    ! x[2] = 1
    ! x[3] = 2
    ! x[4] = -1
    obj = x[1]^2 + x[2]^2 + 2*x[3]^2 + x[4]^2 &
          - 5*x[1] - 5*x[2] - 21*x[3] + 7*x[4]
  End Equations
End Model
'''

from gekko import GEKKO
m = GEKKO(remote=False)
m.Raw(model)
m.solve()
print('Objective: ', m.options.OBJFCNVAL)

Он решает с помощью Objective: -44.00000003, так же, как приложение Python gekko. Одним из недостатков использования модели APMonitor является то, что вам нужно будет получить результаты, потому что они не будут загружены обратно в Python переменные.

import json
with open(m.path+'//results.json') as f:
    results = json.load(f)
print(results)

Вот словарь результатов:

{'time': [0.0], 'hs43.x[1]': [1.1795097003e-09], \
 'hs43.x[2]': [1.0000000007], 'hs43.x[3]': [2.0000000018], \ 
 'hs43.x[4]': [-0.99999999967], 'hs43.obj': [-44.00000003], \
 'hs43.slk_1': [0.0], 'hs43.slk_2': [0.99999999287], \
 'hs43.slk_3': [0.0]}
...