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