使用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
相关产品推荐
相关产品推荐

