You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:35:20