如果我在 AMPL 模型中有许多命名参数,以及一个包含列
ParamName
、ParamValue
的表(无论是在 Excel 电子表格中还是在 AMPL 的内置格式中),有没有一种很好的方法来读取这些值以便名称为 ParamName
的参数获得值 ParamValue
?
例如,如果我有一个名为
params.tab
的文件,其内容为
ampl.tab 1 1
ParamName ParamVal
n 9
max 100
min 0
有没有办法获得与加载包含
的数据文件相同的结果param n := 9;
param max := 100;
param min := 0;
?
特别是,我想要一种能够灵活地更改所涉及参数的方法,这意味着如果我向模型添加新参数,我只想将其添加为表中的新行,并且不必过多修改用于加载它的命令。
如果它简化了事情,那么可以安全地假设所有参数都具有相同的类型(例如整数)。
我可以想到两种方法,我将把它们写成自我回答,但我非常感谢任何更好的选择。
所以我首先想到的就是将表加载到索引数组中,然后将数组中的值赋给参数。
这看起来像:
set PARAMNAMES;
param ParamValues {PARAMNAMES};
table Params IN "params.tab":
PARAMNAMES <- [ParamNames], ParamValues;
read table Params;
let n := ParamValues[n];
let max := ParamValues[max];
let min := ParamValues[min];
这种方法的主要问题是需要有一个与模型参数和输入文件保持同步的
let
语句清单。
我想到的第二件事是取消模型本身中的各个参数,而是将它们存储在一个可以直接从上面的表中读取的数组中。所以在模型中我会有一个类似的声明
set PARAM_NAMES := { n max min };
param params {PARAM_NAMES};
在模型中执行查找并替换,将
n
更改为 params[n]
等,然后使用方法 1 中的 read table
语句从表中加载值。
我看到的主要缺点是: