Функция обратного вызова смешанной целочисленной оптимизации GEKKO с решателем APOPTPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Функция обратного вызова смешанной целочисленной оптимизации GEKKO с решателем APOPT

Сообщение Anonymous »

Я пытаюсь решить простую задачу смешанно-целочисленной оптимизации с помощью GEKKO, чтобы оценить, подходит ли она для моей реальной задачи оптимизации. Поскольку мои будущие проблемы будут зависеть от соблюдения ограничений и целочисленных условий на каждой итерации, мне нужен обходной путь для функции обратного вызова в GEKKO. Все, что я пробовал до сих пор, не помогло для смешанно-целочисленной оптимизации.
Чтобы решить эту проблему, я исследую проблему HS71 из документации GEKKO с добавлением целочисленной спецификации. Я обнаружил, что при использовании кода из документации GEKKO необходимо установить решатель на APOPT, чтобы улучшить смешанно-целочисленную оптимизацию.
Кроме того, я ссылался на раздел «Получение значений переменных на каждой итерации оптимизации GEKKO», чтобы получить представление о том, как здесь можно импровизировать функцию обратного вызова.
При использовании только чисел с плавающей запятой следующий код работает нормально:

Код: Выделить всё

from gekko import GEKKO

max_iter=0
while True:

#Initialize Model
m = GEKKO(remote=False)
m.options.SOLVER=1 # 1=APOPT, 2=BPOPT, 3=IPOPT

#define parameter
eq = m.Param(value=40)

#initialize variables
x1 = m.Var(1, lb=1, ub=5, integer=False)
x2 = m.Var(5, lb=1, ub=5, integer=False)
x3 = m.Var(5, lb=1, ub=5, integer=False)
x4 = m.Var(1, lb=1, ub=5, integer=False)

#Equations
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==eq)

#Objective
m.Minimize(x1*x4*(x1+x2+x3)+x3)

#Set global options
m.options.MAX_ITER = max_iter
m.options.IMODE = 3 #steady state optimization

#Solve simulation
m.solve(disp=False, debug=0)
print(max_iter,x1.value, x2.value, x3.value, x4.value ,m.options.OBJFCNVAL)

if m.options.APPSTATUS==1:
break # break loop with successful solution
else:
max_iter += 1 # increment maximum iterations

#Results
print('')
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print(m.options.OBJFCNVAL)
Поскольку я не изучал программирование на Python, я придерживался более простого и понятного кодирования задачи.
При использовании чисел с плавающей запятой отображается 6 итераций, что соответствует отображению GEKKO. количество итераций. Также можно увидеть изменения в каждой итерации.

Код: Выделить всё

1 [1.0] [4.3960512908] [4.3243028722] [1.2928862199] 16.891614822
2 [1.0] [4.804484123] [3.8120497138] [1.3481405759] 16.776489179
3 [1.0] [4.7437502313] [3.8210281858] [1.3788731099] 17.009643947
4 [1.0] [4.7429972536] [3.8211532601] [1.3794077293] 17.014016403
5 [1.0] [4.743000147] [3.8211493182] [1.3794083853] 17.014017289
6 [1.0] [4.742999637] [3.8211499845] [1.3794082931] 17.014017289

Results
x1: [1.0]
x2: [4.742999637]
x3: [3.8211499845]
x4: [1.3794082931]
17.014017289
Как только я ограничиваю любую переменную целым числом, обратный вызов не работает. Я получаю 5 одинаковых строк, и в последней показаны оптимизированные значения (здесь x1 установлен как целое число):

Код: Выделить всё

1 [1.0] [5.0] [5.0] [1.0] 16.0
2 [1.0] [5.0] [5.0] [1.0] 16.0
3 [1.0] [5.0] [5.0] [1.0] 16.0
4 [1.0] [5.0] [5.0] [1.0] 16.0
5 [1.0] [5.0] [5.0] [1.0] 16.0
6 [1.0] [4.742999637] [3.8211499845] [1.3794082931] 17.014017289

Results
x1: [1.0]
x2: [4.742999637]
x3: [3.8211499845]
x4: [1.3794082931]
17.014017289
Я ожидаю вариаций в каждой строке и, возможно, также разного количества итераций. Я не понимаю основную причину этой неисправности, вероятно, потому, что у меня нет знаний о том, как GEKKO и APOPT работают внутри. Возможно, кто-нибудь из вас сможет мне помочь.
PS: До этого метода я пробовал обходной путь, который использовал с scipy.optimize -> задавая целевую функцию как >>> def [...] return

Подробнее здесь: https://stackoverflow.com/questions/790 ... opt-solver
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»