【问题标题】:Declaring a tuple of parameters in AMPL在 AMPL 中声明参数元组
【发布时间】:2018-12-31 15:01:10
【问题描述】:

有没有办法简化在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;

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

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

那么,有没有什么好办法呢?

【问题讨论】:

    标签: ampl


    【解决方案1】:

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

    我不知道有什么简单的方法可以做到这一点。在 AMPL 中,索引数字参数(和变量)的工作方式类似于例如a Python dict():元素由键(索引值)引用,而不是按位置。因此,我见过的所有数据输入方法都需要在值旁边提供索引。

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

    我怀疑位置相关的输入对于 AMPL 打算处理的许多问题可能更脆弱一些;他们肯定会为我用过的人准备的。通常我希望通过对索引集进行小的更改来重用相同的模型,在这种情况下,显式索引输入有助于防止将错误的值分配到错误的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2020-01-19
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多