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

时间:2019-01-16 18:52:00

标签: optimization syntax ampl

我很难索引一个集合。 由于某些原因,我在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];

1 个答案:

答案 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。