我正在尝试使用 GEKKO 解决一个简单的混合整数优化问题,以评估它是否适合我的实际优化任务。由于我未来的问题将取决于每次迭代中遵守约束和整数条件,因此我需要针对 GEKKO 中的回调函数找到解决方法。到目前为止我尝试过的所有方法都不适用于混合整数优化。
为了解决这个问题,我正在检查 GEKKO 文档中的问题 HS71,并添加了整数规范。我发现使用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 <<< and printing the parameters in there. Apparently that didn't work either. 的解决方法
Gekko 将优化问题编译为字节码,然后交给优化器。 Gekko 中不允许回调,因为优化问题是独立的 APM 文件
gk0_model.apm
位于运行目录 m._path
中,可以使用 访问
m.open_folder()
解决此问题的一种方法是使用
debug=0
中的 m.solve(disp=False, debug=0)
检索未收敛的解,然后根据这些新更新的猜测值再次重新启动优化问题。当引入整数值时,如果问题由于分支定界算法而未收敛,则仅返回初始猜测。