2

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

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

我想把它用作类似的东西:

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

然而 AMPL 抱怨:

索引表达式中的变量

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

4

1 回答 1

3

AMPL 还不允许在下标中使用变量。但是,有一种方法可以模仿它们。例如,M1[a] >= 10可以模拟如下:

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

这不是很有效,但对于小问题应该可以正常工作。请注意,要解决包含上述约束(或添加后下标中的变量)的问题,需要约束编程求解器,例如ilogcpgecode。有关详细信息,请参阅逻辑和约束编程扩展

用于 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;

whereelement({i in 0..2} x[i], y)等价于x[y]并且被转换为一个IloElement约束。

于 2013-07-26T18:06:46.613 回答