2013-07-26 8 views
2

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

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

, и я хотел бы использовать его как что-то вроде:

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

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

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

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

ответ

3

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

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

Это не очень эффективно, но должно работать нормально для небольших задач. Обратите внимание, что для решения проблемы, содержащей указанное выше ограничение (или переменные в индексах после их добавления), требуется решатель программирования ограничений, такой как ilogcp или gecode. См. LOGIC AND CONSTRAINT PROGRAMMING EXTENSIONS.

Новая версия драйвера для 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 ограничения.

+0

Вы сравниваете индекс с переменной, разрешено ли это? Я попробую это скоро, спасибо – HAL9000

+0

@ HAL9000 Да, это разрешено. Набор 'A' должен содержать номера, конечно. – vitaut

+0

Однако кажется, что единственное решение, которое работает с CPLEX, это переформулировать мой LP как MILP – HAL9000

Смежные вопросы