Индексы переменных за пределами определенного диапазона в 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] вообще не должны учитываться в наших вычислениях (например, они не должны ограничивать другие переменные). Любая помощь приветствуется :) Спасибо.


person aspin    schedule 02.06.2015    source источник


Ответы (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.

Надеюсь, это поможет вам двигаться вперед.

person Ram Narasimhan    schedule 02.06.2015
comment
inner_i должен быть набором, а не параметром: set inner_i = 2..N-1; - person vitaut; 03.06.2015
comment
Да, спасибо, что поймал это. Я обновил ответ. - person Ram Narasimhan; 03.06.2015

Вы можете использовать выражение 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 — последний элемент набора.

person vitaut    schedule 03.06.2015