Гекко неосуществимое решение с учетом затрат, которое должно быть удовлетворено - PullRequest
3 голосов
/ 24 апреля 2020

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

Model
Variables
    int_v1 = 0, >= 0
    int_v2 = 0, <= 1, >= 0
    v3 = 0
    v4 = 0
    v5 = 0
    v6 = 0
End Variables
Equations
    (0+int_v1)>=100
    v3=((3.15)*(int_v1))
    v4>=((int_v2)*(300))
    v5=(0+((int_v1)*(3.15)))
    minimize v6
End Equations
Connections
    v3 = sum_1.x[1]
    v4 = sum_1.y
    v5 = sum_2.x[1]
    v6 = sum_2.y
End Connections
Objects
    sum_1 = sum(1)
    sum_2 = sum(1)
End Objects
End Model

Решение этой проблемы в http://apmonitor.com/online/view_pass.php даст решение, в котором int_v2 = 1. Но если я добавлю следующее уравнение после v4 к задаче , он говорит, что решение не найдено:

(((1-int_v2))*(v4))=0

Я посмотрел в файл неиспользуемых возможностей, но облако не gr asp проблема. Поскольку приведенное выше решение дает int_v2 = 1, тогда это уравнение должно всегда выполняться с 0 = 0. Оцените любые указания.

1 Ответ

3 голосов
/ 24 апреля 2020

Дополнительное уравнение добавляет точку стационарности (например, x * y = 0), которую сложно решить. Для вашей проблемы оптимизации, решатели APOPT и IPOPT оба неверно сообщают, что проблема невозможна. Однако решатель BPOPT может решить проблему НЛП, но не обязательно с помощью целочисленного решения. Вы разместили файл APM из вашей проблемы Gekko. Вот ваша проблема в Gekko (без дополнительного уравнения):

from gekko import GEKKO

m = GEKKO(remote=False)
v1 = m.Var(0,lb=0,integer=True)
v2 = m.Var(0,lb=0,ub=1,integer=True)
v3 = m.Var(0); v5 = m.Var(0)
v4 = m.sum([v3]); v6 = m.sum([v5])

m.Equation(v1>=100)
m.Equation(v3==3.15*v1)
m.Equation(v4>=v2*300)
m.Equation(v5==v1*3.15)
m.Minimize(v6)

Вот два подхода: 1. Инициализировать с помощью BPOPT, а затем переключиться на APOPT для целочисленного решения и 2. Решить без дополнительное уравнение, а затем добавьте его и решите снова.

  1. Используйте BPOPT для инициализации с помощью NLP, решите MINLP с помощью APOPT
from gekko import GEKKO

m = GEKKO(remote=False)
v1 = m.Var(0,lb=0,integer=True)
v2 = m.Var(0,lb=0,ub=1,integer=True)
v3 = m.Var(0); v5 = m.Var(0)
v4 = m.sum([v3]); v6 = m.sum([v5])

m.Equation(v1>=100)
m.Equation(v3==3.15*v1)
m.Equation(v4>=v2*300)
m.Equation(v5==v1*3.15)
m.Minimize(v6)

m.Equation((1-v2)*v4==0)

m.options.SOLVER=2 # solve with BPOPT
m.solve()

m.options.SOLVER=1 # solve with APOPT
m.solve()
Инициализация без уравнения
from gekko import GEKKO

m = GEKKO(remote=False)
v1 = m.Var(0,lb=0,integer=True)
v2 = m.Var(0,lb=0,ub=1,integer=True)
v3 = m.Var(0); v5 = m.Var(0)
v4 = m.sum([v3]); v6 = m.sum([v5])

m.Equation(v1>=100)
m.Equation(v3==3.15*v1)
m.Equation(v4>=v2*300)
m.Equation(v5==v1*3.15)
m.Minimize(v6)

# solve without equation
m.options.SOLVER=1
m.solve()

# add infeasible equation and solve
m.Equation((1-v2)*v4==0)
m.solve()

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

# open folder to view apm file
#   or optionally the infeasibilities.txt file
m.open_folder()
...