在AMPL

时间:2018-12-31 15:01:11

标签: 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-,但不允许内联,而且必须定义一个单独的“虚拟”集更加难看。我尝试搜索AMPL书籍,但没有发现用于此特定目的的任何内容。

另一个选择更糟:

param a;
param b;
param c;

似乎没有任何特殊的语法/快捷方式很愚蠢。

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

那么,有什么好方法吗?

1 个答案:

答案 0 :(得分:1)

如果我正确理解,那么您在这里寻找的是一种为AMPL元组(在某些集合S上建立索引)输入值的方法,而不必在索引旁边包含索引名称(S的成员)。值-即要求从提供值的顺序推导每个值的索引。

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

鉴于AMPL确实支持有序集,我想有可能提供一种输入模式,该模式允许按位置隐含索引而不是明确声明。但是,我不知道这个存在。可能它根本不是优先事项,或者可能是提高代码健壮性的故意设计决策。

我怀疑与位置相关的输入对于AMPL打算解决的许多问题可能会更脆弱;他们肯定是我用过的。我经常想在索引集稍作更改的情况下重用相同的模型,在这种情况下,显式索引输入有助于防止将错误的值分配给错误的位置。