Индексы переменных вне заданного диапазона в AMPL
Не слишком знаком с AMPL, но сталкиваюсь с некоторыми проблемами с индексами...
По сути, у меня есть некоторые переменные, определенные как таковые:
var array{i in set};
И мне нужно сделать некоторое количество проверки элементов вокруг данного i
в некоторых из ограничений:
subject to Constraint{i in set}:
array[i] + array[i-1] + array[i+1] <= 12;
Но очевидно array[0]
или же array[card(set) + 1]
не существует Чтобы добавить еще одну проблему, я пытаюсь смоделировать проблему, в которой array[0]
или же array[card(set) + 1]
просто не должно учитываться в наших вычислениях (например, оно не должно ограничивать другие переменные). Любая помощь приветствуется:) Спасибо.
2 ответа
В AMPL вы можете создавать или определять свои собственные "наборы" для допустимых индексов и использовать их в своих ограничениях.
Итак, в вашем случае, чтобы избежать недопустимых индексов, вы можете определить набор допустимых индексов: param inner_i {2..(N-1)}
и зациклить их при создании ограничений.
Цена, которую мы платим, заключается в том, что мы должны четко позаботиться о ключевых случаях.
Вот один из способов сделать это: (Обратите внимание, у меня не загружен AMPL, поэтому код не проверен.)
param N > 0; #number of elements
set ELEM; # Elements
set inner_i {2..(N-1)} > 0; #valid indices
var array {ELEM} >= 0;
subject to LimitSum{i in inner_i}:
array[i-1] + array[i] + array[i+1] <= 12;
#Take care of the boundary conditions explicitly, if needed
subject to LimitSum_start:
array[1] + array[2] <= 12;
#only two elements since array[0] doesn't exist.
subject to LimitSum_last:
array[N-1] + array[N] <= 12;
#only two elements since array[N+1] doesn't exist.
Надеюсь, это поможет вам двигаться вперед.
Вы можете использовать выражение if-then-else для условного включения некоторых терминов:
subject to Constraint{i in set}:
array[i] + (if i != 0 then array[i-1]) + (if i != N then array[i+1]) <= 12;
где N
это последний элемент набора.