我想用MIP代替CP来制定灵活的车间调度问题。
如果有一个数组指示每个作业的操作数。
num_op = [3, 2, 5]
Xijk 是决定变量,指示是否在机器k上处理作业i的第j个操作。
我的问题是,我不知道如何用每个作业的不同操作次数来启动3-D阵列。
我写了这个dvar boolean x[i in Jobs][j in][k in Machs];
,但不知道如何完成。
请帮助我。谢谢!
答案 0 :(得分:1)
如果我正确理解了您的示例,那么您对num_op
的定义表明您有三个不同的作业,第一个作业具有3个操作,第二个作业具有2个操作,最后一个作业具有5个操作。这意味着Xijk
的第二维必须根据第一维进行更改。 CPLEX无法实现如此灵活的阵列大小。
这里是替代方法:
dvar boolean x[i in Jobs][j in 1..M][k in Machs];
forall (i in Jobs, j in 1..M, k in Machs) if (j > num_op[i]) X[i][j][k] == 0;
最后一步甚至是可选的:您可以为不存在的操作定义变量,但只是不在模型中的任何位置使用它们(不过,这可能会警告未使用的变量)。
另一种选择是创建一个元组tuple { int i; int j; int k }
,然后创建一个元组集,其中包含该元组集的所有i,j,k和索引X
的有效组合。