Общий вид
Большинство объектов в AMPL могут быть определены в коллекциях, проиндексированных по набору. В алгебраической нотации использование множеств неофициально обозначается такими фразами, как for all i ∈ P или for t = 1 ,..., T, либо for all j ∈ R. Аналог этих выражений в AMPL - это выражение индексации. Диапазон возможных индексов указывается выражением индексации при объявлении объекта модели.
Выражение индексации (indexing) - это заключенный в фигурные скобки {} список выражений наборов sexpr-list разделенных запятыми, за которыми следует необязательные двоеточие (:) и логическое выражение lexpr.
Общий вид выражения индексации (indexing) представлен следующей схемой :
{sexpr - list}
{sexpr - list: lexpr} |
Где, sexpr – list может быть представлен в следующем виде:
sexpr – выражение набора: {B} или {A, B} dummy-member in sexpr – {i in A, b in B} sexpr-list, sexpr - список выражений индексации: {(i,j) in LINKS, b in B} lexpr - логическое выражение: i <= j |
Необязательный параметр: lexpr в выражении индексации выбирает только те элементы, которые удовлетворяют логическому выражению, и исключает остальные. Lexpr включает один или более фиктивных элементов выражения индексации. |
{B} - протейшее индексное выражение/выражение индексации/выражение набора; одномерный набор B
{A, B} # двухмерный набор, состоящий из элемементов набора A и элементов набора B
Фиктивный элемент
Каждому выражению набора {A, B} может предшествовать фиктивный элемент dummy-member и ключевое слово in.
{i in A, b in B}
Фиктивный элемент i, b или (i,j) - это несвязанное имя, то есть имя, которое в настоящее время не определено. Фиктивный элемент вводит в модель фиктивные индексы i, b и (i,j) чьи границы, либо область действия начинаются сразу после их объявления и действует до конца выражения индексации, либо до конца операнда оператора setof (i in setof {b in BUS_ID} BUS_I[b],..)
, который использует выражение индексации. Когда фиктивный элемент имеет несколько компонентов в своем выражении (i,j), фиктивные индексы в фиктивном элементе обозначают срез набора. Т.е. принимает все значения индексируемого набора(ов), для которых фиктивный элемент соответствуют индексируемому набору. Фактически, любое индексное выражение может определять фиктивный индекс, который выполняется по заданному этим выражением набору. Ниже представлены примеры выражений индексации поддерживаемых AMPL:
{A} # набор {A, B} или {i in A, j in B} или {i in A, B} # все пары элементов наборов А и В, первый элемент из набора A, второй из набора B {i in A, (j,k) in D} # все пары элементов одномерного набора А и двухмерного набора D. {i in A: p[i]>0} # все i (элементы набора) в A, для которых p[i] положительно {i in A, j in C[i]: i <= j} # все пары элементов наборов А и C[i], для которых j >= i (применяется для числовых индексов) {i in A, (i,j) in D: i <= j} # все пары элементов одномерного набора А и двумерного набора D # для которых значение элементов i <= j {i in A, C[i]}# все пары элементов наборов А и C[i], первый элемент из набора A, второй с индексируемого набора C[i]
Фиктивные индексы удобны при определении границ параметров. Они также необходимы для определения наборов, по которым определяются ограничения, и наборов, по которым производится суммирование.
Операторы редукции, такие как sum, prod, max, min(expr), используют выражения индексации для указания наборов, по которым выполняются операции.
Подстрочный индекс
Обращение к отдельным элементам набора осуществляется путем добавления к имени объекта модели подстрочного индекса.
Подстрочный индекс/выражение - это список символьных или числовых выражений, разделенных запятыми и заключенных в квадратные скобки. Например:
supply[i] или cost [j, p[k]+1, “O +”]
Каждое подстрочное выражение должно оцениваться как число или литерал. Результирующее значение или последовательность значений должны обозначать элемент соответствующего одномерного или многомерного набора индексации.
supply[i], cost[j, p[k]+1]
Необходимо помнить, что имя объекта модели, известно во всех последующих операторах модели. Фиктивный индекс действует только в рамках границ объявленного индексного выражения. Как только область действия индексного выражения заканчивается, его фиктивный индекс становится неопределенным. Таким образом, одно и то же имя индекса может быть определено снова и снова в модели. Фактически рекомендуется использовать относительно немного разных имен индекса. Общепринятое соглашение - связывать определенные имена индексов с определенными наборами, так что, например, индекс i в рамках всей модели индексирует NUTR, а индекс j всегда индексирует набор PROD. Это всего лишь соглашение, но не ограничение наложенное AMPL. За набором в индексном выражении может следовать двоеточие «:» с логическим условием. В этом случае индексное выражение представляет только подмножество элементов, которые удовлетворяют заданному условию.
{j in FOOD: f_max[j] - f_min[j] < 1}
Вышеизложенное выражение описывает набор всех PROD, минимальное и максимальное количество которых практически одинаковы. Следующее выражение описывает набор питательных веществ, которые находятся либо в MAXREQ, либо для которых n_min положительно:
Объявление набора на основании элементов набора NUTR таких что i in MAXREQ or n_min[i] > 0
set NUTREQ = {i in NUTR: i in MAXREQ or n_min[i] > 0};
Объявление набора на основании набора MAXREQ и элементов набора MINREQ таких, что i in MINREQ: n_min[i] > 0
set NUTREQ = MAXREQ union {i in MINREQ: n_min[i] > 0};
Объявление набора на основании элементов набора MAXREQ таких, что i in MINREQ: i in MAXREQ
set BOTHREQ = {i in MINREQ: i in MAXREQ};
Объявление набора на основании совпадающих элементов 2-х наборов MINREQ и MAXREQ
set BOTHREQ = MINREQ inter MAXREQ;
Отображение элементов набора FOOD для которых j in FOOD: Buy[j] > f_min[j]
display {j in FOOD: Buy[j] > f_min[j]};
Отображение элементов набора MINREQ для которых i in MINREQ: Diet_Min[i].slack = 0
display {i in MINREQ: Diet_Min[i].slack = 0};
Объявление набора на основании результатов решения, для которых i in MINREQ: (Diet_Min[i].slack) == 0
set {i in MINREQ: (Diet_Min[i].slack) == 0}:= C CAL; set MINREQ := A B1 B2 C CAL ; set MAXREQ := A NA CAL ; set FOOD := BEEF CHK FISH HAM MCH MTL SPG TUR ;
param: cost f_min f_max := BEEF 3.19 2 10 CHK 2.59 2 10 FISH 2.29 2 10 HAM 2.89 2 10 MCH 1.89 2 10 MTL 1.99 2 10 SPG 1.99 2 10 TUR 2.49 2 10 ; |
param: n_min n_max := A 700 20000 C 700 . B1 0 . B2 0 . NA . 50000 CAL 16000 24000 ; |
param amt (tr): A C B1 B2 NA CAL := BEEF 60 20 10 15 938 295 CHK 8 0 20 20 2180 770 FISH 8 10 15 10 945 440 HAM 40 40 35 10 278 430 MCH 15 35 15 15 1182 315 MTL 70 30 15 15 896 400 SPG 25 50 25 15 1329 370 TUR 60 20 15 10 1397 450 ;
Набор питательных веществ, которые находятся либо в MAXREQ, либо для которых n_min положительно
.slack обозначает разницу между текущим значением переменной с ее ближайшей границей.
Набор BOTHREQ, приведенный выше, вполне может быть пустым, в случае, когда каждое питательное вещество имеет минимальное либо максимальное требование, но не оба. Когда объект модели объявляется индексированным по набору, который оказывается пустым, AMPL просто пропускает генерацию этого компонента. Сумма по пустому множеству равна нулю, и другие итерационные операторы по пустым множествам имеют очевидный результат.
set PROD default{};
Выражение псевдоиндексации
subject to Time {if avail > 0}: sum{p in PROD} (1/rate[p]) * Make[p] <= avail;
Выражение псевдоиндексации {if avail > 0} приводит к тому, что генерируется одно ограничение с именем Time, если условие avail > 0 истинно, и вообще не генерируется никаких ограничений, если условие ложно. (Те же обозначения могут использоваться для условного определения других компонентов модели).
Операторы работы с наборами в индексном выражении
Операторы операций над наборами можно использовать непосредственно в индексном выражении:
var Trans {A union B, A union B} >= 0;
Ссылка на переменные и ограничения в условной фразе индексного выражения
Интерактивным командам AMPL разрешено ссылаться на переменные и ограничения в условной фразе индексного выражения, как показано в последних двух примерах выше. В пределах модели, однако, только наборы, параметры и фиктивные индексы могут быть упомянуты в любом выражении индексации. Индексные выражения полезны в операторах отображения display для обобщения характеристик данных или решения.