索引表达式中的AMPL连续变量

时间:2014-08-08 15:01:53

标签: cplex ampl

我解决了AMPL中的一个小问题,我遇到了一个小问题。我有4组 A B C D dimen 3 和1个变量 x { A,B}二进制 y {B,C}二进制

D 子集的元素全部来自 A

A 的每个元素必须从 B 中分配一个元素。 [此部分已完成]

B 的指定值中的每个元素必须从 C 中分配一个元素。 [这是问题]

出于这个原因,我必须定义一个新变量 map {A} ,它将 A 中的元素映射到 B (这意味着如果x [a,b] = 1,则映射[a] = b)。

我想写下这样的内容:y[ map[a],c]其中{a in A,c in C}表示 A B 中的映射b >但是cplex给了我错误 "continuous variable in index expression"

有没有这样做?提前致谢。感谢您的帮助。

进一步说明:

假设以下代码:

set A;
set B;
set C;
set D dimen 3; #elements are from A

var x{A,B} binary;
var y{B,C} binary;
var map{A};

forall{a in A} sum {b in B} x[a,b] = 1; #every element from A must have a mapping to B
forall{b in B} sum {c in C} y[b,c] <= 1; #for each element from B, there can be max of 1 mapping to C

subject to mapAtoB{a in A, b in B}: x[a,b] = 1 ==> map[a] = b;
subject to constr{ (i,j,k) in D, c in C }: y[ map[i],c ] + y[ map[j],c ] + y[ map[k],c] = 2; #here is the problem .. I want to be able to say map[i] which is supposed to be equal to some element in B which was assigned to A

data;
set A:= 1 2 3 4;
set B:= a b c;
set C:= i ii iii;
set D: 1 2 3:= (1,2,3) (1,2,4);

1 个答案:

答案 0 :(得分:1)

您正尝试使用变量索引变量。这更像是constraint programming的风格。您可以通过添加指示B的元素是否被赋予A元素的变量来执行您在AMPL和cplex中尝试的操作。

var active{B} binary;
forall {A in A} sum {b in B} x[a,b] = 1
forall {b in B, a in A} x[a,b] <= active[b]
forall {b in B} sum {c in C} y[b,c] = active[b]

因此,如果没有为b分配A的元素,则b无法获取 分配给C的元素。