Использовать переменную как индекс в AMPL

Мне нужно использовать переменную для определения значения матрицы. Я хотел определить такую ​​переменную, как:

var a in A; # to say that the variable takes value from index A

и я хотел использовать это как что-то вроде:

M1[a] >= 10;
M2[a] <= 100;

Однако AMPL жалуется:

переменная в выражении индекса

Что я могу указать на элемент массива или матрицы, используя переменную? Спасибо


person HAL9000    schedule 26.07.2013    source источник


Ответы (1)


AMPL пока не позволяет использовать переменные в индексах. Однако есть способ подражать им. Например, M1[a] >= 10 можно эмулировать следующим образом:

   s.t. c: exists{i in A} (M1[i] >= 10 and i = a);

Это не очень эффективно, но должно работать при небольших проблемах. Обратите внимание, что для решения проблемы, содержащей указанное выше ограничение (или переменные в нижних индексах после их добавления), требуется решатель программирования ограничений, например ilogcp или gecode. Подробнее см. ЛОГИКА И РАСШИРЕНИЕ ПРОГРАММИРОВАНИЯ ОГРАНИЧЕНИЙ.

Новая версия драйвера ilogcp для AMPL поддерживает ограничение element, например:

include cp.ampl;
var x{i in 0..2} >= i integer;
var y in 0..2 integer;
minimize o: element({i in 0..2} x[i], y);
option solver ilogcp;
solve;

где element({i in 0..2} x[i], y) эквивалентно x[y] и переводится в ограничение IloElement.

person vitaut    schedule 26.07.2013
comment
Вы сравниваете индекс с переменной, это разрешено? Я скоро попробую, спасибо - person HAL9000; 27.07.2013
comment
@ HAL9000 Да, это разрешено. Набор A, конечно же, должен содержать числа. - person vitaut; 27.07.2013
comment
Однако кажется, что единственное решение, работающее с CPLEX, - это переформулировать мой LP как MILP. - person HAL9000; 27.07.2013
comment
@ HAL9000 Да, чтобы использовать CPLEX, вам придется переформулировать вашу проблему. Однако вы можете использовать ILOG / IBM CP Solver. - person vitaut; 29.07.2013