我很难索引一个集合。
由于某些原因,我在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];
答案 0 :(得分:1)
在您的示例中,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];
返回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
这将返回20:{{1}中的1 + 2 + 5加到P[1]
中的6 + 5 + 1。
我也可以在求和之前合并集合:
P[2]
因为display sum{j in union{i in 1..n_paths} P[i]} j;
丢弃重复的值,所以最终将1、2、5和6相加得到14。