在 ampl 中多次使用包含相同数字的集合
Working in ampl with sets containing the same number various times
我正在做一个优化问题。为此,一些参数必须采用不同的值。我正在使用 Smolyak 简化网格。我有9个实现。我构建了一个代码,其中在每个集合中都包含参数在每个实现中必须采用的值。不幸的是,这些参数在各种实现中采用相同的值,因此使我的代码无用。我需要一种方法让 ampl 接受所述集合。
我没有在 ampl 的书的专门章节中找到任何有用的内容
https://ampl.com/BOOK/CHAPTERS/08-sets1.pdf
https://ampl.com/BOOK/CHAPTERS/09-sets2.pdf
但是我发现了这个问题,AMPL error, duplicate number for set,其中发生了类似的事情。但是,如果我复制代码,错误仍然存在。
这是我定义集合的地方,出现错误
param Level=9;
set slM1Set ordered := {45.4236, 45.3191, 45.5438,45.4236, 45.4236, 45.4236, 45.4236, 45.4236, 45.4236};
set slM2Set ordered := {3.8222, 3.8222, 3.8222, 3.8134, 3.8324, 3.8222, 3.8222, 3.8222, 3.8222};
set slP1Set ordered := {-37040,-37040,-37040,-37040,-37040,-47040,-27040, 37040,-37040};
set slP2Set ordered := {0, 0, 0, 0, 0, 0, 0, -577.350, 577.350};
param w_x;
param w_y;
param x1M;
param x2M;
这就是我使用它们的地方
for {a in 1..Level}
{
let w_x := member(a, slM1Set);
let w_y := member(a, slM2Set);
let x1M := member(a, slP1Set);
let x2M := member(a, slP2Set);
solve;
我需要知道我是否可以更改我的代码以按预期工作,这意味着循环将执行 9 次,第一次,变量 w_x 将从 slM1Set 中获取第一个值,w_y 来自 slM2Set,x1M 来自 slP1Set,x2M 来自 slP2Set,在第二次执行中,变量 w_x 将从 slM1Set 获取第二个值,w_y 来自 slM2Set,x1M 来自 slP1Set,x2M 来自 slP2Set 等等上。
除非出于某种原因特别需要将它们设置为集合,否则几乎可以肯定,将它们作为索引参数处理会更好。
param Level=9;
param slM1{1..Level} := ...
param slM2{1..Level} := ...
param slP1{1..Level} := ...
param slP2{1..Level} := ...
...
for {a in 1..Level}
{
let w_x := slM1[a];
let w_y := slM2[a];
let x1m := slP1[a];
let x2m := slP2[a];
solve;
}
我正在做一个优化问题。为此,一些参数必须采用不同的值。我正在使用 Smolyak 简化网格。我有9个实现。我构建了一个代码,其中在每个集合中都包含参数在每个实现中必须采用的值。不幸的是,这些参数在各种实现中采用相同的值,因此使我的代码无用。我需要一种方法让 ampl 接受所述集合。
我没有在 ampl 的书的专门章节中找到任何有用的内容 https://ampl.com/BOOK/CHAPTERS/08-sets1.pdf https://ampl.com/BOOK/CHAPTERS/09-sets2.pdf
但是我发现了这个问题,AMPL error, duplicate number for set,其中发生了类似的事情。但是,如果我复制代码,错误仍然存在。
这是我定义集合的地方,出现错误
param Level=9;
set slM1Set ordered := {45.4236, 45.3191, 45.5438,45.4236, 45.4236, 45.4236, 45.4236, 45.4236, 45.4236};
set slM2Set ordered := {3.8222, 3.8222, 3.8222, 3.8134, 3.8324, 3.8222, 3.8222, 3.8222, 3.8222};
set slP1Set ordered := {-37040,-37040,-37040,-37040,-37040,-47040,-27040, 37040,-37040};
set slP2Set ordered := {0, 0, 0, 0, 0, 0, 0, -577.350, 577.350};
param w_x;
param w_y;
param x1M;
param x2M;
这就是我使用它们的地方
for {a in 1..Level}
{
let w_x := member(a, slM1Set);
let w_y := member(a, slM2Set);
let x1M := member(a, slP1Set);
let x2M := member(a, slP2Set);
solve;
我需要知道我是否可以更改我的代码以按预期工作,这意味着循环将执行 9 次,第一次,变量 w_x 将从 slM1Set 中获取第一个值,w_y 来自 slM2Set,x1M 来自 slP1Set,x2M 来自 slP2Set,在第二次执行中,变量 w_x 将从 slM1Set 获取第二个值,w_y 来自 slM2Set,x1M 来自 slP1Set,x2M 来自 slP2Set 等等上。
除非出于某种原因特别需要将它们设置为集合,否则几乎可以肯定,将它们作为索引参数处理会更好。
param Level=9;
param slM1{1..Level} := ...
param slM2{1..Level} := ...
param slP1{1..Level} := ...
param slP2{1..Level} := ...
...
for {a in 1..Level}
{
let w_x := slM1[a];
let w_y := slM2[a];
let x1m := slP1[a];
let x2m := slP2[a];
solve;
}