Чтобы решить эту проблему, я исследую проблему 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)
При использовании чисел с плавающей запятой отображается 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
Код: Выделить всё
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
PS: До этого метода я пробовал обходной путь, который использовал с scipy.optimize -> задавая целевую функцию как >>> def [...] return
Подробнее здесь: https://stackoverflow.com/questions/790 ... opt-solver