GEKKO 混合整数优化回调函数与 APOPT 求解器

问题描述 投票:0回答:1

我正在尝试使用 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.

的解决方法
python mathematical-optimization gekko mixed-integer-programming
1个回答
0
投票

Gekko 将优化问题编译为字节码,然后交给优化器。 Gekko 中不允许回调,因为优化问题是独立的 APM 文件

gk0_model.apm
位于运行目录
m._path
中,可以使用

访问
m.open_folder()

解决此问题的一种方法是使用

debug=0
中的
m.solve(disp=False, debug=0)
检索未收敛的解,然后根据这些新更新的猜测值再次重新启动优化问题。当引入整数值时,如果问题由于分支定界算法而未收敛,则仅返回初始猜测。

© www.soinside.com 2019 - 2024. All rights reserved.