Как решить задачу Absolute Value abs () с помощью Python Gekko? - PullRequest
7 голосов
/ 31 октября 2019

Задача оптимизации с квадратом цели успешно решается с помощью 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) (пустая версия 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?

Ответы [ 2 ]

6 голосов
/ 31 октября 2019

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

5 голосов
/ 31 октября 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

...