Работа в усилителе с наборами, содержащими одно и то же число разное время

Занимаюсь оптимизацией. Для этого некоторые параметры должны принимать разные значения. Я использую уменьшенную сетку Смоляка. У меня 9 реализаций. Я создал код, который включает в каждый набор значения, которые должен принимать параметр в каждой реализации. К сожалению, эти параметры принимают одинаковые значения в разных реализациях, что делает мой код бесполезным. Мне нужен способ заставить усилитель принимать указанные наборы.

В книге усилителя я не нашел ничего полезного в главах, посвященных наборам https://ampl.com/BOOK/CHAPTERS/08-sets1.pdf https://ampl.com/BOOK/CHAPTERS/09-sets2.pdf

Однако я нашел этот вопрос, Ошибка AMPL, повторяющийся номер для набора, в котором происходит нечто подобное. Однако, если я скопирую код, ошибка останется.

Здесь я определяю наборы, и возникает ошибка

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 и так далее.


person slow_learner    schedule 12.09.2019    source источник


Ответы (1)


Если нет какой-либо причины, по которой вам конкретно нужно, чтобы они были наборами, вам почти наверняка лучше обрабатывать их как индексированные параметры.

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;
}
person Geoffrey Brent    schedule 13.09.2019
comment
Большое спасибо за ваш ответ. То, что вы говорите, имеет смысл. Однако у меня возникает проблема, когда я пишу параметры как param Level = 9; param slM1 {1..Level}: = 45,4236, 45,3191, 45,5438, 45,4236, 45,4236, 45,4236, 45,4236, 45,4236, 45,4236; И так далее. Ошибка выглядит следующим образом: контекст синтаксической ошибки: param slM1 {1..Level}: = 45.4236 ››› 45.3191 ‹------------------------ 45.5438 45.4236 45.4236 45.4236 45.4236 45.4236 45.4236; Подскажите, пожалуйста, что я неправильно пишу? - person slow_learner; 16.09.2019
comment
@slow_learner Вам необходимо явно указать индекс для каждого значения. AMPL не принимает индекс с позиции здесь. См. раздел 9.2 Книги AMPL для правильного синтаксиса (который может немного отличается в зависимости от того, находитесь ли вы в режиме модели или данных). - person Geoffrey Brent; 17.09.2019