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

使用GAMS作为Pyomo求解器时出现未解释错误的排查求助

问题:Pyomo调用GAMS求解NLP时触发IndexError

我正在学习用Python(Pyomo)结合GAMS求解非线性规划问题,在实现最小二乘法拟合y=a1+a2*x参数的过程中遇到错误。

代码示例

#Example1 Regression
import pyomo.environ as pyo

#Model definition
model_linear = pyo.ConcreteModel();

#Set declaration
model_linear.m = pyo.RangeSet(6);

#variable definition
model_linear.a1 = pyo.Var(domain=pyo.Reals);
model_linear.a2 = pyo.Var(domain=pyo.Reals);

#Parameter declaration
model_linear.datapoints_y = pyo.Param(model_linear.m,initialize={1:127,2:151,3:379,4:421,5:460,6:426});
model_linear.datapoints_x = pyo.Param(model_linear.m,initialize={1:-5,2:-3,3:-1,4:5,5:3,6:1});

#objective functions
model_linear.obj = pyo.Objective(expr=sum((model_linear.datapoints_y[m]-
                                (model_linear.a1+model_linear.a2*model_linear.datapoints_x[m]))**2
                                for m in model_linear.m),sense=pyo.minimize);

#Solver options
solver=pyo.SolverFactory('gams')
solver.options['mtype']= "nlp"
results = solver.solve(model_linear, solver = 'antigone');

results.write()
print("\n Results \n");
print("Squared deviation for linear regression model =",model_linear.obj());
print("Coefficient 1 for linear regression (a1) =", model_linear.a1());
print("Coefficient 2 for linear regression (a2) =", model_linear.a2());

报错信息

In [ ]:runfile('C:/Users/Murata/Documents/python work/GAMStest/NLPexam1a.py', wdir='C:/Users/Murata/Documents/python work/GAMStest')
Traceback (most recent call last):

 File "C:\Users\Murata\anaconda3\envs\ct-env\lib\site-packages\spyder_kernels\py3compat.py", line 356, in compat_exec
   exec(code, globals, locals)

 File "c:\users\murata\documents\python work\gamstest\nlpexam1a.py", line 32, in <module>
   results = solver.solve(model_linear, solver = 'antigone');

 File "C:\Users\Murata\anaconda3\envs\ct-env\lib\site-packages\pyomo\solvers\plugins\solvers\GAMS.py", line 853, in solve
   model_soln, stat_vars = self._parse_dat_results(

 File "C:\Users\Murata\anaconda3\envs\ct-env\lib\site-packages\pyomo\solvers\plugins\solvers\GAMS.py", line 1235, in _parse_dat_results
   model_soln[items[0]] = (items[1], items[2])

IndexError: list index out of range

环境配置:Windows 10 Pro、Python 3.10.8、Pyomo 6.4.2、GAMS 40.4.0

解决方案

这个错误是Pyomo解析GAMS输出的.dat文件时的格式兼容问题,可通过以下方式解决:

  • 调整求解器参数传递方式
    不要在solve()方法中直接指定solver='antigone',改用GAMS选项参数传递:

    solver = pyo.SolverFactory('gams')
    solver.options['solver'] = 'antigone'
    solver.options['mtype'] = 'nlp'
    results = solver.solve(model_linear)
    
  • 开启GAMS运行日志
    添加tee=True参数查看GAMS的详细执行日志,确认求解器是否正常运行:

    results = solver.solve(model_linear, tee=True)
    
  • 修复版本兼容性问题
    Pyomo 6.4.2与GAMS 40.4.0的组合存在已知的解析器兼容Bug,可选择:

    • 将Pyomo升级至6.5.0及以上版本
    • 或降级GAMS至39.x版本
  • 用默认求解器验证模型
    先切换到GAMS自带的CONOPT求解器测试模型是否正常:

    solver.options['solver'] = 'conopt'
    results = solver.solve(model_linear)
    
  • 清理临时文件
    Pyomo调用GAMS时会生成.gms、.dat、.lst等临时文件,若文件损坏可能导致解析错误,手动删除运行目录下的临时文件后重新执行代码。

内容的提问来源于stack exchange,提问作者Ryo Murata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:20:25