Pyomo读取AMPL格式.dat文件多维参数报错求助
Pyomo加载AMPL格式.dat文件多维参数失败的修复方案
问题分析
加载AMPL风格的.dat文件时,一维参数和表格格式的二维参数(如A1)可正常读取,但使用AMPL索引分组格式的二维参数(A2)和三维参数(B)报错,核心原因是Pyomo的DataPortal无法自动推断这类参数的索引结构,需要明确指定参数对应的索引集。
修复步骤
1. 显式声明参数索引集
在data.load()中通过param参数明确指定每个参数的索引顺序,帮助Pyomo正确解析AMPL的分组格式参数。
2. 修正三维参数B的索引定义
原代码中mod.B = Param(mod.I, mod.TJ)的索引方式有误,TJ作为二维集会导致索引结构不匹配,需改为直接使用I×T×J作为索引,并通过约束限制为有效组合。
修改后的完整代码
from pyomo.environ import * data = DataPortal() # 显式指定集合与参数的索引关系,避免自动推断错误 data.load( filename="lp_test.dat", set=( ('T', None), ('I', None), ('J', lambda data, t: data['T']), ('TJ', None) ), param=( ('V0', 'I'), ('VMAX', 'I'), ('QMAX', 'I'), ('RHO', 'I'), ('A1', ('I', 'T')), ('A2', ('I', 'T')), # 明确A2的索引顺序为I×T ('B', ('I', 'T', 'J')) # 匹配.dat文件中B的索引格式I×T×J ) ) mod = ConcreteModel() # 定义集合 mod.T = Set(initialize=data["T"]) mod.I = Set(initialize=data["I"]) mod.J = Set(mod.T, initialize=data["J"]) mod.TJ = Set(dimen=2, initialize=data["TJ"], within=mod.T * mod.J) # 定义参数 mod.V0 = Param(mod.I, initialize=data["V0"]) mod.VMAX = Param(mod.I, initialize=data["VMAX"]) mod.QMAX = Param(mod.I, initialize=data["QMAX"]) mod.RHO = Param(mod.I, initialize=data["RHO"]) mod.A_1 = Param(mod.I, mod.T, initialize=data["A1"]) mod.A_2 = Param(mod.I, mod.T, initialize=data["A2"]) # 调整B的索引定义,匹配.dat文件格式 mod.B = Param(mod.I, mod.T, mod.J, initialize=data["B"], within=mod.TJ)
关键说明
- 对于AMPL中
[i,*]这类分组格式的参数,必须在data.load()的param中明确索引顺序,否则Pyomo会错误解析索引结构。 - 三维参数B的索引顺序需与.dat文件中的格式完全匹配:
.dat中[*,t,j]对应I×T×J,因此代码中需按此顺序定义Param的索引。 - 原
.dat文件内容无需修改,保持AMPL格式即可。
内容的提问来源于stack exchange,提问作者CJ Lopez-Salgado
相关产品推荐
相关产品推荐

