在 AMPL 中声明参数元组

Declaring a tuple of parameters in AMPL

有没有办法简化在 AMPL 中声明参数元组?例如,如果需要一个三维点作为参数,我正在做的是将其声明为

param Point {{'a', 'b', 'c'}};

然后通过 P['a']P['b']P['c'] 访问它。这样做的问题是,首先,它很丑。要在数据文件中指定点 (1, 2, 3),您必须编写

param Point := a 1  b 2  c 3;

。我尝试使用 ordered 关键字——即param Point {{'a', 'b', 'c'} ordered};——这样标签就被订单暗示了——即param Point := 1 2 3—,但这不允许内联,并且必须定义一个单独的 "dummy" 集甚至更难看。我尝试搜索 AMPL 书籍,但没有找到任何用于此特定目的的内容。

另一种选择更糟糕:

param a;
param b;
param c;

似乎很愚蠢,没有专门的syntax/shortcut。

另请注意,我不想声明集合;我想要一个固定长度(通过模型指定)的实际元组 参数,其条目将用作数字参数,而不是标签。

那么,有什么好的方法吗?

如果我没理解错的话,您在这里寻找的是一种为 AMPL 元组(在某些集合 S 上建立索引)输入值的方法,而不必包括索引的名称(S 的成员)与值一起 - 即要求每个值的索引是从提供值的顺序推导出来的。

我不知道执行此操作的简单方法。在 AMPL 中,索引数字参数(和变量)的工作方式类似于例如a Python dict():元素是按键(索引值)引用的,不是按位置引用的。因此,我见过的所有数据输入方法都需要在值旁边给出索引。

鉴于 AMPL 确实支持有序集,我认为可以提供一种输入模式,允许索引由位置暗示而不是明确说明。但是,我不知道这个存在。它可能根本不是优先事项,或者它可能是提高代码健壮性的深思熟虑的设计决策。

我怀疑位置相关的输入对于 AMPL 旨在处理的许多问题来说可能更加脆弱;它们肯定会用于我用过的那些。我经常想重复使用同一个模型,对索引集做一些小改动,在这种情况下,显式索引输入有助于防止将错误的值分配到错误的位置。