Синтаксис Ampl: возвращает значение в определенной позиции в наборе. ИНАЧЕ: использовать набор как ИНДЕКС на другом наборе

У меня такой вопрос: как я могу использовать SUBSET (прерывистый набор) для ссылки на местоположение индекса в другом наборе, а не на фактическое значение? Я вижу, что ord () можно использовать для возврата позиции значения в наборе, но мне нужно обратное ...


моя причина в этом:

У меня есть модель, в которой некоторые из операторов набора и данных примерно:

set ALL_TIME := {0..20000};
param DATA {ALL_TIME};      #read from file in later data statement;
set myTIME := {0...1000};

Я перебираю набор myTIME и каждый раз решаю модель, а затем увеличиваю начало и конец на 1: {1..1001}, {2..1002}, {3..1003} и т. Д.

У меня есть еще один прерывистый набор, который читается из файла, который выглядит примерно так (да, ниже - плохой синтаксис, "...." просто означает, что шаблон продолжается до тех пор, пока он не достигнет 1000, поэтому мне не нужно набери все):

set SUBSET := {6,7,8,9,10, 16,17,18,19,20, 26,27.....} 

Как только myTIME увеличивается так, что больше не содержит "6", я получаю ошибку undefined в нижнем индексе из ограничения, которое, как я понимаю, связано с тем, что myTIME в этом случае равно {7..1007} ​​и, таким образом, в дальнейшем tSUB = 6 вызывает ALPHA [6] и не определено:

subject to CONSTRAINT {tSUB in SUBSET}:
     ALPHA [tSUB] = ALPHA[last(tSUB)]; 

Я хочу иметь возможность использовать SUBSET, чтобы всегда ссылаться на одно и то же место индекса ALPHA, DATA и т. Д. Итак:

SUBSET[0] (which equals 6) should always be the 6th value of for example DATA: 
{tSUB in SUBSET}: DATA[tSUB]. when tSUB is 0, I want the 6th value of DATA.

(Я новичок в Ampl, и мне трудно понять, как работают индексация и наборы - если что-то не имело смысла, спросите, и я постараюсь уточнить. Если вы думаете, что было бы более полезно увидеть мою реальный код, я постараюсь очистить данные компании и опубликовать их). Кроме того, некоторые из приведенных выше фрагментов кода имеют ужасный синтаксис. Они не скопированы из моего кода, просто приблизительны, чтобы попытаться объяснить мою проблему. :)


person BunnyKnitter    schedule 07.03.2016    source источник


Ответы (1)


Вы можете получить i-й член набора S с помощью member(i, S), где i - это индекс, отсчитываемый от 1, а S - упорядоченный набор. Это описано в разделе 5.6 Упорядоченные наборы книги AMPL.

person vitaut    schedule 08.03.2016