我需要使用变量来标识矩阵的值。我想要做的是定义一个变量,如:
var a in A; # to say that the variable takes value from index A
我希望将其用作以下内容:
M1[a] >= 10;
M2[a] <= 100;
然而AMPL抱怨:
索引表达式中的变量
使用变量,我可以指向数组或矩阵的元素吗? 感谢
答案 0 :(得分: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。
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
约束。