GEKKO+APOPT混合整数优化回调方法失效问题咨询
GEKKO混合整数优化迭代监控问题的根因与解决方法
根因分析
APOPT求解器处理混合整数规划(MIP)时,采用分支定界+外逼近类算法,和连续变量优化的SQP逐次迭代逻辑完全不同:
- 连续变量优化时,每一次迭代都是向最优解逐步逼近的过程,循环设置
MAX_ITER能抓到每一步的变量和目标值变化; - 混合整数优化时,求解器先求解松弛问题(去掉整数约束),再通过分支、剪枝生成大量候选节点,只有找到可行整数解或完成整个分支树搜索时,才会输出最终结果,中间过程的节点信息不会通过常规迭代变量暴露,导致你看到的都是初始值重复,最后才出结果。
另外,scipy的回调机制是针对自身求解器设计的,和GEKKO调用的APOPT求解器不兼容,直接套用无效。
解决方法
方法1:启用APOPT内置日志查看中间过程
通过调整GEKKO求解器参数,直接输出分支定界过程的详细日志:
from gekko import GEKKO m = GEKKO(remote=False) # 定义含整数约束的变量(HS71问题示例) x1 = m.Var(value=1, lb=1, ub=5, integer=True) x2 = m.Var(value=5, lb=1, ub=5) x3 = m.Var(value=5, lb=1, ub=5) x4 = m.Var(value=1, lb=1, ub=5) # 目标函数与约束 m.Obj(x1*x4*(x1+x2+x3)+x3) m.Equation(x1*x2*x3*x4>=25) m.Equation(x1**2+x2**2+x3**2+x4**2==40) # 配置APOPT求解器与日志 m.options.SOLVER = 1 # 指定APOPT求解器 m.options.IMODE = 3 # 稳态优化模式 m.options.DIAGLEVEL = 2 # 开启分支定界节点日志(级别2及以上) m.solve(disp=True)
运行后控制台会输出分支定界过程中每个节点的变量值、目标值、剪枝状态等信息,完整监控整数优化的中间过程。
方法2:自定义迭代监控逻辑
如果需要对中间候选整数解做自定义处理,可通过读取求解器本地日志实现:
- 开启GEKKO本地模式(
remote=False),求解器会在本地生成工作目录; - 循环调用
m.solve(disp=False),每次求解后读取工作目录下的apm_log.txt文件,解析其中的整数候选解信息; - 通过
m.solver_options = ['max_iter 100']控制分支定界的节点数,逐步推进求解过程。
注意事项
- 不要混用scipy的回调机制,GEKKO的求解器是独立的,不支持scipy的回调接口;
- 分支定界过程的中间节点不一定都是可行解,需通过日志中的约束满足情况判断有效性。
内容的提问来源于stack exchange,提问作者user27444871
相关产品推荐
相关产品推荐

