AMPL 优化函数中嵌套乘积和求和的语法

Syntax for nested products and sums in AMPL optimization function

我在为集合编制索引时遇到问题。 出于某种原因,sum {i in {1..n_paths}} P[i];.

总和中的方括号出现语法错误

我能够显示集合 {i in {1..n_paths}}P[1] 或任何其他合法的 i,但我没有以某种方式正确格式化求和表达式。

ampl: param n_paths;
ampl: set P {1..n_paths};
ampl: display sum {i in {1..n_paths}} P[i];

syntax error
context:  display sum {i in {1..n_paths}}  >>> P[ <<< i];

在您的示例中,P 是集合的索引集合,这意味着每个 P[i] 本身就是一个集合。例如:

reset;
param n_paths := 2;
set P{1..n_paths};

data;
set P[1] := 1 2 5;
set P[2] := 6 5 1;

这里,display P[1]; returns set P[1] := 1 2 3;.

如果我尝试计算 sum{i in 1..n_paths} P[i],我要求 AMPL 将集合 {1,2,3} 添加到集合 {6,5,1},并且 sum两组未定义。如果我想将 P[1]P[n_paths] 的所有成员相加,那么我需要一个双倍和:

display sum{i in 1..n_paths} sum{j in P[i]} j;
# caution: this will fail if we have non-numbers in our sets

这个 returns 20:P[1] 的 1+2+5 添加到 P[2] 的 6+5+1。

我也可以在求和之前合并集合:

display sum{j in union{i in 1..n_paths} P[i]} j;

因为 union 丢弃了重复的值,所以最终将 1、2、5 和 6 相加得到 14。