在AMPL中使用变量作为索引

时间:2013-07-26 13:51:38

标签: ampl

我需要使用变量来标识矩阵的值。我想要做的是定义一个变量,如:

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

我希望将其用作以下内容:

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

然而AMPL抱怨:

索引表达式中的

变量

使用变量,我可以指向数组或矩阵的元素吗? 感谢

1 个答案:

答案 0 :(得分:3)

AMPL尚未允许下标中的变量。但是有一种方法可以模仿它们。例如,可以按如下方式模拟M1[a] >= 10

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

这不是很有效,但应该适用于小问题。请注意,要解决包含上述约束的问题(或添加后的下标中的变量),需要约束编程解算器,例如ilogcpgecode。有关详细信息,请参阅LOGIC AND CONSTRAINT PROGRAMMING EXTENSIONS

AMPL的新版ilogcp驱动程序支持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约束。