Дополнительное уравнение добавляет точку стационарности (например, 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. Решить без дополнительное уравнение, а затем добавьте его и решите снова.
- Используйте
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()