如何查看GEKKO求解应用成功状态?APPINFO与APPSTATUS解读疑问
问题分析与解决
对APPINFO和APPSTATUS的理解偏差
Gekko的APPINFO和APPSTATUS并非直接标识是否找到可行解,它们的实际作用是:
APPSTATUS=1:仅表示Gekko成功完成求解流程——只要求解器正常启动、运行并返回结果(哪怕结果是不可行),这个值就会保持1。APPINFO=0:是默认的“无应用级错误”状态,只有当Gekko内部出现模型构建错误、求解器调用失败等问题时,才会改变这个值。
当你的问题因约束冲突(比如total>20同时x<9、y<9,总和最大18)导致不可行时,求解器(IPOPT,对应SOLVER=3)会正常终止并返回不可行结论,但Gekko的流程本身没有出错,所以这两个参数不会变化。
正确判断可行解的方法
要准确判断是否找到可行解,需要查看求解器层面的状态参数SOLVESTATUS,结合目标函数值OBJFCNVAL辅助验证:
修改后的示例代码
from gekko import GEKKO m = GEKKO(remote=False) m.x = m.Var() m.y = m.Var() m.total = m.Intermediate(m.x + m.y) m.Equation(m.total > 20) # 该约束导致无可行解 m.Equation(m.x < 9) m.Equation(m.y < 9) m.Maximize(m.total) m.options.SOLVER = 3 try: m.solve(disp=False) # disp=True可查看求解器原始输出 except Exception as e: print('Exception:', e) # 输出关键状态参数 print('SOLVESTATUS:', m.options.SOLVESTATUS) print('APPSTATUS:', m.options.APPSTATUS) print('APPINFO:', m.options.APPINFO) print('目标函数值:', m.options.OBJFCNVAL) # 可行解判断逻辑 if m.options.SOLVESTATUS == 1: print("找到可行解:") print(f"x={m.x.value[0]}, y={m.y.value[0]}, total={m.total.value[0]}") else: print("未找到可行解或求解失败")
参数含义说明
SOLVESTATUS=1:求解器找到可行且最优的解;SOLVESTATUS=2:问题不可行(Infeasible);SOLVESTATUS=3:求解器迭代次数超限;OBJFCNVAL:不可行问题的目标函数值通常会是极大值(如1e20),可辅助确认。
原代码中参数不变的原因
当问题不可行时,IPOPT求解器正常输出了不可行结果,但Gekko的应用层没有发生错误——它成功调用了求解器并获取了返回信息,因此APPSTATUS保持1,APPINFO维持默认的0值。
内容的提问来源于stack exchange,提问作者JacquesStrydom
相关产品推荐
相关产品推荐

