我需要使用变量来识别矩阵的值。我想做的是定义一个变量,如:
var a in A; # to say that the variable takes value from index A
我想把它用作类似的东西:
M1[a] >= 10;
M2[a] <= 100;
然而 AMPL 抱怨:
索引表达式中的变量
我可以使用变量指向数组或矩阵的元素吗?谢谢
我需要使用变量来识别矩阵的值。我想做的是定义一个变量,如:
var a in A; # to say that the variable takes value from index A
我想把它用作类似的东西:
M1[a] >= 10;
M2[a] <= 100;
然而 AMPL 抱怨:
索引表达式中的变量
我可以使用变量指向数组或矩阵的元素吗?谢谢
AMPL 还不允许在下标中使用变量。但是,有一种方法可以模仿它们。例如,M1[a] >= 10
可以模拟如下:
s.t. c: exists{i in A} (M1[i] >= 10 and i = a);
这不是很有效,但对于小问题应该可以正常工作。请注意,要解决包含上述约束(或添加后下标中的变量)的问题,需要约束编程求解器,例如ilogcp或gecode。有关详细信息,请参阅逻辑和约束编程扩展。
用于 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
约束。