Gekko Нелинейная оптимизация, ошибка типа объекта в функции оценки ограничений if

Вам нужно будет создать API-интерфейс на стороне сервера, который обратится к вашей базе данных, а затем вызовет API из вашего приложения HTML5.

5
задан Nathaniel 2 April 2019 в 19:33
поделиться

2 ответа

Я рекомендую вам использовать функции min2 или min3 или недавно добавленную функцию if3 в GEKKO.

K = m.min3(Ck(x1,x2,x3,x4),15)

Вот дополнительная информация о MPCC и переменных двоичного переключения . Вы не можете использовать функции с непостоянными градиентами, потому что это вызывает проблемы с решателями и тем, как они ищут решение. Функции min3 и if3 используют бинарные переменные и решают задачу как задачу со смешанным целым числом, а min2 используют MPCC. Вот короткий пример, который демонстрирует использование min2 и min3 .

Example use of min2 and min3 functions

import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO
m = GEKKO(remote=False) 
p = m.Param(value=np.linspace(10,20,21))
x = m.Var()
m.Equation(x==p)
# with MPCCs
y2 = m.min2(p,15)
# with integer variables
y3 = m.min3(p,16)
m.options.IMODE = 2
m.solve()
plt.plot(p,x,'b-',label='x')
plt.plot(p,y2,'g:',label='MPCC')
plt.plot(p,y3,'r--',label='Integer Switch')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()
0
ответ дан John Hedengren 2 April 2019 в 19:33
поделиться

(Отказ от ответственности: я не знаю эту библиотеку или что она будет делать для вас)

Оператор if делает эту проблему недифференцируемой, что делает недействительным предположение о решателях НЛП (таких как Ipopt). [ 118]

С точки зрения решателей MINLP (Bonmin, Couenne), это может быть достигнуто путем переформулировки (и получающаяся в результате проблема дифференцируема, когда необходимые вспомогательные двоичные переменные были ослаблены). Вряд ли можно ожидать, что библиотека сделает это за вас.

Так что, похоже, вам нужно играть по правилам какой-то модели MINLP, как, например, описано Bonmin здесь . Понятия "ветвление на основе if" не существует.

Либо введите переменную-индикатор, как это принято в мире MIP, см. здесь . Игнорируя накладные расходы, идея будет выглядеть примерно так:

K_ = Ck(x1,x2,x3,x4)
I = K_ > 15 (binary variable; see link for formulation idea)

return x1**2+x2**2+x3**2+x4**2 - I*15 - (1-I) * K_

Это тогда MINLP .

Вы можете уйти, не используя дополнительную двоичную переменную (и не касаясь MINLP), интерпретируя ваше уравнение следующим образом:

return x1**2+x2**2+x3**2+x4**2 - min(Ck(x1,x2,x3,x4), 15)

Это также недифференцируемо, но может быть легко переформулировано (с причудой) как:

return x1**2+x2**2+x3**2+x4**2 - A

# extra constraints
A <= Ck(x1,x2,x3,x4)
A <= 15

, если бы мы могли заставить двигаться в направлении максимально возможного А . Это означает, что это должно быть частью цели:

m.Obj(Cr(x1,x2,x3,x4) + c * A) (if it's a maximization problem)

Это будет НЛП тогда, но значение c нуждается в некотором внимании ( быть достаточно большим).

0
ответ дан sascha 2 April 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: