有没有一种方法可以简化在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
-,但不允许内联,而且必须定义一个单独的“虚拟”集更加难看。我尝试搜索AMPL书籍,但没有发现用于此特定目的的任何内容。
另一个选择更糟:
param a;
param b;
param c;
似乎没有任何特殊的语法/快捷方式很愚蠢。
还要注意,我不想声明一个集合;我想要一个固定长度的实际元组 parameter (通过模型指定),其条目将用作数字参数,而不是标签。
那么,有什么好方法吗?
答案 0 :(得分:1)
如果我正确理解,那么您在这里寻找的是一种为AMPL元组(在某些集合S上建立索引)输入值的方法,而不必在索引旁边包含索引名称(S的成员)。值-即要求从提供值的顺序推导每个值的索引。
我不知道执行此操作的简单方法。在AMPL中,索引数字参数(和变量)的工作方式与例如Python dict()
:元素是通过键(索引值)而不是位置来引用的。因此,我见过的所有数据输入方法都需要在值旁边给出索引。
鉴于AMPL确实支持有序集,我想有可能提供一种输入模式,该模式允许按位置隐含索引而不是明确声明。但是,我不知道这个存在。可能它根本不是优先事项,或者可能是提高代码健壮性的故意设计决策。
我怀疑与位置相关的输入对于AMPL打算解决的许多问题可能会更脆弱;他们肯定是我用过的。我经常想在索引集稍作更改的情况下重用相同的模型,在这种情况下,显式索引输入有助于防止将错误的值分配给错误的位置。