如何使用 * 符号以表格格式从 .dat 文件声明 3 维 Pyomo 变量?

问题描述 投票:0回答:0

我在 Pyomo 模型中有一个 3 维 Var。在 pyomo 声明下方:

#test.py

import pyomo.environ as pyo


model = pyo.AbstractModel()

model.REGION = pyo.Set(dimen=2)
model.EMISSION = pyo.Set(dimen=2)
model.YEAR= pyo.Set(dimen=2)

model.AnnualEmissionLimit = pyo.Param(
        model.REGION,
        model.EMISSION,
        model.YEAR,
        default=99999
    )

data = pyo.DataPortal(model=model)
data.load(filename='A.dat')

print(data.data())
print('===========')


instance = model.create_instance(data)
instance.pprint()
print('------------------------')

A.dat文件如下:

set REGION := UTOPIA;
set EMISSION := CO2 NOX;
set YEAR := 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028;

# AnnualEmissionLimit (REGION, EMISSION, YEAR)
param AnnualEmissionLimit default 150 :=
[UTOPIA,*,*]:
    2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050:=
CO2 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999  0
NOX 9999 9999 9999    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0  0
;

参数 AnnualEmissionLimit 的声明(在 A.dat 文件中)取自相同问题的对应部分,如 MathProg 上声明的那样。换句话说,在 MathProg 中它有效。

但是,在 pyomo 中,一旦我执行 test.py,我就会得到以下信息:

Traceback (most recent call last):
  File "/Users/themis/Desktop/OSeMOSYS/OSeMOSYS-Pyomo/test/test2.py", line 18, in <module>
    data.load(filename='A.dat')
  File "/Users/themis/miniconda3/envs/OSeMOSYS/lib/python3.11/site-packages/pyomo/dataportal/DataPortal.py", line 166, in load
    status = self._data_manager.process(self._model, self._data, self._default)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/themis/miniconda3/envs/OSeMOSYS/lib/python3.11/site-packages/pyomo/dataportal/plugins/datacommands.py", line 62, in process
    _process_include(['include', self.filename], model, data, default, self.options)
  File "/Users/themis/miniconda3/envs/OSeMOSYS/lib/python3.11/site-packages/pyomo/dataportal/process_data.py", line 602, in _process_include
    scenarios = parse_data_commands(filename=cmd[1])
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/themis/miniconda3/envs/OSeMOSYS/lib/python3.11/site-packages/pyomo/dataportal/parse_datacmds.py", line 563, in parse_data_commands
    dat_yaccer.parse(data, lexer=dat_lexer, debug=debug)
  File "/Users/themis/miniconda3/envs/OSeMOSYS/lib/python3.11/site-packages/ply/yacc.py", line 333, in parse
    return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/themis/miniconda3/envs/OSeMOSYS/lib/python3.11/site-packages/ply/yacc.py", line 1201, in parseopt_notrack
    tok = call_errorfunc(self.errorfunc, errtoken, self)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/themis/miniconda3/envs/OSeMOSYS/lib/python3.11/site-packages/ply/yacc.py", line 192, in call_errorfunc
    r = errorfunc(token)
        ^^^^^^^^^^^^^^^^
  File "/Users/themis/miniconda3/envs/OSeMOSYS/lib/python3.11/site-packages/pyomo/dataportal/parse_datacmds.py", line 452, in p_error
    raise IOError(tmp)
OSError: Syntax error at token 'COLON' with value ':' (line 7, column 13)

对于 pyomo 的情况,可能必须有其他方法来声明此变量。

我知道可以使用这样的东西:


param AnnualEmissionLimit default 150 :=
UTOPIA CO2 2019 9999
UTOPIA CO2 2019 9999
UTOPIA CO2 2019 9999
UTOPIA CO2 2019 9999
.....
.....

.....
UTOPIA NOX 2050  0
;

但是,我确实想保留最初的表格格式(列中的年份),因为我确实有很多其他 Varaibles,如果我遵循第二种格式,它们的声明会产生大量的、用户不友好的 .DAT 文件.请注意,出于多种原因,我无法在 pyomo 中更改模型的目标函数和约束条件。

如果我使用 pyomo,我是否可以将表格格式保留在 A.dat 文件中(列中的年份)?

提前谢谢你


我尝试了多种 A.dat 声明的变体,但我总是收到类似于上述的错误消息

pyomo
© www.soinside.com 2019 - 2024. All rights reserved.