Gekko中设置超10000次最大迭代及提取迭代终止最优解方法
MINLP迭代上限调整与中途最优解提取方案
针对二元变量规模最高900(30*30)、无求解时间限制、需避免迭代上限提前截断的MINLP求解场景,操作方案如下:
一、将max_iterations设置为10000以上的方法
MINLP求解不存在10000次迭代的硬上限,提前触发终止通常是因为只配置了单一层级的迭代阈值,没有同步覆盖外层分支定界、内层NLP子问题的双重迭代限制:
- 若使用GEKKO框架搭配APOPT求解器(MINLP场景下二元变量求解效率最优),直接在求解器选项中同步配置三层迭代阈值即可,可按需设置为任意大于10000的数值,示例代码如下:
from gekko import GEKKO m = GEKKO() # 指定APOPT为MINLP求解器 m.options.SOLVER = 1 # 同步设置三层迭代上限,避免被默认阈值(通常为1000-2000次)提前终止 m.solver_options = [ 'minlp_maximum_iterations 50000', # 外层MINLP分支定界迭代上限,可按需调整为10000以上任意值 'minlp_iteration_limit 50000', # MINLP内层节点迭代上限 'max_iter 50000' # 每个NLP子问题的求解迭代上限 ] # 模型构建逻辑省略 m.solve()
- 若使用BARON、Couenne等其他MINLP求解器,对应参数分别为
mipiterlim、max_iter,直接传入目标阈值即可,不存在10000次的数值硬限制。
二、达到迭代上限终止时提取已搜索最优解
求解器触发迭代上限终止时,默认不会返回求解成功状态码,但可以通过提前配置参数直接拿到终止时刻已搜索到的最优可行解(incumbent解):
- 提前在求解器选项中追加incumbent解返回开关,求解触发终止时会自动将当前最优解写入所有模型变量的
.value属性,和正常求解完成后的读取逻辑完全一致:
# 追加到solver_options列表即可 m.solver_options.append('minlp_return_incumbent_on_termination 1')
- 若未提前配置上述开关,可直接进入求解器生成的临时工作目录,找到APOPT求解器生成的
apopt_solution.txt日志文件,定位到最后一条标记为incumbent_objective的记录,对应的就是终止时刻已找到的最优可行解的目标值与变量取值,该日志不会因为求解异常终止被覆盖或清空。
无求解时间约束的场景下,可额外追加三个配置进一步提升解的最优性:
minlp_gap_tol 1e-6(将最优性Gap收敛阈值调至极小值)、minlp_branch_method 3(选用精度最高的分支策略)、minlp_integer_tol 1e-6(缩紧二元变量的整数判定阈值),不会触发额外的提前终止逻辑。
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

