Как решить задачу Absolute Value abs () с помощью Python Gekko?

Задача оптимизации с квадратом цели успешно решается с помощью IPOPT в Python Gekko.

from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj((x-y)**2)
m.solve()
print(x.value[0],y.value[0])

Однако, когда я переключаюсь на цель по абсолютному значению np.abs(x-y) (numpy версия abs) или m.abs(x-y) (версия Gekko abs), решающая программа IPOPT сообщает о неудачном решении. Приближение абсолютного значения m.sqrt((x-y)**2) также не работает.

Неудачное решение

from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj(m.abs(x-y))
m.solve()
print(x.value[0],y.value[0])

Я понимаю, что решатели на основе градиента не любят функции без непрерывных первой и второй производных, поэтому я подозреваю, что это происходит с abs(), где 0 - точка, не имеющая непрерывных производных. Есть ли альтернатива abs() для надежного решения абсолютного значения с помощью решателей на основе градиента в Python Gekko?


person TexasEngineer    schedule 31.10.2019    source источник


Ответы (2)


Вместо этого вы можете использовать m.abs2, он учитывает проблему с производной и должен решить эту проблему.

person Andrew T    schedule 31.10.2019
comment
Спасибо! Это то, что я искал. - person TexasEngineer; 31.10.2019

Вот одно из возможных решений с использованием двоичной переменной-переключателя gekko:

from gekko import GEKKO
import numpy as np
m = GEKKO()
y = m.Param(3.2)
x = m.Var()
#intermediate
difference = m.Intermediate(x - y)

f = m.if3(difference, -difference, difference)

m.Obj(f)
m.solve()
print(x.value[0],y.value[0])

Возврат: 3,2 3,2

m.if3(condition, x1, x2) принимает значение как условие и возвращает x1, если condition >= 0, или x1, если condition < 0.

В разделе документации, посвященном логическим функциям, есть различные функции, позволяющие обойти эту проблему, включая m.abs2, m.abs3 и m.if2.

Функции типа 2 используют MPCC для решения и будут продолжать использовать IPOPT. Функции типа 3 автоматически изменятся на APOPT.

https://github.com/BYU-PRISM/GEKKO/blob/master/docs/model_methods.rst https://gekko.readthedocs.io/en/latest/model_methods.html#logical-functions

person a.markmartin    schedule 31.10.2019
comment
Это интересный подход с оператором if3. Спасибо за ссылки на документацию - они действительно помогают. Похоже, m.abs2 или m.abs3 - это то, что мне нужно. - person TexasEngineer; 31.10.2019